Exemple #1
0
        public void PetInteraction(GiveAction action)
        {
            switch (action)
            {
            case GiveAction.Feed:
                notHungryEmotionLevel = 100;
                break;

            case GiveAction.Love:
                happyEmotionLevel = 100;
                break;

            case GiveAction.Medicine:
                healthyEmotionLevel = 100;
                break;

            case GiveAction.Play:
                notBoredEmotionLevel = 100;
                break;

            case GiveAction.NoAction:
                noEmotionLevel = 0;
                break;
            }
        }
Exemple #2
0
        public static void OpenModeDataChanges()
        {
            PlayerData.instance.Reset();

            PlayerData.instance.hasCharm = true;

            if (RandomizerMod.Instance.Settings.FreeLantern)
            {
                PlayerData.instance.hasLantern = true;
            }

            if (RandomizerMod.Instance.Settings.EarlyGeo)
            {
                PlayerData.instance.AddGeo(300);
            }

            Ref.PD.unchainedHollowKnight     = true;
            Ref.PD.encounteredMimicSpider    = true;
            Ref.PD.infectedKnightEncountered = true;
            Ref.PD.mageLordEncountered       = true;
            Ref.PD.mageLordEncountered_2     = true;

            List <string> startItems = RandomizerMod.Instance.Settings.ItemPlacements.Where(pair => pair.Item2.StartsWith("Equip")).Select(pair => pair.Item1).ToList();

            foreach (string item in startItems)
            {
                GiveAction action = LogicManager.GetItemDef(item).action;
                if (action == GiveAction.Charm)
                {
                    action = GiveAction.EquippedCharm;
                }
                else if (action == GiveAction.SpawnGeo)
                {
                    action = GiveAction.AddGeo;
                }

                GiveItem(action, item, "Equipped");
            }

            for (int i = 1; i < 5; i++)
            {
                if (PlayerData.instance.charmSlotsFilled > PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.charmSlots++;
                    PlayerData.instance.SetBool("salubraNotch" + i, true);
                }
                if (PlayerData.instance.charmSlotsFilled <= PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.overcharmed = false;
                    break;
                }
            }

            PlayerData.instance.respawnScene      = start.sceneName;
            PlayerData.instance.respawnMarkerName = RESPAWN_MARKER_NAME;
            PlayerData.instance.respawnType       = 0;
            PlayerData.instance.mapZone           = start.zone;
        }
Exemple #3
0
 public ChangeShinyIntoItem(string sceneName, string objectName, string fsmName, GiveAction action, string item, string location, string nameKey, string spriteName)
 {
     _sceneName  = sceneName;
     _objectName = objectName;
     _fsmName    = fsmName;
     _action     = action;
     _item       = item;
     _location   = location;
     _nameKey    = nameKey;
     _spriteName = spriteName;
 }
Exemple #4
0
        private static bool TryExternHandleItem(GiveAction action, string item, string location, int geo)
        {
            foreach (var externItemHandler in ExternItemHandlers)
            {
                if (externItemHandler(action, item, location, geo))
                {
                    return(true);
                }
            }

            return(false);
        }
        public void CanGive_FoodNotOwned_ReturnFalse()
        {
            //Setup
            var subject = new BUnit();
            var action  = new GiveAction(Guid.NewGuid(), Guid.NewGuid());

            //Act
            var canAct = subject.CanAttemptAction(action);

            //Assert
            Assert.False(canAct);
        }
Exemple #6
0
        // BigItemDef array is meant to be for additive items
        // For example, items[0] could be vengeful spirit and items[1] would be shade soul
        public ChangeShinyIntoBigItem(string sceneName, string objectName, string fsmName, BigItemDef[] items, GiveAction action,
                                      string item, string location)
        {
            _sceneName  = sceneName;
            _objectName = objectName;
            _fsmName    = fsmName;

            _itemDefs = items;

            _action   = action;
            _item     = item;
            _location = location;
        }
 public ChangeCorniferReward(string sceneName, string objectName, string fsmName, GiveAction action, string item, string location)
 {
     _sceneName  = sceneName;
     _objectName = objectName;
     _fsmName    = fsmName;
     // GiveItem doesn't support spawning geo, and also there's no shiny to spawn it from anyway.
     if (action == GiveAction.SpawnGeo)
     {
         action = GiveAction.AddGeo;
     }
     _action   = action;
     _item     = item;
     _location = location;
 }
        public void CanGive_FoodOwned_ReturnTrue()
        {
            //Setup
            var subject  = new BUnit(50);
            var quantity = new Random().Next(1, 50);
            var food     = new Food(quantity, Food.FoodQuality.FAIR);
            var action   = new GiveAction(food.Id, Guid.NewGuid());

            subject.Take(food);

            //Act
            var canAct = subject.CanAttemptAction(action);

            //Assert
            Assert.True(canAct);
        }
Exemple #9
0
        public void GiveAway_ValidObjectAndRecepient_OwnerChanged()
        {
            //Setup
            var first    = CreateUnit();
            var dropper  = first.As <IDropper>();
            var second   = CreateUnit();
            var receiver = second.As <IReceiver>();
            var state    = CreateStateMock(CreateUnitList(first, second));

            AddUnitToState(first, state);
            AddUnitToState(second, state);
            var subject = new ActionExecutor(state.Object);

            var transferObject = new Mock <WorldObject>();
            var transferable   = transferObject.As <ITransferable>();

            transferable.Setup(tr => tr.Owner).Returns(first.Object.Id);
            var transferGuid = Guid.NewGuid();
            var action       = new GiveAction(transferGuid, second.Object.Id);

            dropper.Setup(d => d.Drop(transferable.Object)).Returns(true);
            receiver.Setup(t => t.Receive(transferable.Object)).Returns(true);

            state.Setup(s => s.FindObject(transferGuid)).Returns(transferObject.Object);

            UnitActionCollection actions = new UnitActionCollection();

            actions.AddAction(first.Object.Id, action);

            //Act
            subject.Execute(actions);

            //Assert
            //Dropper dropped, reciever received, and transfer object knows its new owner
            dropper.Verify(d => d.Drop(transferable.Object));
            receiver.Verify(r => r.Receive(transferable.Object));
            transferable.Verify(t => t.Drop());
            transferable.Verify(t => t.TransferTo(second.Object.Id));
        }
