SMAPI/Mods/ConvenientChests/CategorizeChests/Framework/ChestFinder.cs

53 lines
2.3 KiB
C#

using System.Linq;
using ConvenientChests.CategorizeChests.Framework.Persistence;
using StardewValley;
using StardewValley.Locations;
using StardewValley.Objects;
namespace ConvenientChests.CategorizeChests.Framework
{
class ChestFinder : IChestFinder
{
public Chest GetChestByAddress(ChestAddress address)
{
if (address.LocationType == ChestLocationType.Refrigerator)
{
var house = (FarmHouse) Game1.locations.SingleOrDefault(l => l is FarmHouse f && address.LocationName == (f.uniqueName?.Value ?? f.Name));
if (house == null)
throw new InvalidSaveDataException($"Save data contains refrigerator data in {address.LocationName} but location does not exist");
if (house.upgradeLevel < 1)
throw new InvalidSaveDataException($"Save data contains refrigerator data in {address.LocationName} but refrigerator does not exist");
return house.fridge.Value;
}
var location = GetLocationFromAddress(address);
if (location.objects.ContainsKey(address.Tile) && location.objects[address.Tile] is Chest chest)
return chest;
throw new InvalidSaveDataException($"Can't find chest in {location.Name} at {address.Tile}");
}
private GameLocation GetLocationFromAddress(ChestAddress address)
{
var location = Game1.locations.FirstOrDefault(l => l.Name == address.LocationName);
if (location == null)
throw new InvalidSaveDataException($"Can't find location named {address.LocationName}");
if (address.LocationType != ChestLocationType.Building)
return location;
if (!(location is BuildableGameLocation buildableLocation))
throw new InvalidSaveDataException($"Can't find any buildings in location named {location.Name}");
var building = buildableLocation.buildings.SingleOrDefault(b => b.nameOfIndoors == address.BuildingName);
if (building == null)
throw new InvalidSaveDataException($"Save data contains building data in {address.BuildingName} but building does not exist");
return building.indoors.Value;
}
}
}