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; } }
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; }
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; }
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); }
// 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); }
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)); }
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; }
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; }
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); } }
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; } }
/// <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); } }