Exemple #10
0
        public void GiveAway_InvalidObject_FailAction()
        {
            //Setup
            var first   = CreateUnit();
            var dropper = first.As <IDropper>();
            var second  = CreateUnit();
            var state   = CreateStateMock(CreateUnitList(first, second));

            AddUnitToState(first, state);
            AddUnitToState(second, state);
            var transferGuid = Guid.NewGuid();
            var action       = new GiveAction(transferGuid, second.Object.Id);

            var subject = new ActionExecutor(state.Object);

            UnitActionCollection actions = new UnitActionCollection();

            actions.AddAction(first.Object.Id, action);

            //Assertion
            Assert.Throws <BadActionException>(() => subject.Execute(actions));
        }
        public static void StartDataChanges()
        {
            PlayerData.instance.Reset();

            PlayerData.instance.hasCharm = true;

            /*
             * if (RandomizerMod.Instance.Settings.FreeLantern)
             * {
             *  PlayerData.instance.hasLantern = true;
             * }
             */

            if (RandomizerMod.Instance.Settings.EarlyGeo)
            {
                // added version checking to the early geo randomization
                int geoSeed = RandomizerMod.Instance.Settings.Seed;
                unchecked
                {
                    geoSeed = geoSeed * 17 + 31 * RandomizerMod.Instance.MakeAssemblyHash();
                }

                // added settings checking to early geo randomization
                int settingsSeed = 0;
                if (RandomizerMod.Instance.Settings.RandomizeDreamers)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeSkills)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeCharms)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeKeys)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeGeoChests)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeMaskShards)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeVesselFragments)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeCharmNotches)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizePaleOre)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeRancidEggs)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeRelics)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeMaps)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeStags)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeGrubs)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeWhisperingRoots)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeRocks)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeSoulTotems)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizePalaceTotems)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeLoreTablets)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeLifebloodCocoons)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeGrimmkinFlames)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.DuplicateMajorItems)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.ShadeSkips)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.AcidSkips)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.SpikeTunnels)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.MildSkips)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.SpicySkips)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.FireballSkips)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;
                if (RandomizerMod.Instance.Settings.DarkRooms)
                {
                    settingsSeed += 1;
                }
                settingsSeed = settingsSeed << 1;

                Random rand     = new Random(geoSeed + settingsSeed);
                int    startgeo = rand.Next(300, 600);
                PlayerData.instance.AddGeo(startgeo);
            }

            Ref.PD.unchainedHollowKnight     = true;
            Ref.PD.encounteredMimicSpider    = true;
            Ref.PD.infectedKnightEncountered = true;
            Ref.PD.mageLordEncountered       = true;
            Ref.PD.mageLordEncountered_2     = true;

            List <string> startItems = RandomizerMod.Instance.Settings.ItemPlacements.Where(pair => pair.Item2.StartsWith("Equip")).Select(pair => pair.Item1).ToList();

            foreach (string item in startItems)
            {
                GiveAction action = LogicManager.GetItemDef(item).action;
                if (action == GiveAction.Charm)
                {
                    action = GiveAction.EquippedCharm;
                }
                else if (action == GiveAction.SpawnGeo)
                {
                    action = GiveAction.AddGeo;
                }

                GiveItem(action, item, "Equipped");
            }

            for (int i = 1; i < 5; i++)
            {
                if (PlayerData.instance.charmSlotsFilled > PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.charmSlots++;
                    PlayerData.instance.SetBool("salubraNotch" + i, true);
                }
                if (PlayerData.instance.charmSlotsFilled <= PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.overcharmed = false;
                    break;
                }
            }

            PlayerData.instance.respawnScene      = start.sceneName;
            PlayerData.instance.respawnMarkerName = RESPAWN_MARKER_NAME;
            PlayerData.instance.respawnType       = 0;
            PlayerData.instance.mapZone           = start.zone;
        }
