diff options
Diffstat (limited to 'src/TrainerMod')
-rw-r--r-- | src/TrainerMod/Framework/ItemData/ItemType.cs | 28 | ||||
-rw-r--r-- | src/TrainerMod/Framework/ItemData/SearchableItem.cs | 41 | ||||
-rw-r--r-- | src/TrainerMod/Framework/ItemRepository.cs | 179 | ||||
-rw-r--r-- | src/TrainerMod/TrainerMod.csproj | 2 |
4 files changed, 248 insertions, 2 deletions
diff --git a/src/TrainerMod/Framework/ItemData/ItemType.cs b/src/TrainerMod/Framework/ItemData/ItemType.cs index f93160a2..423455e9 100644 --- a/src/TrainerMod/Framework/ItemData/ItemType.cs +++ b/src/TrainerMod/Framework/ItemData/ItemType.cs @@ -3,13 +3,37 @@ /// <summary>An item type that can be searched and added to the player through the console.</summary> internal enum ItemType { + /// <summary>A big craftable object in <see cref="StardewValley.Game1.bigCraftablesInformation"/></summary> + BigCraftable, + + /// <summary>A <see cref="Boots"/> item.</summary> + Boots, + + /// <summary>A fish item.</summary> + Fish, + + /// <summary>A <see cref="Wallpaper"/> flooring item.</summary> + Flooring, + + /// <summary>A <see cref="Furniture"/> item.</summary> + Furniture, + + /// <summary>A <see cref="Hat"/> item.</summary> + Hat, + /// <summary>Any object in <see cref="StardewValley.Game1.objectInformation"/> (except rings).</summary> Object, - /// <summary>A ring in <see cref="StardewValley.Game1.objectInformation"/>.</summary> + /// <summary>A <see cref="Ring"/> item.</summary> Ring, - /// <summary>A weapon from <c>Data\weapons</c>.</summary> + /// <summary>A <see cref="Tool"/> tool.</summary> + Tool, + + /// <summary>A <see cref="Wallpaper"/> wall item.</summary> + Wallpaper, + + /// <summary>A <see cref="StardewValley.Tools.MeleeWeapon"/> or <see cref="StardewValley.Tools.Slingshot"/> item.</summary> Weapon } } diff --git a/src/TrainerMod/Framework/ItemData/SearchableItem.cs b/src/TrainerMod/Framework/ItemData/SearchableItem.cs new file mode 100644 index 00000000..146da1a8 --- /dev/null +++ b/src/TrainerMod/Framework/ItemData/SearchableItem.cs @@ -0,0 +1,41 @@ +using StardewValley; + +namespace TrainerMod.Framework.ItemData +{ + /// <summary>A game item with metadata.</summary> + internal class SearchableItem + { + /********* + ** Accessors + *********/ + /// <summary>The item type.</summary> + public ItemType Type { get; } + + /// <summary>The item instance.</summary> + public Item Item { get; } + + /// <summary>The item's unique ID for its type.</summary> + public int ID { get; } + + /// <summary>The item's default name.</summary> + public string Name => this.Item.Name; + + /// <summary>The item's display name for the current language.</summary> + public string DisplayName => this.Item.DisplayName; + + + /********* + ** Public methods + *********/ + /// <summary>Construct an instance.</summary> + /// <param name="type">The item type.</param> + /// <param name="id">The unique ID (if different from the item's parent sheet index).</param> + /// <param name="item">The item instance.</param> + public SearchableItem(ItemType type, int id, Item item) + { + this.Type = type; + this.ID = id; + this.Item = item; + } + } +} diff --git a/src/TrainerMod/Framework/ItemRepository.cs b/src/TrainerMod/Framework/ItemRepository.cs new file mode 100644 index 00000000..96d3159e --- /dev/null +++ b/src/TrainerMod/Framework/ItemRepository.cs @@ -0,0 +1,179 @@ +using System.Collections.Generic; +using Microsoft.Xna.Framework; +using StardewValley; +using StardewValley.Objects; +using StardewValley.Tools; +using TrainerMod.Framework.ItemData; +using SObject = StardewValley.Object; + +namespace TrainerMod.Framework +{ + /// <summary>Provides methods for searching and constructing items.</summary> + internal class ItemRepository + { + /********* + ** Properties + *********/ + /// <summary>The custom ID offset for items don't have a unique ID in the game.</summary> + private readonly int CustomIDOffset = 1000; + + + /********* + ** Public methods + *********/ + /// <summary>Get all spawnable items.</summary> + public IEnumerable<SearchableItem> GetAll() + { + // get tools + for (int quality = Tool.stone; quality <= Tool.iridium; quality++) + { + yield return new SearchableItem(ItemType.Tool, ToolFactory.axe, ToolFactory.getToolFromDescription(ToolFactory.axe, quality)); + yield return new SearchableItem(ItemType.Tool, ToolFactory.hoe, ToolFactory.getToolFromDescription(ToolFactory.hoe, quality)); + yield return new SearchableItem(ItemType.Tool, ToolFactory.pickAxe, ToolFactory.getToolFromDescription(ToolFactory.pickAxe, quality)); + yield return new SearchableItem(ItemType.Tool, ToolFactory.wateringCan, ToolFactory.getToolFromDescription(ToolFactory.wateringCan, quality)); + if (quality != Tool.iridium) + yield return new SearchableItem(ItemType.Tool, ToolFactory.fishingRod, ToolFactory.getToolFromDescription(ToolFactory.fishingRod, quality)); + } + yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset, new MilkPail()); // these don't have any sort of ID, so we'll just assign some arbitrary ones + yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset + 1, new Shears()); + yield return new SearchableItem(ItemType.Tool, this.CustomIDOffset + 2, new Pan()); + + // wallpapers + for (int id = 0; id < 112; id++) + yield return new SearchableItem(ItemType.Wallpaper, id, new Wallpaper(id)); + + // flooring + for (int id = 0; id < 40; id++) + yield return new SearchableItem(ItemType.Flooring, id, new Wallpaper(id, isFloor: true)); + + // equipment + foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Boots").Keys) + yield return new SearchableItem(ItemType.Boots, id, new Boots(id)); + foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\hats").Keys) + yield return new SearchableItem(ItemType.Hat, id, new Hat(id)); + foreach (int id in Game1.objectInformation.Keys) + { + if (id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange) + yield return new SearchableItem(ItemType.Ring, id, new Ring(id)); + } + + // weapons + foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\weapons").Keys) + { + Item weapon = (id >= 32 && id <= 34) + ? (Item)new Slingshot(id) + : new MeleeWeapon(id); + yield return new SearchableItem(ItemType.Weapon, id, weapon); + } + + // furniture + foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Furniture").Keys) + { + if (id == 1466 || id == 1468) + yield return new SearchableItem(ItemType.Furniture, id, new TV(id, Vector2.Zero)); + else + yield return new SearchableItem(ItemType.Furniture, id, new Furniture(id, Vector2.Zero)); + } + + // fish + foreach (int id in Game1.content.Load<Dictionary<int, string>>("Data\\Fish").Keys) + yield return new SearchableItem(ItemType.Fish, id, new SObject(id, 999)); + + // craftables + foreach (int id in Game1.bigCraftablesInformation.Keys) + yield return new SearchableItem(ItemType.BigCraftable, id, new SObject(Vector2.Zero, id)); + + // objects + foreach (int id in Game1.objectInformation.Keys) + { + if (id >= Ring.ringLowerIndexRange && id <= Ring.ringUpperIndexRange) + continue; // handled separated + + SObject item = new SObject(id, 1); + yield return new SearchableItem(ItemType.Object, id, item); + + // fruit products + if (item.category == SObject.FruitsCategory) + { + yield return new SearchableItem(ItemType.Object, this.CustomIDOffset + id, new SObject(348, 1) + { + name = $"{item.Name} Wine", + price = item.price * 3, + preserve = SObject.PreserveType.Wine, + preservedParentSheetIndex = item.parentSheetIndex + }); + yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 2 + id, new SObject(344, 1) + { + name = $"{item.Name} Jelly", + price = 50 + item.Price * 2, + preserve = SObject.PreserveType.Jelly, + preservedParentSheetIndex = item.parentSheetIndex + }); + } + + // vegetable products + else if (item.category == SObject.VegetableCategory) + { + yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 3 + id, new SObject(350, 1) + { + name = $"{item.Name} Juice", + price = (int)(item.price * 2.25d), + preserve = SObject.PreserveType.Juice, + preservedParentSheetIndex = item.parentSheetIndex + }); + yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 4 + id, new SObject(342, 1) + { + name = $"Pickled {item.Name}", + price = 50 + item.Price * 2, + preserve = SObject.PreserveType.Pickle, + preservedParentSheetIndex = item.parentSheetIndex + }); + } + + // flower honey + else if (item.category == SObject.flowersCategory) + { + // get honey type + SObject.HoneyType? type = null; + switch (item.parentSheetIndex) + { + case 376: + type = SObject.HoneyType.Poppy; + break; + case 591: + type = SObject.HoneyType.Tulip; + break; + case 593: + type = SObject.HoneyType.SummerSpangle; + break; + case 595: + type = SObject.HoneyType.FairyRose; + break; + case 597: + type = SObject.HoneyType.BlueJazz; + break; + case 421: // sunflower standing in for all other flowers + type = SObject.HoneyType.Wild; + break; + } + + // yield honey + if (type != null) + { + SObject honey = new SObject(Vector2.Zero, 340, item.Name + " Honey", false, true, false, false) + { + name = "Wild Honey", + honeyType = type + }; + if (type != SObject.HoneyType.Wild) + { + honey.name = $"{item.Name} Honey"; + honey.price += item.price * 2; + } + yield return new SearchableItem(ItemType.Object, this.CustomIDOffset * 5 + id, honey); + } + } + } + } + } +} diff --git a/src/TrainerMod/TrainerMod.csproj b/src/TrainerMod/TrainerMod.csproj index ee17f970..18abf42f 100644 --- a/src/TrainerMod/TrainerMod.csproj +++ b/src/TrainerMod/TrainerMod.csproj @@ -88,6 +88,8 @@ <Compile Include="Framework\ItemData\SearchableRing.cs" /> <Compile Include="Framework\ItemData\SearchableWeapon.cs" /> <Compile Include="Framework\Commands\ITrainerCommand.cs" /> + <Compile Include="Framework\ItemData\SearchableItem.cs" /> + <Compile Include="Framework\ItemRepository.cs" /> <Compile Include="TrainerMod.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup> |