Exemple #12
0
        public static void StartDataChanges()
        {
            PlayerData.instance.Reset();

            PlayerData.instance.hasCharm = true;

            /*
             * if (RandomizerMod.Instance.Settings.FreeLantern)
             * {
             *  PlayerData.instance.hasLantern = true;
             * }
             */

            if (RandomizerMod.Instance.Settings.EarlyGeo)
            {
                // added version checking to the early geo randomization
                int geoSeed = RandomizerMod.Instance.Settings.Seed;
                unchecked
                {
                    geoSeed = geoSeed * 17 + 31 * RandomizerMod.Instance.MakeAssemblyHash();
                }

                // added settings checking to early geo randomization
                // split away difficulty settings etc from randomization settings so we have a bit more room
                int randomizationSettingsSeed = 0;
                if (RandomizerMod.Instance.Settings.RandomizeDreamers)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeSkills)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeCharms)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeKeys)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeGeoChests)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeMaskShards)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeVesselFragments)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeCharmNotches)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizePaleOre)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeRancidEggs)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeRelics)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeMaps)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeStags)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeGrubs)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeWhisperingRoots)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeRocks)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeSoulTotems)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeLoreTablets)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeLifebloodCocoons)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeGrimmkinFlames)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeBossEssence)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeBossGeo)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.EggShop)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeJunkPitChests)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeJournalEntries)
                {
                    randomizationSettingsSeed += 1;
                }
                randomizationSettingsSeed = randomizationSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizePalaceTotems ||
                    RandomizerMod.Instance.Settings.RandomizePalaceTablets ||
                    RandomizerMod.Instance.Settings.RandomizePalaceEntries)
                {
                    randomizationSettingsSeed += 1;
                }

                int miscSettingsSeed = 0;
                if (RandomizerMod.Instance.Settings.DuplicateMajorItems)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.ShadeSkips)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.AcidSkips)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.SpikeTunnels)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.MildSkips)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.SpicySkips)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.FireballSkips)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.DarkRooms)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed = miscSettingsSeed << 1;
                if (RandomizerMod.Instance.Settings.RandomizeClawPieces)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeCloakPieces)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.CursedNail)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeRooms)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeAreas || RandomizerMod.Instance.Settings.ConnectAreas)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.CursedMasks)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.CursedNotches)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeSwim)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.RandomizeNotchCosts)
                {
                    miscSettingsSeed += 1;
                }
                miscSettingsSeed <<= 1;
                if (RandomizerMod.Instance.Settings.ElevatorPass)
                {
                    miscSettingsSeed += 1;
                }

                int settingsSeed = 0;
                unchecked
                {
                    settingsSeed = 59 * randomizationSettingsSeed + 97 * miscSettingsSeed;
                }

                Random rand     = new Random(geoSeed + settingsSeed);
                int    startgeo = rand.Next(300, 600);
                PlayerData.instance.AddGeo(startgeo);
            }

            Ref.PD.unchainedHollowKnight     = true;
            Ref.PD.encounteredMimicSpider    = true;
            Ref.PD.infectedKnightEncountered = true;
            Ref.PD.mageLordEncountered       = true;
            Ref.PD.mageLordEncountered_2     = true;
            Ref.PD.godseekerUnlocked         = true;

            if (RandomizerMod.Instance.Settings.EggShop)
            {
                Ref.PD.jijiMet = true;
            }
            if (RandomizerMod.Instance.Settings.ElevatorPass)
            {
                Ref.PD.SetBool(nameof(PlayerData.cityLift2), false);
            }

            List <string> startItems = RandomizerMod.Instance.Settings.ItemPlacements.Where(pair => pair.Item2.StartsWith("Equip")).Select(pair => pair.Item1).ToList();

            foreach (string item in startItems)
            {
                GiveAction action = LogicManager.GetItemDef(item).action;
                if (action == GiveAction.Charm)
                {
                    action = GiveAction.EquippedCharm;
                }
                else if (action == GiveAction.SpawnGeo)
                {
                    action = GiveAction.AddGeo;
                }

                GiveItem(action, item, "Equipped");
            }

            if (RandomizerMod.Instance.Settings.CursedNotches)
            {
                PlayerData.instance.charmSlots = 1;
            }

            if (RandomizerMod.Instance.Settings.CursedMasks)
            {
                PlayerData.instance.maxHealth     = 1;
                PlayerData.instance.maxHealthBase = 1;
            }

            if (RandomizerMod.Instance.Settings.RandomizeNotchCosts)
            {
                Random rng      = new Random(RandomizerMod.Instance.Settings.Seed + 1111);
                int[]  costs    = new int[40];
                int    minTotal = 60;
                int    maxTotal = 120;

                for (int total = rng.Next(minTotal, maxTotal); total > 0; total--)
                {
                    int i = rng.Next(40);
                    while (costs[i] >= 6)
                    {
                        i = rng.Next(40);
                    }
                    costs[i]++;
                }

                // clamp dashmaster/sprintmaster for logic purposes
                if (!RandomizerMod.Instance.Settings.CursedNotches && costs[30] > 2 && costs[36] > 2)
                {
                    int d;
                    if (rng.Next(2) == 0)
                    {
                        d = 30;
                    }
                    else
                    {
                        d = 36;
                    }

                    while (costs[d] > 2)
                    {
                        int e = rng.Next(40);
                        while (costs[e] >= 6)
                        {
                            e = rng.Next(40);
                        }
                        costs[d]--;
                        costs[e]++;
                    }
                }

                StringBuilder sb = new StringBuilder();
                sb.AppendLine();
                sb.AppendLine("Randomized Notch Costs");
                Dictionary <int, string> charmNums = LogicManager.ItemNames.Select(i => (i, LogicManager.GetItemDef(i)))
                                                     .Where(p => p.Item2.pool == "Charm" && IsValidCharmNum(p.Item2.charmNum))
                                                     .ToDictionary(p => p.Item2.charmNum, p => p.i);
                charmNums[36] = "Kingsoul";
                charmNums[40] = "Grimmchild";

                int count = 0;
                for (int i = 0; i < 40; i++)
                {
                    count += costs[i];
                    PlayerData.instance.SetInt($"charmCost_{i + 1}", costs[i]);
                    if (charmNums.TryGetValue(i + 1, out string name))
                    {
                        sb.AppendLine($"{name}: {costs[i]}".Replace('_', ' '));
                    }
                    else
                    {
                        sb.AppendLine($"Unknown charm with id {i + 1}: {costs[i]}");
                    }
                }
                sb.AppendLine($"Total: {count}, within the allowed range of [{minTotal}, {maxTotal}].");
                sb.AppendLine($"This is {Mathf.Round(count / 90f * 100)}% of the vanilla total.");
                RandoLogger.LogSpoiler(sb.ToString());
            }

            PlayerData.instance.CalculateNotchesUsed();

            for (int i = 1; i < 5; i++)
            {
                if (PlayerData.instance.charmSlotsFilled > PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.charmSlots++;
                    PlayerData.instance.SetBool("salubraNotch" + i, true);
                }
                if (PlayerData.instance.charmSlotsFilled <= PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.overcharmed = false;
                    break;
                }
            }

            PlayerData.instance.respawnScene      = start.sceneName;
            PlayerData.instance.respawnMarkerName = RESPAWN_MARKER_NAME;
            PlayerData.instance.respawnType       = 0;
            PlayerData.instance.mapZone           = start.zone;
        }
Exemple #13
0
        public static void GiveItem(GiveAction action, string item, string location, int geo = 0)
        {
            if (TryExternHandleItem(action, item, location, geo))
            {
                return;
            }

            LogItemToTracker(item, location);
            RandomizerMod.Instance.Settings.MarkItemFound(item);
            RandomizerMod.Instance.Settings.MarkLocationFound(location);
            UpdateHelperLog();

            item = LogicManager.RemoveDuplicateSuffix(item);

            if (RandomizerMod.Instance._globalSettings.RecentItems)
            {
                RecentItems.AddItem(item, location);
            }

            switch (action)
            {
            default:
            case GiveAction.Bool:
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                break;

            case GiveAction.Int:
            {
                string intName = LogicManager.GetItemDef(item).intName;
            }
                PlayerData.instance.IncrementInt(LogicManager.GetItemDef(item).intName);
                if (LogicManager.GetItemDef(item).intName == nameof(PlayerData.instance.flamesCollected))
                {
                    RandomizerMod.Instance.Settings.TotalFlamesCollected += 1;
                }
                break;

            case GiveAction.Charm:
                PlayerData.instance.hasCharm = true;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                PlayerData.instance.charmsOwned++;
                break;

            case GiveAction.EquippedCharm:
                PlayerData.instance.hasCharm = true;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                PlayerData.instance.charmsOwned++;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).equipBoolName, true);
                PlayerData.instance.EquipCharm(LogicManager.GetItemDef(item).charmNum);

                PlayerData.instance.CalculateNotchesUsed();
                if (PlayerData.instance.charmSlotsFilled > PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.overcharmed = true;
                }
                break;

            case GiveAction.Additive:
                string[] additiveItems = LogicManager.GetAdditiveItems(LogicManager.AdditiveItemNames.First(s => LogicManager.GetAdditiveItems(s).Contains(item)));
                int      additiveCount = RandomizerMod.Instance.Settings.GetAdditiveCount(item);
                PlayerData.instance.SetBool(LogicManager.GetItemDef(additiveItems[Math.Min(additiveCount, additiveItems.Length - 1)]).boolName, true);
                break;

            case GiveAction.AddGeo:
                if (geo > 0)
                {
                    HeroController.instance.AddGeo(geo);
                }
                else
                {
                    HeroController.instance.AddGeo(LogicManager.GetItemDef(item).geo);
                }

                break;

            // Disabled because it's more convenient to do this from the fsm. Use GiveAction.None for geo spawns.
            case GiveAction.SpawnGeo:
                RandomizerMod.Instance.LogError("Tried to spawn geo from GiveItem.");
                throw new NotImplementedException();

            case GiveAction.AddSoul:
                HeroController.instance.AddMPCharge(200);
                break;

            case GiveAction.Lore:
                if (LogicManager.ShopNames.Contains(location))
                {
                    break;
                }
                AudioSource.PlayClipAtPoint(ObjectCache.LoreSound,
                                            new Vector3(
                                                Camera.main.transform.position.x - 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                AudioSource.PlayClipAtPoint(ObjectCache.LoreSound,
                                            new Vector3(
                                                Camera.main.transform.position.x + 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                break;

            case GiveAction.Map:
                PlayerData.instance.hasMap           = true;
                PlayerData.instance.openedMapperShop = true;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                break;

            case GiveAction.Stag:
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                PlayerData.instance.stationsOpened++;
                break;

            case GiveAction.Journal:
                var boolName = LogicManager.GetItemDef(item).boolName;
                PlayerData.instance.SetBool(boolName, true);
                PlayerData.instance.SetInt(boolName.Replace("killed", "kills"), 0);
                PlayerData.instance.SetBool(boolName.Replace("killed", "newData"), true);
                break;

            case GiveAction.DirtmouthStag:
                PlayerData.instance.SetBool(nameof(PlayerData.openedTown), true);
                PlayerData.instance.SetBool(nameof(PlayerData.openedTownBuilding), true);
                break;

            case GiveAction.Grub:
                PlayerData.instance.grubsCollected++;
                int clipIndex = new Random().Next(2);
                AudioSource.PlayClipAtPoint(ObjectCache.GrubCry[clipIndex],
                                            new Vector3(
                                                Camera.main.transform.position.x - 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                AudioSource.PlayClipAtPoint(ObjectCache.GrubCry[clipIndex],
                                            new Vector3(
                                                Camera.main.transform.position.x + 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                break;

            case GiveAction.Mimic:
                AudioSource.PlayClipAtPoint(ObjectCache.MimicScream,
                                            new Vector3(
                                                Camera.main.transform.position.x - 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                AudioSource.PlayClipAtPoint(ObjectCache.MimicScream,
                                            new Vector3(
                                                Camera.main.transform.position.x + 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                break;

            case GiveAction.Essence:
                PlayerData.instance.IntAdd(nameof(PlayerData.dreamOrbs), LogicManager.GetItemDef(item).geo);
                EventRegister.SendEvent("DREAM ORB COLLECT");
                break;

            case GiveAction.MaskShard:
                PlayerData.instance.heartPieceCollected = true;
                if (PlayerData.instance.heartPieces < 3)
                {
                    PlayerData.instance.heartPieces++;
                }
                else
                {
                    HeroController.instance.AddToMaxHealth(1);
                    PlayMakerFSM.BroadcastEvent("MAX HP UP");
                    PlayMakerFSM.BroadcastEvent("HERO HEALED FULL");
                    if (PlayerData.instance.maxHealthBase < PlayerData.instance.maxHealthCap)
                    {
                        PlayerData.instance.heartPieces = 0;
                    }
                }
                break;

            case GiveAction.VesselFragment:
                PlayerData.instance.vesselFragmentCollected = true;
                if (PlayerData.instance.vesselFragments < 2)
                {
                    GameManager.instance.IncrementPlayerDataInt("vesselFragments");
                }
                else
                {
                    HeroController.instance.AddToMaxMPReserve(33);
                    PlayMakerFSM.BroadcastEvent("NEW SOUL ORB");
                    if (PlayerData.instance.MPReserveMax < PlayerData.instance.MPReserveCap)
                    {
                        PlayerData.instance.vesselFragments = 0;
                    }
                }
                break;

            case GiveAction.WanderersJournal:
                PlayerData.instance.foundTrinket1 = true;
                PlayerData.instance.trinket1++;
                break;

            case GiveAction.HallownestSeal:
                PlayerData.instance.foundTrinket2 = true;
                PlayerData.instance.trinket2++;
                break;

            case GiveAction.KingsIdol:
                PlayerData.instance.foundTrinket3 = true;
                PlayerData.instance.trinket3++;
                break;

            case GiveAction.ArcaneEgg:
                PlayerData.instance.foundTrinket4 = true;
                PlayerData.instance.trinket4++;
                break;

            case GiveAction.Dreamer:
                switch (item)
                {
                case "Lurien":
                    if (PlayerData.instance.lurienDefeated)
                    {
                        break;
                    }
                    PlayerData.instance.lurienDefeated   = true;
                    PlayerData.instance.maskBrokenLurien = true;
                    break;

                case "Monomon":
                    if (PlayerData.instance.monomonDefeated)
                    {
                        break;
                    }
                    PlayerData.instance.monomonDefeated   = true;
                    PlayerData.instance.maskBrokenMonomon = true;
                    break;

                case "Herrah":
                    if (PlayerData.instance.hegemolDefeated)
                    {
                        break;
                    }
                    PlayerData.instance.hegemolDefeated   = true;
                    PlayerData.instance.maskBrokenHegemol = true;
                    break;
                }
                if (PlayerData.instance.guardiansDefeated == 0)
                {
                    PlayerData.instance.hornetFountainEncounter = true;
                    PlayerData.instance.marmOutside             = true;
                    PlayerData.instance.crossroadsInfected      = true;
                }
                if (PlayerData.instance.guardiansDefeated == 2)
                {
                    PlayerData.instance.dungDefenderSleeping = true;
                    PlayerData.instance.brettaState++;
                    PlayerData.instance.mrMushroomState++;
                    PlayerData.instance.corniferAtHome        = true;
                    PlayerData.instance.metIselda             = true;
                    PlayerData.instance.corn_cityLeft         = true;
                    PlayerData.instance.corn_abyssLeft        = true;
                    PlayerData.instance.corn_cliffsLeft       = true;
                    PlayerData.instance.corn_crossroadsLeft   = true;
                    PlayerData.instance.corn_deepnestLeft     = true;
                    PlayerData.instance.corn_fogCanyonLeft    = true;
                    PlayerData.instance.corn_fungalWastesLeft = true;
                    PlayerData.instance.corn_greenpathLeft    = true;
                    PlayerData.instance.corn_minesLeft        = true;
                    PlayerData.instance.corn_outskirtsLeft    = true;
                    PlayerData.instance.corn_royalGardensLeft = true;
                    PlayerData.instance.corn_waterwaysLeft    = true;
                }
                if (PlayerData.instance.guardiansDefeated < 3)
                {
                    PlayerData.instance.guardiansDefeated++;
                }
                break;

            case GiveAction.Kingsoul:
                if (PlayerData.instance.royalCharmState < 4)
                {
                    PlayerData.instance.royalCharmState++;
                }
                switch (PlayerData.instance.royalCharmState)
                {
                case 1:
                    PlayerData.instance.gotCharm_36 = true;
                    PlayerData.instance.charmsOwned++;
                    break;

                case 2:
                    PlayerData.instance.royalCharmState++;
                    break;

                case 4:
                    PlayerData.instance.gotShadeCharm    = true;
                    PlayerData.instance.charmCost_36     = 0;
                    PlayerData.instance.equippedCharm_36 = true;
                    if (!PlayerData.instance.equippedCharms.Contains(36))
                    {
                        PlayerData.instance.equippedCharms.Add(36);
                    }
                    break;
                }
                break;

            case GiveAction.Grimmchild:
                PlayerData.instance.SetBool(nameof(PlayerData.instance.gotCharm_40), true);
                PlayerData.instance.SetBool(nameof(PlayerData.nightmareLanternAppeared), true);
                PlayerData.instance.SetBool(nameof(PlayerData.nightmareLanternLit), true);
                PlayerData.instance.SetBool(nameof(PlayerData.troupeInTown), true);
                PlayerData.instance.SetBool(nameof(PlayerData.divineInTown), true);
                PlayerData.instance.SetBool(nameof(PlayerData.metGrimm), true);
                PlayerData.instance.SetInt(nameof(PlayerData.flamesRequired), 3);
                if (RandomizerMod.Instance.Settings.RandomizeGrimmkinFlames)
                {
                    PlayerData.instance.SetInt(nameof(PlayerData.grimmChildLevel), 1);
                }
                else
                {
                    // Skip first two collection quests
                    PlayerData.instance.SetInt(nameof(PlayerData.flamesCollected), 3);
                    PlayerData.instance.SetBool(nameof(PlayerData.killedFlameBearerSmall), true);
                    PlayerData.instance.SetBool(nameof(PlayerData.killedFlameBearerMed), true);
                    PlayerData.instance.SetInt(nameof(PlayerData.killsFlameBearerSmall), 3);
                    PlayerData.instance.SetInt(nameof(PlayerData.killsFlameBearerMed), 3);
                    PlayerData.instance.SetInt(nameof(PlayerData.grimmChildLevel), 2);
                    GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                    {
                        sceneName      = "Mines_10",
                        id             = "Flamebearer Spawn",
                        activated      = true,
                        semiPersistent = false
                    });
                    GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                    {
                        sceneName      = "Ruins1_28",
                        id             = "Flamebearer Spawn",
                        activated      = true,
                        semiPersistent = false
                    });
                    GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                    {
                        sceneName      = "Fungus1_10",
                        id             = "Flamebearer Spawn",
                        activated      = true,
                        semiPersistent = false
                    });
                    GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                    {
                        sceneName      = "Tutorial_01",
                        id             = "Flamebearer Spawn",
                        activated      = true,
                        semiPersistent = false
                    });
                    GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                    {
                        sceneName      = "RestingGrounds_06",
                        id             = "Flamebearer Spawn",
                        activated      = true,
                        semiPersistent = false
                    });
                    GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                    {
                        sceneName      = "Deepnest_East_03",
                        id             = "Flamebearer Spawn",
                        activated      = true,
                        semiPersistent = false
                    });
                }

                break;

            case GiveAction.SettingsBool:
                RandomizerMod.Instance.Settings.SetBool(true, LogicManager.GetItemDef(item).boolName);
                break;

            case GiveAction.None:
                break;

            case GiveAction.Lifeblood:
                int n = LogicManager.GetItemDef(item).lifeblood;
                for (int i = 0; i < n; i++)
                {
                    EventRegister.SendEvent("ADD BLUE HEALTH");
                }
                break;

            case GiveAction.ElevatorPass:
                PlayerData.instance.SetBool(nameof(PlayerData.cityLift1), true);
                PlayerData.instance.SetBool(nameof(PlayerData.cityLift2), true);
                break;

            case GiveAction.SpawnLumaflies:
                // I think, ideally, we'd pass the shiny GameObject as a parameter of GiveItem, and spawn from the shiny's
                // location if not null.
                if (HeroController.instance == null)
                {
                    break;
                }

                Transform  hero    = HeroController.instance.transform;
                GameObject lumafly = ObjectCache.LumaflyEscape;

                Vector3 pos = hero.position;
                pos.z = lumafly.transform.position.z - 5f;
                // Slight tweaks to the lumafly's position, that I'm not sure are helpful but I think generally improve the spawn location.
                pos.x += (-0.2f) * hero.localScale.x;
                pos.y -= 0.05f;
                lumafly.transform.position = pos;

                lumafly.SetActive(true);

                break;
            }

            // With Cursed Nail active, drop the vine platform so they can escape from thorns without softlocking
            // Break the Thorns Vine here; this works whether or not the item is a shiny.
            if (location == "Thorns_of_Agony" && RandomizerMod.Instance.Settings.CursedNail && RandomizerMod.Instance.Settings.ExtraPlatforms)
            {
                if (GameObject.Find("Vine") is GameObject vine)
                {
                    VinePlatformCut vinecut   = vine.GetComponent <VinePlatformCut>();
                    bool            activated = ReflectionHelper.GetField <VinePlatformCut, bool>(vinecut, "activated");
                    if (!activated)
                    {
                        vinecut.Cut();
                    }
                }
            }

            // If the location is a grub, it seems polite to mark it as obtained for the purpose of the Collector's Map
            try
            {
                if (!LogicManager.ShopNames.Contains(location) && LogicManager.GetItemDef(location).pool == "Grub")
                {
                    GameManager.instance.AddToGrubList();
                }
            }
            catch (Exception e)
            {
                LogError("Error Marking Grub Location:\n" + e);
            }


            // additive, kingsoul, bool type items can all have additive counts
            if (LogicManager.AdditiveItemSets.Any(set => set.Contains(item)))
            {
                RandomizerMod.Instance.Settings.IncrementAdditiveCount(item);
            }
        }
Exemple #14
0
        public static void GiveItem(GiveAction action, string item, string location, GameObject shiny = null)
        {
            LogItemToTracker(item, location);
            RandomizerMod.Instance.Settings.MarkItemFound(item);
            RandomizerMod.Instance.Settings.MarkLocationFound(location);
            UpdateHelperLog();

            item = LogicManager.RemoveDuplicateSuffix(item);

            switch (action)
            {
            default:
            case GiveAction.Bool:
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                break;

            case GiveAction.Int:
                PlayerData.instance.IncrementInt(LogicManager.GetItemDef(item).intName);
                break;

            case GiveAction.Charm:
                PlayerData.instance.hasCharm = true;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                PlayerData.instance.charmsOwned++;
                break;

            case GiveAction.EquippedCharm:
                PlayerData.instance.hasCharm = true;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                PlayerData.instance.charmsOwned++;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).equipBoolName, true);
                PlayerData.instance.EquipCharm(LogicManager.GetItemDef(item).charmNum);

                PlayerData.instance.CalculateNotchesUsed();
                if (PlayerData.instance.charmSlotsFilled > PlayerData.instance.charmSlots)
                {
                    PlayerData.instance.overcharmed = true;
                }
                break;

            case GiveAction.Additive:
                string[] additiveItems = LogicManager.GetAdditiveItems(LogicManager.AdditiveItemNames.First(s => LogicManager.GetAdditiveItems(s).Contains(item)));
                int      additiveCount = RandomizerMod.Instance.Settings.GetAdditiveCount(item);
                PlayerData.instance.SetBool(LogicManager.GetItemDef(additiveItems[Math.Min(additiveCount, additiveItems.Length - 1)]).boolName, true);     // note that item has already been set true, so i starts at 1
                RandomizerMod.Instance.Settings.IncrementAdditiveCount(item);
                break;

            case GiveAction.AddGeo:
                PlayerData.instance.AddGeo(LogicManager.GetItemDef(item).geo);
                break;

            // Disabled because it's more convenient to do this from the fsm. Use GiveAction.None for geo spawns.
            case GiveAction.SpawnGeo:
                RandomizerMod.Instance.LogError("Tried to spawn geo from GiveItem.");
                throw new NotImplementedException();

            case GiveAction.Map:
                PlayerData.instance.hasMap           = true;
                PlayerData.instance.openedMapperShop = true;
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                break;

            case GiveAction.Stag:
                PlayerData.instance.SetBool(LogicManager.GetItemDef(item).boolName, true);
                PlayerData.instance.stationsOpened++;
                break;

            case GiveAction.Grub:
                PlayerData.instance.grubsCollected++;
                int clipIndex = new System.Random().Next(2);
                AudioSource.PlayClipAtPoint(ObjectCache.GrubCry[clipIndex],
                                            new Vector3(
                                                Camera.main.transform.position.x - 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                AudioSource.PlayClipAtPoint(ObjectCache.GrubCry[clipIndex],
                                            new Vector3(
                                                Camera.main.transform.position.x + 2,
                                                Camera.main.transform.position.y,
                                                Camera.main.transform.position.z + 2
                                                ));
                break;

            case GiveAction.Essence:
                PlayerData.instance.IntAdd(nameof(PlayerData.dreamOrbs), LogicManager.GetItemDef(item).geo);
                EventRegister.SendEvent("DREAM ORB COLLECT");
                break;

            case GiveAction.MaskShard:
                PlayerData.instance.heartPieceCollected = true;
                if (PlayerData.instance.heartPieces < 3)
                {
                    PlayerData.instance.heartPieces++;
                }
                else
                {
                    HeroController.instance.AddToMaxHealth(1);
                    PlayMakerFSM.BroadcastEvent("MAX HP UP");
                    PlayMakerFSM.BroadcastEvent("HERO HEALED FULL");
                    if (PlayerData.instance.maxHealthBase < PlayerData.instance.maxHealthCap)
                    {
                        PlayerData.instance.heartPieces = 0;
                    }
                }
                break;

            case GiveAction.VesselFragment:
                PlayerData.instance.vesselFragmentCollected = true;
                if (PlayerData.instance.vesselFragments < 2)
                {
                    GameManager.instance.IncrementPlayerDataInt("vesselFragments");
                }
                else
                {
                    HeroController.instance.AddToMaxMPReserve(33);
                    PlayMakerFSM.BroadcastEvent("NEW SOUL ORB");
                    if (PlayerData.instance.MPReserveMax < PlayerData.instance.MPReserveCap)
                    {
                        PlayerData.instance.vesselFragments = 0;
                    }
                }
                break;

            case GiveAction.WanderersJournal:
                PlayerData.instance.foundTrinket1 = true;
                PlayerData.instance.trinket1++;
                break;

            case GiveAction.HallownestSeal:
                PlayerData.instance.foundTrinket2 = true;
                PlayerData.instance.trinket2++;
                break;

            case GiveAction.KingsIdol:
                PlayerData.instance.foundTrinket3 = true;
                PlayerData.instance.trinket3++;
                break;

            case GiveAction.ArcaneEgg:
                PlayerData.instance.foundTrinket4 = true;
                PlayerData.instance.trinket4++;
                break;

            case GiveAction.Dreamer:
                switch (item)
                {
                case "Lurien":
                    if (PlayerData.instance.lurienDefeated)
                    {
                        break;
                    }

                    PlayerData.instance.lurienDefeated   = true;
                    PlayerData.instance.maskBrokenLurien = true;
                    PlayerData.instance.guardiansDefeated++;
                    if (PlayerData.instance.guardiansDefeated == 1)
                    {
                        PlayerData.instance.hornetFountainEncounter = true;
                        PlayerData.instance.marmOutside             = true;
                        PlayerData.instance.crossroadsInfected      = true;
                    }
                    if (PlayerData.instance.guardiansDefeated == 3)
                    {
                        PlayerData.instance.dungDefenderSleeping = true;
                        PlayerData.instance.brettaState++;
                        PlayerData.instance.mrMushroomState++;
                        PlayerData.instance.corniferAtHome = true;
                        PlayerData.instance.metIselda      = true;
                    }
                    break;

                case "Monomon":
                    if (PlayerData.instance.monomonDefeated)
                    {
                        break;
                    }

                    PlayerData.instance.monomonDefeated   = true;
                    PlayerData.instance.maskBrokenMonomon = true;
                    PlayerData.instance.guardiansDefeated++;
                    if (PlayerData.instance.guardiansDefeated == 1)
                    {
                        PlayerData.instance.hornetFountainEncounter = true;
                        PlayerData.instance.marmOutside             = true;
                        PlayerData.instance.crossroadsInfected      = true;
                    }
                    if (PlayerData.instance.guardiansDefeated == 3)
                    {
                        PlayerData.instance.dungDefenderSleeping = true;
                        PlayerData.instance.brettaState++;
                        PlayerData.instance.mrMushroomState++;
                        PlayerData.instance.corniferAtHome = true;
                        PlayerData.instance.metIselda      = true;
                    }
                    break;

                case "Herrah":
                    if (PlayerData.instance.hegemolDefeated)
                    {
                        break;
                    }

                    PlayerData.instance.hegemolDefeated   = true;
                    PlayerData.instance.maskBrokenHegemol = true;
                    PlayerData.instance.guardiansDefeated++;
                    if (PlayerData.instance.guardiansDefeated == 1)
                    {
                        PlayerData.instance.hornetFountainEncounter = true;
                        PlayerData.instance.marmOutside             = true;
                        PlayerData.instance.crossroadsInfected      = true;
                    }
                    if (PlayerData.instance.guardiansDefeated == 3)
                    {
                        PlayerData.instance.dungDefenderSleeping = true;
                        PlayerData.instance.brettaState++;
                        PlayerData.instance.mrMushroomState++;
                        PlayerData.instance.corniferAtHome = true;
                        PlayerData.instance.metIselda      = true;
                    }
                    break;
                }
                break;

            case GiveAction.Kingsoul:
                PlayerData.instance.royalCharmState++;
                RandomizerMod.Instance.Settings.IncrementAdditiveCount(item);
                switch (PlayerData.instance.royalCharmState)
                {
                case 1:
                    PlayerData.instance.gotCharm_36 = true;
                    break;

                case 2:
                    PlayerData.instance.royalCharmState++;
                    break;

                case 4:
                    PlayerData.instance.gotShadeCharm    = true;
                    PlayerData.instance.charmCost_36     = 0;
                    PlayerData.instance.equippedCharm_36 = true;
                    break;
                }
                break;

            case GiveAction.Grimmchild:
                PlayerData.instance.SetBool(nameof(PlayerData.instance.gotCharm_40), true);
                // Skip first two collection quests
                PlayerData.instance.SetBool(nameof(PlayerData.nightmareLanternAppeared), true);
                PlayerData.instance.SetBool(nameof(PlayerData.nightmareLanternLit), true);
                PlayerData.instance.SetBool(nameof(PlayerData.troupeInTown), true);
                PlayerData.instance.SetBool(nameof(PlayerData.divineInTown), true);
                PlayerData.instance.SetBool(nameof(PlayerData.metGrimm), true);
                PlayerData.instance.SetInt(nameof(PlayerData.flamesRequired), 3);
                PlayerData.instance.SetInt(nameof(PlayerData.flamesCollected), 3);
                PlayerData.instance.SetBool(nameof(PlayerData.killedFlameBearerSmall), true);
                PlayerData.instance.SetBool(nameof(PlayerData.killedFlameBearerMed), true);
                PlayerData.instance.SetInt(nameof(PlayerData.killsFlameBearerSmall), 3);
                PlayerData.instance.SetInt(nameof(PlayerData.killsFlameBearerMed), 3);
                PlayerData.instance.SetInt(nameof(PlayerData.grimmChildLevel), 2);

                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "Mines_10",
                    id             = "Flamebearer Spawn",
                    activated      = true,
                    semiPersistent = false
                });
                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "Ruins1_28",
                    id             = "Flamebearer Spawn",
                    activated      = true,
                    semiPersistent = false
                });
                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "Fungus1_10",
                    id             = "Flamebearer Spawn",
                    activated      = true,
                    semiPersistent = false
                });
                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "Tutorial_01",
                    id             = "Flamebearer Spawn",
                    activated      = true,
                    semiPersistent = false
                });
                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "RestingGrounds_06",
                    id             = "Flamebearer Spawn",
                    activated      = true,
                    semiPersistent = false
                });
                GameManager.instance.sceneData.SaveMyState(new PersistentBoolData
                {
                    sceneName      = "Deepnest_East_03",
                    id             = "Flamebearer Spawn",
                    activated      = true,
                    semiPersistent = false
                });
                break;

            case GiveAction.None:
                break;
            }
        }
Exemple #15
0
        /// <summary>
        /// CoreItem should always be the lowest item priority in the inventory, so we can assume
        /// that there will be no more commands that could match after this method. Thus, if we can't
        /// match the string at the beginning of commands, GetAction will still skip the commands
        /// array anyway.
        /// </summary>
        /// <param name="player">
        /// The player trying to execute the action.</param>
        /// <param name="commands">A string of action commands to be parsed in order. This should contain quoted strings and
        /// core action handles (SAY, GIVE, IF, etc) only.</param>
        /// <returns>The action built from the commands array.</returns>
        override public bool DoAction(Player player, ref string[] commands, ref bool lastAction)
        {
            Action action = null;

            if (commands != null && commands.Length > 0)
            {
                int index = 0;
                switch (commands[0].ToUpper())
                {
                case "SAY":
                {
                    SayAction sayAction = new SayAction(player);
                    index++;
                    if (commands.Length > 1)
                    {
                        sayAction.Message = commands[1];
                        index++;
                    }
                    action = sayAction;
                }
                break;

                case "IF":
                {
                    IfElseAction ifAction = new IfElseAction(player);
                    index++;
                    if (commands.Length > 1)
                    {
                        index += ifAction.Parse(commands.Skip(1).ToArray());
                    }
                    action = ifAction;
                }
                break;

                case "NOT":
                {
                    NotAction notAction = new NotAction(player);
                    commands = commands.Skip(1).ToArray();          // skip to next action
                    player.Inventory.DoAction(ref commands, ref lastAction);
                    notAction.Op = lastAction;
                    // no index increment, the ref is our increment
                    action = notAction;
                }
                break;

                case "AND":
                {
                    AndAction andAction = new AndAction(player);
                    commands      = commands.Skip(1).ToArray();
                    andAction.Op1 = lastAction;
                    player.Inventory.DoAction(ref commands, ref lastAction);
                    andAction.Op2 = lastAction;
                    // no index increment, the ref is our increment
                    action = andAction;
                }
                break;

                case "OR":
                {
                    OrAction orAction = new OrAction(player);
                    commands     = commands.Skip(1).ToArray();
                    orAction.Op1 = lastAction;
                    player.Inventory.DoAction(ref commands, ref lastAction);
                    orAction.Op2 = lastAction;
                    // no index increment, the ref is our increment
                    action = orAction;
                }
                break;

                case "GIVE":
                {
                    GiveAction giveAction = new GiveAction(player);
                    index++;
                    if (commands.Length > 1)
                    {
                        giveAction.ItemName = commands[1];
                        index++;
                    }
                    if (commands.Length > 3 && commands[2].ToUpper() == "TO")
                    {
                        giveAction.ToItemName = commands[3];
                        index += 2;
                    }
                    action = giveAction;
                }
                break;

                case "TAKE":
                {
                    TakeAction takeAction = new TakeAction(player);
                    index++;
                    if (commands.Length > 1)
                    {
                        takeAction.ItemName = commands[1];
                        index++;
                    }
                    if (commands.Length > 3 && commands[2].ToUpper() == "FROM")
                    {
                        takeAction.FromItemName = commands[3];
                        index += 2;
                    }
                    action = takeAction;
                }
                break;

                case "HAS":
                {
                    HasAction hasAction = new HasAction(player);
                    index++;
                    if (commands.Length > 1)
                    {
                        hasAction.ItemName = commands[1];
                        index++;
                    }
                    if (commands.Length > 3 && commands[2].ToUpper() == "IN")
                    {
                        hasAction.InItemName = commands[3];
                        index += 2;
                    }
                    action = hasAction;
                }
                break;

                case "GO":
                {
                    GoAction goAction = new GoAction(player);
                    index++;
                    if (commands.Length > 1)
                    {
                        goAction.GiveItemName = commands[1];
                        goAction.TakeItemName = GoItemString;
                        index++;
                    }
                    if (goAction.ExecuteWhenCreated())
                    {
                        GoItemString = goAction.GiveItemName;
                    }
                    action = goAction;
                }
                break;

                case "INV":
                {
                    GroupAction groupAction = new GroupAction(player);
                    index++;
                    foreach (Item item in player.Inventory.Items
                             .Where(item => !item.Hidden))
                    {
                        SayAction sayAction = new SayAction(player);
                        sayAction.Message = item.DisplayName;
                        groupAction.Add(sayAction);
                    }
                    if (groupAction.Actions.Count < 1)
                    {
                        SayAction sayAction = new SayAction(player);
                        sayAction.Message = "You have no items.";
                        groupAction.Add(sayAction);
                    }
                    action = groupAction;
                }
                break;

                default:            // unrecognized? This is the base item, so there's no other items that could have matching actions.
                    index++;        // ignore it.
                    break;
                }

                commands = commands.Skip(index).ToArray();
            }

            if (action != null)
            {
                lastAction = action.Execute();
                return(true);
            }
            else
            {
                return(false);
            }
        }