diff --git a/CloseDoors/CloseDoors.csproj b/CloseDoors/CloseDoors.csproj new file mode 100644 index 00000000..7b4db518 --- /dev/null +++ b/CloseDoors/CloseDoors.csproj @@ -0,0 +1,27 @@ + + + 1.0.0 + net6.0 + true + AnyCPU;x64 + + + + + + + PreserveNewest + + + + + + + + + + + PreserveNewest + + + \ No newline at end of file diff --git a/CloseDoors/CodePatches.cs b/CloseDoors/CodePatches.cs new file mode 100644 index 00000000..7caf457b --- /dev/null +++ b/CloseDoors/CodePatches.cs @@ -0,0 +1,127 @@ +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using StardewValley; +using StardewValley.Audio; +using StardewValley.Extensions; +using StardewValley.Network; +using StardewValley.Projectiles; +using System; +using System.Collections.Generic; +using xTile.Dimensions; +using xTile.Layers; +using xTile.Tiles; +using Object = StardewValley.Object; +using Rectangle = Microsoft.Xna.Framework.Rectangle; + +namespace CloseDoors +{ + public partial class ModEntry + { + public static Dictionary> doorDict = new(); + [HarmonyPatch(typeof(GameLocation), nameof(GameLocation.isCollidingPosition), new Type[] { typeof(Rectangle), typeof(xTile.Dimensions.Rectangle), typeof(bool), typeof(int), typeof(bool), typeof(Character), typeof(bool), typeof(bool), typeof(bool) })] + public class GameLocation_isCollidingPosition_Patch + { + public static void Postfix(GameLocation __instance, Rectangle position, xTile.Dimensions.Rectangle viewport, bool isFarmer, int damagesFarmer, bool glider, Character character, bool pathfinding, bool projectile, bool ignoreCharacterRequirement) + { + if (!Config.ModEnabled) + return; + if (!isFarmer) + { + if (((character != null) ? character.controller : null) != null && character.FacingDirection % 2 == 0) + { + Layer buildings_layer = __instance.map.RequireLayer("Buildings"); + Point tileLocation = character.FacingDirection == 2 ? new Point(position.Center.X / 64, position.Bottom / 64) : new Point(position.Center.X / 64, position.Top / 64); + if (IsDoorOpen(__instance, tileLocation)) + { + if(!doorDict.TryGetValue(__instance, out var dict)) + { + doorDict[__instance] = new(); + dict = new(); + } + dict[character] = tileLocation; + } + else if(doorDict.TryGetValue(__instance, out var dict) && dict.TryGetValue(character, out var point) && point == (character.FacingDirection == 2 ? tileLocation + new Point(0, -2) : tileLocation + new Point(0, 2))) + { + dict.Remove(character); + if(TryCloseDoor(__instance, point)) + { + } + } + else if(character.FacingDirection == 0) + { + Tile tile = buildings_layer.Tiles[tileLocation.X, tileLocation.Y]; + if (tile != null && tile.Properties.ContainsKey("Action")) + { + __instance.openDoor(new Location(tileLocation.X, tileLocation.Y), Game1.currentLocation.Equals(__instance)); + } + else + { + tileLocation = new Point(position.Center.X / 64, position.Top / 64); + tile = buildings_layer.Tiles[tileLocation.X, tileLocation.Y]; + if (tile != null && tile.Properties.ContainsKey("Action")) + { + __instance.openDoor(new Location(tileLocation.X, tileLocation.Y), Game1.currentLocation.Equals(__instance)); + } + } + } + } + } + } + } + [HarmonyPatch(typeof(GameLocation), nameof(GameLocation.performAction), new Type[] { typeof(string[]), typeof(Farmer), typeof(Location) })] + public class GameLocation_performAction_Patch + { + public static void Prefix(string[] action, Farmer who, Location tileLocation) + { + if (!Config.ModEnabled) + return; + } + } + [HarmonyPatch(typeof(GameLocation), nameof(GameLocation.openDoor))] + public class GameLocation_openDoor_Patch + { + public static void Postfix(Location tileLocation, bool playSound) + { + if (!Config.ModEnabled) + return; + } + } + [HarmonyPatch(typeof(InteriorDoor), "openDoorTiles")] + public class InteriorDoor_openDoorTiles_Patch + { + public static bool Prefix(InteriorDoor __instance) + { + + if (!Config.ModEnabled) + return true; + return true; + } + public static void Postfix(InteriorDoor __instance) + { + + if (!Config.ModEnabled) + return; + } + } + [HarmonyPatch(typeof(GameLocation), nameof(GameLocation.checkAction))] + public class GameLocation_checkAction_Patch + { + public static bool Prefix(GameLocation __instance, Location tileLocation, xTile.Dimensions.Rectangle viewport, Farmer who) + { + if (!Config.ModEnabled) + return true; + if (!string.IsNullOrEmpty(__instance.doesTileHaveProperty(tileLocation.X, tileLocation.Y, "Action", "Buildings"))) + return true; + var tilePoint = new Point(tileLocation.X, tileLocation.Y); + if (TryCloseDoor(__instance, tilePoint)) + { + return false; + } + return true; + } + + } + + } +} \ No newline at end of file diff --git a/CloseDoors/IBuffFrameworkAPI.cs b/CloseDoors/IBuffFrameworkAPI.cs new file mode 100644 index 00000000..472829f9 --- /dev/null +++ b/CloseDoors/IBuffFrameworkAPI.cs @@ -0,0 +1,7 @@ +namespace CloseDoors +{ + public interface IBuffFrameworkAPI + { + public void UpdateBuffs(); + } +} \ No newline at end of file diff --git a/CloseDoors/IGenericModConfigMenuApi.cs b/CloseDoors/IGenericModConfigMenuApi.cs new file mode 100644 index 00000000..008c7888 --- /dev/null +++ b/CloseDoors/IGenericModConfigMenuApi.cs @@ -0,0 +1,82 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using StardewModdingAPI; +using StardewModdingAPI.Utilities; +using StardewValley; + +namespace CloseDoors +{ + /// The API which lets other mods add a config UI through Generic Mod Config Menu. + public interface IGenericModConfigMenuApi + { + /********* + ** Methods + *********/ + /**** + ** Must be called first + ****/ + /// Register a mod whose config can be edited through the UI. + /// The mod's manifest. + /// Reset the mod's config to its default values. + /// Save the mod's current config to the config.json file. + /// Whether the options can only be edited from the title screen. + /// Each mod can only be registered once, unless it's deleted via before calling this again. + void Register(IManifest mod, Action reset, Action save, bool titleScreenOnly = false); + + /// Add a key binding at the current position in the form. + /// The mod's manifest. + /// Get the current value from the mod config. + /// Set a new value in the mod config. + /// The label text to show in the form. + /// The tooltip text shown when the cursor hovers on the field, or null to disable the tooltip. + /// The unique field ID for use with , or null to auto-generate a randomized ID. + void AddKeybind(IManifest mod, Func getValue, Action setValue, Func name, Func tooltip = null, string fieldId = null); + + /// Add a boolean option at the current position in the form. + /// The mod's manifest. + /// Get the current value from the mod config. + /// Set a new value in the mod config. + /// The label text to show in the form. + /// The tooltip text shown when the cursor hovers on the field, or null to disable the tooltip. + /// The unique field ID for use with , or null to auto-generate a randomized ID. + + /// Add a key binding list at the current position in the form. + /// The mod's manifest. + /// Get the current value from the mod config. + /// Set a new value in the mod config. + /// The label text to show in the form. + /// The tooltip text shown when the cursor hovers on the field, or null to disable the tooltip. + /// The unique field ID for use with , or null to auto-generate a randomized ID. + void AddKeybindList(IManifest mod, Func getValue, Action setValue, Func name, Func tooltip = null, string fieldId = null); + + void AddBoolOption(IManifest mod, Func getValue, Action setValue, Func name, Func tooltip = null, string fieldId = null); + + /// Add an integer option at the current position in the form. + /// The mod's manifest. + /// Get the current value from the mod config. + /// Set a new value in the mod config. + /// The label text to show in the form. + /// The tooltip text shown when the cursor hovers on the field, or null to disable the tooltip. + /// The minimum allowed value, or null to allow any. + /// The maximum allowed value, or null to allow any. + /// The interval of values that can be selected. + /// The unique field ID for use with , or null to auto-generate a randomized ID. + void AddNumberOption(IManifest mod, Func getValue, Action setValue, Func name, Func tooltip = null, int? min = null, int? max = null, int? interval = null, string fieldId = null); + + /// Add a string option at the current position in the form. + /// The mod's manifest. + /// Get the current value from the mod config. + /// Set a new value in the mod config. + /// The label text to show in the form. + /// The tooltip text shown when the cursor hovers on the field, or null to disable the tooltip. + /// The values that can be selected, or null to allow any. + /// Get the display text to show for a value from , or null to show the values as-is. + /// The unique field ID for use with , or null to auto-generate a randomized ID. + void AddTextOption(IManifest mod, Func getValue, Action setValue, Func name, Func tooltip = null, string[] allowedValues = null, Func formatAllowedValue = null, string fieldId = null); + + /// Remove a mod from the config UI and delete all its options and pages. + /// The mod's manifest. + void Unregister(IManifest mod); + } +} diff --git a/CloseDoors/Methods.cs b/CloseDoors/Methods.cs new file mode 100644 index 00000000..f83db5e3 --- /dev/null +++ b/CloseDoors/Methods.cs @@ -0,0 +1,43 @@ +using HarmonyLib; +using Microsoft.Xna.Framework; +using StardewModdingAPI; +using StardewValley; +using StardewValley.Audio; +using System; +using System.Collections.Generic; + +namespace CloseDoors +{ + public partial class ModEntry + { + private static bool TryCloseDoor(GameLocation location, Point tilePoint) + { + foreach (var d in location.interiorDoors.Doors) + { + if (d.Position == tilePoint) + { + if (!d.Value) + return false; + location.playSound("doorClose", Utility.PointToVector2(tilePoint), null, SoundContext.Default); + d.CleanUpLocalState(); + d.ResetLocalState(); + location.interiorDoors[tilePoint] = false; + return true; + } + } + return false; + } + private static bool IsDoorOpen(GameLocation location, Point tilePoint) + { + + foreach (var d in location.interiorDoors.Doors) + { + if (d.Position == tilePoint) + { + return d.Value; + } + } + return false; + } + } +} \ No newline at end of file diff --git a/CloseDoors/ModConfig.cs b/CloseDoors/ModConfig.cs new file mode 100644 index 00000000..7c83941c --- /dev/null +++ b/CloseDoors/ModConfig.cs @@ -0,0 +1,10 @@ +using StardewModdingAPI; +using StardewModdingAPI.Utilities; + +namespace CloseDoors +{ + public class ModConfig + { + public bool ModEnabled { get; set; } = true; + } +} diff --git a/CloseDoors/ModEntry.cs b/CloseDoors/ModEntry.cs new file mode 100644 index 00000000..b41c1f4c --- /dev/null +++ b/CloseDoors/ModEntry.cs @@ -0,0 +1,71 @@ +using HarmonyLib; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using StardewModdingAPI; +using StardewModdingAPI.Utilities; +using StardewValley; +using StardewValley.Network; +using StardewValley.Projectiles; +using System; +using System.Collections.Generic; + +namespace CloseDoors +{ + /// The mod entry point. + public partial class ModEntry : Mod + { + + public static IMonitor SMonitor; + public static IModHelper SHelper; + public static ModConfig Config; + + public static ModEntry context; + + public static string CloseDoorsKey = "aedenthorn.CloseDoors"; + + + /// The mod entry point, called after the mod is first loaded. + /// Provides simplified APIs for writing mods. + public override void Entry(IModHelper helper) + { + Config = Helper.ReadConfig(); + + context = this; + + SMonitor = Monitor; + SHelper = helper; + + helper.Events.GameLoop.GameLaunched += GameLoop_GameLaunched; + + var harmony = new Harmony(ModManifest.UniqueID); + harmony.PatchAll(); + + } + + private void GameLoop_GameLaunched(object sender, StardewModdingAPI.Events.GameLaunchedEventArgs e) + { + + // get Generic Mod Config Menu's API (if it's installed) + var configMenu = Helper.ModRegistry.GetApi("spacechase0.GenericModConfigMenu"); + if (configMenu is not null) + { + + // register mod + configMenu.Register( + mod: ModManifest, + reset: () => Config = new ModConfig(), + save: () => Helper.WriteConfig(Config) + ); + + configMenu.AddBoolOption( + mod: ModManifest, + name: () => Helper.Translation.Get("GMCM_Option_ModEnabled_Name"), + getValue: () => Config.ModEnabled, + setValue: value => Config.ModEnabled = value + ); + + } + + } + } +} \ No newline at end of file diff --git a/CloseDoors/i18n/default.json b/CloseDoors/i18n/default.json new file mode 100644 index 00000000..d6dcbffe --- /dev/null +++ b/CloseDoors/i18n/default.json @@ -0,0 +1,16 @@ +{ + "GMCM_Option_ModEnabled_Name": "Mod Enabled", + "GMCM_Option_EatTrigger_Name": "Eat Trigger", + "GMCM_Option_EatLastSeconds_Name": "Duration (s)", + "GMCM_Option_TransformKey_Name": "Key Trigger", + "GMCM_Option_FireKey_Name": "Fire Key", + "GMCM_Option_MoveSpeed_Name": "Move Speed", + "GMCM_Option_Defense_Name": "Defense", + "GMCM_Option_StaminaUse_Name": "Stamina Use", + "GMCM_Option_FireDamage_Name": "Fire Damage", + "GMCM_Option_FireDistance_Name": "Fire Distance", + "GMCM_Option_TransformSound_Name": "Transform Sound", + "GMCM_Option_FireSound_Name": "Mod", + "dino-form": "Dino Form", + "dino-buff-description": "Speed {0}\nDefense +{1}\nDemolish\nFire Breath" +} \ No newline at end of file diff --git a/CloseDoors/manifest.json b/CloseDoors/manifest.json new file mode 100644 index 00000000..01e7da24 --- /dev/null +++ b/CloseDoors/manifest.json @@ -0,0 +1,16 @@ +{ + "Name": "Close Doors", + "Author": "aedenthorn", + "Version": "0.1.0", + "Description": "Close Doors.", + "UniqueID": "aedenthorn.CloseDoors", + "EntryDll": "CloseDoors.dll", + "MinimumApiVersion": "3.99.0", + "ModUpdater": { + "Repository": "StardewValleyMods", + "User": "aedenthorn", + "Directory": "_releases", + "ModFolder": "CloseDoors" + }, + "UpdateKeys": [ "Nexus:" ] +} \ No newline at end of file diff --git a/FastForward/FastForward.csproj b/FastForward/FastForward.csproj index 1455fc54..25171773 100644 --- a/FastForward/FastForward.csproj +++ b/FastForward/FastForward.csproj @@ -1,7 +1,7 @@  1.0.0 - net5.0 + net6.0 true AnyCPU;x64 @@ -12,15 +12,6 @@ - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest diff --git a/FastForward/OrderData.cs b/FastForward/OrderData.cs deleted file mode 100644 index 0d451d07..00000000 --- a/FastForward/OrderData.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace FastForward -{ - internal class OrderData - { - public int dish; - public string dishName; - public bool loved; - - public OrderData(int dish, string dishName, bool loved) - { - this.dish = dish; - this.dishName = dishName; - this.loved = loved; - } - } -} \ No newline at end of file diff --git a/FreeLove/FarmerPatches.cs b/FreeLove/FarmerPatches.cs index 68b03b27..af47bf1c 100644 --- a/FreeLove/FarmerPatches.cs +++ b/FreeLove/FarmerPatches.cs @@ -25,7 +25,7 @@ public static bool Farmer_doDivorce_Prefix(ref Farmer __instance) { Monitor.Log("Trying to divorce"); __instance.divorceTonight.Value = false; - if (!__instance.isMarried() || ModEntry.spouseToDivorce == null) + if (!__instance.isMarriedOrRoommates() || ModEntry.spouseToDivorce == null) { Monitor.Log("Tried to divorce but no spouse to divorce!"); return false; @@ -66,7 +66,7 @@ public static bool Farmer_doDivorce_Prefix(ref Farmer __instance) Helper.GameContent.InvalidateCache("Maps/FarmHouse1_marriage"); Helper.GameContent.InvalidateCache("Maps/FarmHouse2_marriage"); - Monitor.Log($"New spouse: {__instance.spouse}, married {__instance.isMarried()}"); + Monitor.Log($"New spouse: {__instance.spouse}, married {__instance.isMarriedOrRoommates()}"); Utility.getHomeOfFarmer(__instance).showSpouseRoom(); Utility.getHomeOfFarmer(__instance).setWallpapers(); diff --git a/FreeLove/FreeLove.csproj b/FreeLove/FreeLove.csproj index b4094f94..a5d082ac 100644 --- a/FreeLove/FreeLove.csproj +++ b/FreeLove/FreeLove.csproj @@ -1,7 +1,7 @@ 1.0.0 - net5.0 + net6.0 true AnyCPU;x64 diff --git a/FreeLove/LocationPatches.cs b/FreeLove/LocationPatches.cs index afd6dc1f..310d996e 100644 --- a/FreeLove/LocationPatches.cs +++ b/FreeLove/LocationPatches.cs @@ -52,7 +52,7 @@ public static bool FarmHouse_getSpouseBedSpot_Prefix(FarmHouse __instance, strin if (!spouses.TryGetValue(spouseName, out NPC spouse) || spouse is null || spouse.isMoving() || !ModEntry.IsInBed(__instance, spouse.GetBoundingBox())) return true; - __result = spouse.getTileLocationPoint(); + __result = spouse.TilePoint; return false; } catch (Exception ex) @@ -82,7 +82,7 @@ public static bool Beach_checkAction_Prefix(Beach __instance, Location tileLocat { try { - if (___oldMariner != null && ___oldMariner.getTileX() == tileLocation.X && ___oldMariner.getTileY() == tileLocation.Y) + if (___oldMariner != null && ___oldMariner.TilePoint.X == tileLocation.X && ___oldMariner.TilePoint.Y == tileLocation.Y) { string playerTerm = Game1.content.LoadString("Strings\\Locations:Beach_Mariner_Player_" + (who.IsMale ? "Male" : "Female")); if (who.hasAFriendWithHeartLevel(10, true) && who.HouseUpgradeLevel == 0) @@ -123,12 +123,7 @@ public static void GameLocation_checkEventPrecondition_Prefix(ref string precond string[] split = precondition.Split('/'); if (split.Length == 0) return; - int eventId; - if (!int.TryParse(split[0], out eventId)) - { - return; - } - if (Game1.player.eventsSeen.Contains(eventId)) + if (Game1.player.eventsSeen.Contains(split[0])) { return; } @@ -165,37 +160,13 @@ public static void GameLocation_checkEventPrecondition_Prefix(ref string precond } } - - public static void Desert_getDesertMerchantTradeStock_Postfix(Farmer who, ref Dictionary __result) - { - try - { - if (who != null && who.getFriendshipHeartLevelForNPC("Krobus") >= 10 && !who.friendshipData["Krobus"].RoommateMarriage && who.HouseUpgradeLevel >= 1 && (who.isMarried() || who.isEngaged()) && !who.hasItemInInventory(808, 1, 0)) - { - ISalable i = new StardewValley.Object(808, 1, false, -1, 0); - __result.Add(i, new int[] - { - 0, - 1, - 769, - 200 - }); - } - } - catch (Exception ex) - { - Monitor.Log($"Failed in {nameof(Desert_getDesertMerchantTradeStock_Postfix)}:\n{ex}", LogLevel.Error); - } - } - - public static bool ManorHouse_performAction_Prefix(ManorHouse __instance, string action, Farmer who, ref bool __result) { try { ModEntry.ResetSpouses(who); Dictionary spouses = ModEntry.GetSpouses(who, true); - if (action != null && who.IsLocalPlayer && !Game1.player.divorceTonight.Value && (Game1.player.isMarried() || spouses.Count > 0)) + if (action != null && who.IsLocalPlayer && !Game1.player.divorceTonight.Value && (Game1.player.isMarriedOrRoommates() || spouses.Count > 0)) { string a = action.Split(new char[] { @@ -248,13 +219,13 @@ public static bool GameLocation_answerDialogueAction_Prefix(string questionAndAn else { Game1.player.Money -= Config.PendantPrice; - Game1.player.addItemByMenuIfNecessary(new Object(460, 1, false, -1, 0) + Game1.player.addItemByMenuIfNecessary(new Object("(O)460", 1, false, -1, 0) { specialItem = true }, null); if (Game1.activeClickableMenu == null) { - Game1.player.holdUpItemThenMessage(new Object(460, 1, false, -1, 0), true); + Game1.player.holdUpItemThenMessage(new Object("(O)460", 1, false, -1, 0), true); } } __result = true; diff --git a/FreeLove/Misc.cs b/FreeLove/Misc.cs index 5ad7177e..0c792710 100644 --- a/FreeLove/Misc.cs +++ b/FreeLove/Misc.cs @@ -168,7 +168,7 @@ public static void PlaceSpousesInFarmhouse(FarmHouse farmHouse) { SMonitor.Log("made patio spouse: " + spouse.Name); spouse.setUpForOutdoorPatioActivity(); - SMonitor.Log($"{spouse.Name} at {spouse.currentLocation.Name} {spouse.getTileLocation()}"); + SMonitor.Log($"{spouse.Name} at {spouse.currentLocation.Name} {spouse.TilePoint}"); } } } @@ -228,7 +228,7 @@ public static void PlaceSpousesInFarmhouse(FarmHouse farmHouse) { spouse.setTilePosition(farmHouse.getRandomOpenPointInHouse(myRand)); spouse.faceDirection(myRand.Next(0, 4)); - SMonitor.Log($"{spouse.Name} spouse random loc {spouse.getTileLocationPoint()}"); + SMonitor.Log($"{spouse.Name} spouse random loc {spouse.TilePoint}"); spouse.setRandomAfternoonMarriageDialogue(Game1.timeOfDay, farmHouse, false); } } diff --git a/FreeLove/ModEntry.cs b/FreeLove/ModEntry.cs index 21187b8f..2600811a 100644 --- a/FreeLove/ModEntry.cs +++ b/FreeLove/ModEntry.cs @@ -4,8 +4,10 @@ using StardewValley; using StardewValley.Characters; using StardewValley.Events; +using StardewValley.GameData.Shops; using StardewValley.Locations; using StardewValley.Menus; +using StardewValley.Pathfinding; using System; using System.Collections.Generic; using System.Linq; @@ -194,11 +196,6 @@ public override void Entry(IModHelper helper) original: AccessTools.Method(typeof(GameLocation), "checkEventPrecondition"), prefix: new HarmonyMethod(typeof(LocationPatches), nameof(LocationPatches.GameLocation_checkEventPrecondition_Prefix)) ); - - harmony.Patch( - original: AccessTools.Method(typeof(Desert), nameof(Desert.getDesertMerchantTradeStock)), - postfix: new HarmonyMethod(typeof(LocationPatches), nameof(LocationPatches.Desert_getDesertMerchantTradeStock_Postfix)) - ); harmony.Patch( original: AccessTools.Method(typeof(ManorHouse), nameof(ManorHouse.performAction)), @@ -246,7 +243,7 @@ public override void Entry(IModHelper helper) ); harmony.Patch( - original: AccessTools.Method(typeof(Farmer), nameof(Farmer.isMarried)), + original: AccessTools.Method(typeof(Farmer), nameof(Farmer.isMarriedOrRoommates)), prefix: new HarmonyMethod(typeof(FarmerPatches), nameof(FarmerPatches.Farmer_isMarried_Prefix)) ); @@ -288,7 +285,7 @@ public override void Entry(IModHelper helper) ); harmony.Patch( - original: AccessTools.Method(typeof(SocialPage), nameof(SocialPage.isMarriedToAnyone)), + original: AccessTools.Method(typeof(SocialPage.SocialEntry), nameof(SocialPage.SocialEntry.IsMarriedToAnyone)), prefix: new HarmonyMethod(typeof(UIPatches), nameof(UIPatches.SocialPage_isMarriedToAnyone_Prefix)) ); @@ -305,7 +302,7 @@ public override void Entry(IModHelper helper) prefix: new HarmonyMethod(typeof(EventPatches), nameof(EventPatches.Event_answerDialogueQuestion_Prefix)) ); harmony.Patch( - original: AccessTools.Method(typeof(Event), nameof(Event.command_loadActors)), + original: AccessTools.Method(typeof(Event), nameof(Event.DefaultCommands.LoadActors)), prefix: new HarmonyMethod(typeof(EventPatches), nameof(EventPatches.Event_command_loadActors_Prefix)), postfix: new HarmonyMethod(typeof(EventPatches), nameof(EventPatches.Event_command_loadActors_Postfix)) ); @@ -325,12 +322,30 @@ public override object GetApi() return new FreeLoveAPI(); } - private void Content_AssetRequested(object sender, StardewModdingAPI.Events.AssetRequestedEventArgs e) { if (!Config.EnableMod) return; - if (e.NameWithoutLocale.IsEquivalentTo("Data/Events/HaleyHouse")) + if (e.NameWithoutLocale.IsEquivalentTo("Data/Shops")) + { + e.Edit(delegate (IAssetData data) + { + var dict = data.AsDictionary(); + try + { + for(int i = 0; i < dict.Data["DesertTrade"].Items.Count; i++) + { + if (dict.Data["DesertTrade"].Items[i].ItemId == "(O)808") + dict.Data["DesertTrade"].Items[i].Condition = "PLAYER_FARMHOUSE_UPGRADE Current 1, !PLAYER_HAS_ITEM Current 808"; + } + } + catch + { + + } + }); + } + else if (e.NameWithoutLocale.IsEquivalentTo("Data/Events/HaleyHouse")) { e.Edit(delegate (IAssetData idata) { diff --git a/FreeLove/NPCPatches.cs b/FreeLove/NPCPatches.cs index 9fc92958..b1641ddd 100644 --- a/FreeLove/NPCPatches.cs +++ b/FreeLove/NPCPatches.cs @@ -2,7 +2,9 @@ using Microsoft.Xna.Framework; using StardewModdingAPI; using StardewValley; +using StardewValley.Audio; using StardewValley.Characters; +using StardewValley.Extensions; using StardewValley.Locations; using StardewValley.Network; using System; @@ -193,7 +195,7 @@ internal static void NPC_GetDispositionModifiedString_Prefix(NPC __instance, ref { try { - if (Game1.player.isMarried() && Game1.player.friendshipData.ContainsKey(__instance.Name) && Game1.player.friendshipData[__instance.Name].IsMarried() && Game1.player.spouse != __instance.Name) + if (Game1.player.isMarriedOrRoommates() && Game1.player.friendshipData.ContainsKey(__instance.Name) && Game1.player.friendshipData[__instance.Name].IsMarried() && Game1.player.spouse != __instance.Name) { ModEntry.tempOfficialSpouse = __instance; __state = true; @@ -400,7 +402,7 @@ public static bool NPC_spouseObstacleCheck_Prefix(NPC __instance, GameLocation c { if (!Config.EnableMod || currentLocation is not FarmHouse) return true; - if (NPC.checkTileOccupancyForSpouse(currentLocation, __instance.getTileLocation(), __instance.Name)) + if (NPC.checkTileOccupancyForSpouse(currentLocation, __instance.Tile, __instance.Name)) { Game1.warpCharacter(__instance, __instance.DefaultMap, (Game1.getLocationFromName(__instance.DefaultMap) as FarmHouse).getSpouseBedSpot(__instance.Name)); __instance.faceDirection(1); @@ -521,7 +523,7 @@ public static void NPC_loadCurrentDialogue_Postfix(string __state) public static bool NPC_checkAction_Prefix(ref NPC __instance, ref Farmer who, GameLocation l, ref bool __result) { - if (!Config.EnableMod || __instance.IsInvisible || __instance.isSleeping.Value || !who.canMove || who.checkForQuestComplete(__instance, -1, -1, who.ActiveObject, null, -1, 5) || (who.pantsItem.Value?.ParentSheetIndex == 15 && (__instance.Name.Equals("Lewis") || __instance.Name.Equals("Marnie"))) || (__instance.Name.Equals("Krobus") && who.hasQuest(28))) + if (!Config.EnableMod || __instance.IsInvisible || __instance.isSleeping.Value || !who.canMove || who.checkForQuestComplete(__instance, -1, -1, who.ActiveObject, null, -1, 5) || (who.pantsItem.Value?.ParentSheetIndex == 15 && (__instance.Name.Equals("Lewis") || __instance.Name.Equals("Marnie"))) || (__instance.Name.Equals("Krobus") && who.hasQuest("28"))) return true; try @@ -534,14 +536,16 @@ public static bool NPC_checkAction_Prefix(ref NPC __instance, ref Farmer who, Ga __instance.faceDirection(-3); - if (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points >= 3125 && !who.mailReceived.Contains("CF_Spouse")) + if (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points >= 3125 && who.mailReceived.Add("CF_Spouse")) { Monitor.Log($"getting starfruit"); - __instance.CurrentDialogue.Push(new Dialogue(Game1.content.LoadString(Game1.player.isRoommate(who.spouse) ? "Strings\\StringsFromCSFiles:Krobus_Stardrop" : "Strings\\StringsFromCSFiles:NPC.cs.4001"), __instance)); - Game1.player.addItemByMenuIfNecessary(new Object(Vector2.Zero, 434, "Cosmic Fruit", false, false, false, false), null); + __instance.CurrentDialogue.Push(new Dialogue(__instance, Game1.player.isRoommate(who.spouse) ? "Strings\\StringsFromCSFiles:Krobus_Stardrop" : "Strings\\StringsFromCSFiles:NPC.cs.4001", false)); + Object stardrop = ItemRegistry.Create("(O)434", 1, 0, false); + stardrop.CanBeSetDown = false; + stardrop.CanBeGrabbed = false; + Game1.player.addItemByMenuIfNecessary(stardrop, null); __instance.shouldSayMarriageDialogue.Value = false; __instance.currentMarriageDialogue.Clear(); - who.mailReceived.Add("CF_Spouse"); __result = true; return false; } @@ -642,7 +646,7 @@ public static bool NPC_checkAction_Prefix(ref NPC __instance, ref Farmer who, Ga Monitor.Log($"Hugging {__instance.Name}"); ModEntry.mp.broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite[] { - new TemporaryAnimatedSprite("LooseSprites\\emojis", new Microsoft.Xna.Framework.Rectangle(0, 0, 9, 9), 2000f, 1, 0, new Vector2((float)__instance.getTileX(), (float)__instance.getTileY()) * 64f + new Vector2(16f, -64f), false, false, 1f, 0f, Color.White, 4f, 0f, 0f, 0f, false) + new TemporaryAnimatedSprite("LooseSprites\\emojis", new Microsoft.Xna.Framework.Rectangle(0, 0, 9, 9), 2000f, 1, 0, new Vector2((float)__instance.Tile.X, (float)__instance.Tile.Y) * 64f + new Vector2(16f, -64f), false, false, 1f, 0f, Color.White, 4f, 0f, 0f, 0f, false) { motion = new Vector2(0f, -0.5f), alphaFade = 0.01f @@ -654,14 +658,14 @@ public static bool NPC_checkAction_Prefix(ref NPC __instance, ref Farmer who, Ga Monitor.Log($"Kissing {__instance.Name}"); ModEntry.mp.broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite[] { - new TemporaryAnimatedSprite("LooseSprites\\Cursors", new Microsoft.Xna.Framework.Rectangle(211, 428, 7, 6), 2000f, 1, 0, new Vector2((float)__instance.getTileX(), (float)__instance.getTileY()) * 64f + new Vector2(16f, -64f), false, false, 1f, 0f, Color.White, 4f, 0f, 0f, 0f, false) + new TemporaryAnimatedSprite("LooseSprites\\Cursors", new Microsoft.Xna.Framework.Rectangle(211, 428, 7, 6), 2000f, 1, 0, new Vector2((float)__instance.Tile.X, (float)__instance.Tile.Y) * 64f + new Vector2(16f, -64f), false, false, 1f, 0f, Color.White, 4f, 0f, 0f, 0f, false) { motion = new Vector2(0f, -0.5f), alphaFade = 0.01f } }); } - __instance.currentLocation.playSound("dwop", NetAudio.SoundContext.NPC); + __instance.currentLocation.playSound("dwop", null, null, SoundContext.NPC); who.exhausted.Value = false; } @@ -699,6 +703,8 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme { try { + Friendship friendship; + who.friendshipData.TryGetValue(__instance.Name, out friendship); string safe_name = __instance.Name.ToLower().Replace(' ', '_'); if (who.ActiveObject.HasContextTag("propose_roommate_" + safe_name)) { @@ -729,7 +735,7 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme { who.spouse = __instance.Name; ModEntry.ResetSpouses(who); - Game1.currentLocation.playSound("dwop", NetAudio.SoundContext.NPC); + Game1.currentLocation.playSound("dwop", null, null, SoundContext.NPC); if(ModEntry.customSpouseRoomsAPI == null) { FarmHouse fh = Utility.getHomeOfFarmer(who); @@ -741,42 +747,43 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme if (!__instance.datable.Value) { - if (ModEntry.myRand.NextDouble() < 0.5) + if (Game1.random.NextBool()) { Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3955", __instance.displayName)); - return false; } - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3956") : Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3957"), __instance)); + else + { + __instance.CurrentDialogue.Push(Game1.random.NextBool() ? new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs.3956", false) : new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs.3957", true)); + } Game1.drawDialogue(__instance); return false; } else { - if (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].IsDating()) + if (friendship?.IsDating() == true) { Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\UI:AlreadyDatingBouquet", __instance.displayName)); return false; } - if (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].IsDivorced()) + if (friendship?.IsDivorced() == true) { - __instance.CurrentDialogue.Push(new Dialogue(Game1.content.LoadString("Strings\\Characters:Divorced_bouquet"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\Characters:Divorced_bouquet", true)); Game1.drawDialogue(__instance); return false; } - if (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points < Config.MinPointsToDate / 2f) + if (friendship?.Points < Config.MinPointsToDate / 2f) { - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3958") : Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3959"), __instance)); + __instance.CurrentDialogue.Push(Game1.random.NextBool() ? new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs.3958", false) : new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs.3959", true)); Game1.drawDialogue(__instance); return false; } - if (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points < Config.MinPointsToDate) + if (friendship?.Points < Config.MinPointsToDate) { - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3960") : Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3961"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs." + Game1.random.Choose("3960", "3961"), false)); Game1.drawDialogue(__instance); return false; } - Friendship friendship = who.friendshipData[__instance.Name]; - if (!friendship.IsDating()) + if (friendship?.IsDating() == false) { friendship.Status = FriendshipStatus.Dating; Multiplayer mp = ModEntry.SHelper.Reflection.GetField(typeof(Game1), "multiplayer").GetValue(); @@ -786,7 +793,7 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme __instance.displayName }); } - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3962") : Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3963"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs." + Game1.random.Choose("3962", "3963"), true)); who.changeFriendship(25, __instance); who.reduceActiveItemByOne(); who.completelyStopAnimatingOrDoingAction(); @@ -802,7 +809,7 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme { Monitor.Log($"Tried to give pendant while engaged"); - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3965") : Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3966"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs." + Game1.random.Choose("3965", "3966"), true)); Game1.drawDialogue(__instance); return false; } @@ -815,7 +822,7 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3969", __instance.displayName)); return false; } - __instance.CurrentDialogue.Push(new Dialogue((__instance.Gender == 1) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3970") : Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3971"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs." + ((__instance.Gender == 1) ? "3970" : "3971"), false)); Game1.drawDialogue(__instance); return false; } @@ -825,13 +832,13 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme if (!who.friendshipData[__instance.Name].ProposalRejected) { - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3972") : Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3973"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs." + Game1.random.Choose("3972", "3973"), false)); Game1.drawDialogue(__instance); who.changeFriendship(-20, __instance); who.friendshipData[__instance.Name].ProposalRejected = true; return false; } - __instance.CurrentDialogue.Push(new Dialogue((ModEntry.myRand.NextDouble() < 0.5) ? Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3974") : Game1.LoadStringByGender(__instance.Gender, "Strings\\StringsFromCSFiles:NPC.cs.3975"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs." + Game1.random.Choose("3974", "3975"), true)); Game1.drawDialogue(__instance); who.changeFriendship(-50, __instance); return false; @@ -850,7 +857,7 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3969", __instance.displayName)); return false; } - __instance.CurrentDialogue.Push(new Dialogue(Game1.content.LoadString("Strings\\StringsFromCSFiles:NPC.cs.3972"), __instance)); + __instance.CurrentDialogue.Push(new Dialogue(__instance, "Strings\\StringsFromCSFiles:NPC.cs.3972", false)); Game1.drawDialogue(__instance); return false; } @@ -858,7 +865,7 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme else if (who.ActiveObject.ParentSheetIndex == 809 && !who.ActiveObject.bigCraftable.Value) { Monitor.Log($"Tried to give movie ticket to {__instance.Name}"); - if (ModEntry.GetSpouses(who, true).ContainsKey(__instance.Name) && Utility.doesMasterPlayerHaveMailReceivedButNotMailForTomorrow("ccMovieTheater") && !__instance.Name.Equals("Krobus") && who.lastSeenMovieWeek.Value < Game1.Date.TotalWeeks && !Utility.isFestivalDay(Game1.dayOfMonth, Game1.currentSeason) && Game1.timeOfDay <= 2100 && __instance.lastSeenMovieWeek.Value < Game1.Date.TotalWeeks && MovieTheater.GetResponseForMovie(__instance) != "reject") + if (ModEntry.GetSpouses(who, true).ContainsKey(__instance.Name) && Utility.doesMasterPlayerHaveMailReceivedButNotMailForTomorrow("ccMovieTheater") && !__instance.Name.Equals("Krobus") && who.lastSeenMovieWeek.Value < Game1.Date.TotalWeeks && !Utility.isFestivalDay(Game1.dayOfMonth, Game1.season) && Game1.timeOfDay <= 2100 && __instance.lastSeenMovieWeek.Value < Game1.Date.TotalWeeks && MovieTheater.GetResponseForMovie(__instance) != "reject") { Monitor.Log($"Tried to give movie ticket to spouse"); foreach (MovieInvitation invitation in who.team.movieInvitations) @@ -878,18 +885,12 @@ public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farme Monitor.Log($"Giving movie ticket to spouse"); - if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.en) - { - __instance.CurrentDialogue.Push(new Dialogue(__instance.GetDispositionModifiedString("Strings\\Characters:MovieInvite_Spouse_" + __instance.Name, new object[0]), __instance)); - } - else if (LocalizedContentManager.CurrentLanguageCode == LocalizedContentManager.LanguageCode.en && ___dialogue != null && ___dialogue.ContainsKey("MovieInvitation")) - { - __instance.CurrentDialogue.Push(new Dialogue(___dialogue["MovieInvitation"], __instance)); - } - else + Dialogue dialogue5; + if ((dialogue5 = Dialogue.TryGetDialogue(__instance, "Strings\\Characters:MovieInvite_Spouse_" + __instance.Name)) == null) { - __instance.CurrentDialogue.Push(new Dialogue(__instance.GetDispositionModifiedString("Strings\\Characters:MovieInvite_Invited", new object[0]), __instance)); + dialogue5 = (__instance.TryGetDialogue("MovieInvitation") ?? new Dialogue(__instance, "Strings\\Characters:MovieInvite_Invited", __instance.GetDispositionModifiedString("Strings\\Characters:MovieInvite_Invited", Array.Empty()))); } + Dialogue acceptDialogue = dialogue5; Game1.drawDialogue(__instance); who.reduceActiveItemByOne(); who.completelyStopAnimatingOrDoingAction(); diff --git a/FreeLove/PathFindControllerPatches.cs b/FreeLove/PathFindControllerPatches.cs index ed6712d9..0f165ab9 100644 --- a/FreeLove/PathFindControllerPatches.cs +++ b/FreeLove/PathFindControllerPatches.cs @@ -61,13 +61,13 @@ private static bool IsColliding(Character c, GameLocation location, Point endPoi { Monitor.Log($"Checking {c.Name} endpoint in farmhouse"); - using (IEnumerator characters = location.getCharacters().GetEnumerator()) + using (IEnumerator characters = location.characters.GetEnumerator()) { while (characters.MoveNext()) { if(characters.Current != c) { - if(characters.Current.getTileLocationPoint() == endPoint || (characters.Current is NPC && (characters.Current as NPC).controller?.endPoint == endPoint)) + if(characters.Current.TilePoint == endPoint || (characters.Current is NPC && (characters.Current as NPC).controller?.endPoint == endPoint)) { Monitor.Log($"{c.Name} endpoint {endPoint} collides with {characters.Current.Name}"); return true; diff --git a/FreeLove/Pregnancy.cs b/FreeLove/Pregnancy.cs index 36776502..70403c34 100644 --- a/FreeLove/Pregnancy.cs +++ b/FreeLove/Pregnancy.cs @@ -140,12 +140,12 @@ public static bool BirthingEvent_tickUpdate_Prefix(GameTime time, BirthingEvent chance += (Game1.player.hasDarkSkin() ? 0.5 : 0.0); bool isDarkSkinned = new Random((int)Game1.uniqueIDForThisGame + (int)Game1.stats.DaysPlayed).NextDouble() < chance; string newBabyName = ___babyName; - DisposableList all_characters = Utility.getAllCharacters(); + List all_characters = Utility.getAllCharacters(); bool collision_found = false; do { collision_found = false; - using (DisposableList.Enumerator enumerator = all_characters.GetEnumerator()) + using (List.Enumerator enumerator = all_characters.GetEnumerator()) { while (enumerator.MoveNext()) { diff --git a/FreeLove/UIPatches.cs b/FreeLove/UIPatches.cs index 8ff582b9..ad3e4952 100644 --- a/FreeLove/UIPatches.cs +++ b/FreeLove/UIPatches.cs @@ -22,16 +22,17 @@ public static void Initialize(IMonitor monitor, ModConfig config, IModHelper hel Monitor = monitor; Helper = helper; } - public static void SocialPage_drawNPCSlot_prefix(SocialPage __instance, int i, List ___kidsNames, ref Dictionary ___npcNames) + public static void SocialPage_drawNPCSlot_prefix(SocialPage __instance, int i, ref Dictionary ___npcNames) { try { - string name = __instance.names[i] as string; - if (___kidsNames.Contains(name)) + SocialPage.SocialEntry entry = __instance.GetSocialEntry(i); + if (entry.IsChild) { - if (___npcNames[name].EndsWith(")")) + if (entry.DisplayName.EndsWith(")")) { - ___npcNames[name] = string.Join(" ", ___npcNames[name].Split(' ').Reverse().Skip(1).Reverse()); + AccessTools.FieldRefAccess(entry, "DisplayName") = string.Join(" ", entry.DisplayName.Split(' ').Reverse().Skip(1).Reverse()); + __instance.SocialEntries[i] = entry; } } } @@ -40,13 +41,13 @@ public static void SocialPage_drawNPCSlot_prefix(SocialPage __instance, int i, L Monitor.Log($"Failed in {nameof(SocialPage_drawNPCSlot_prefix)}:\n{ex}", LogLevel.Error); } } - public static bool SocialPage_isMarriedToAnyone_Prefix(string name, ref bool __result) + public static bool SocialPage_isMarriedToAnyone_Prefix(SocialPage.SocialEntry __instance, ref bool __result) { try { foreach (Farmer farmer in Game1.getAllFarmers()) { - if (farmer.spouse == name && farmer.friendshipData.TryGetValue(name, out Friendship friendship) && friendship.IsMarried()) + if (farmer.spouse == __instance.InternalName && farmer.friendshipData.TryGetValue(__instance.InternalName, out Friendship friendship) && friendship.IsMarried()) { __result = true; } diff --git a/StardewValleyMods.sln b/StardewValleyMods.sln index ae1aac93..0d08bb00 100644 --- a/StardewValleyMods.sln +++ b/StardewValleyMods.sln @@ -587,6 +587,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdvancedDialogueCommands", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VoicedDialogue", "VoicedDialogue\VoicedDialogue.csproj", "{75EC3555-8390-4DDB-896B-5E9B17571E65}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloseDoors", "CloseDoors\CloseDoors.csproj", "{05FD83DD-D98C-4C4C-812A-03F74C95740D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -2891,6 +2893,14 @@ Global {75EC3555-8390-4DDB-896B-5E9B17571E65}.Release|Any CPU.Build.0 = Release|Any CPU {75EC3555-8390-4DDB-896B-5E9B17571E65}.Release|x64.ActiveCfg = Release|x64 {75EC3555-8390-4DDB-896B-5E9B17571E65}.Release|x64.Build.0 = Release|x64 + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Debug|x64.ActiveCfg = Debug|x64 + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Debug|x64.Build.0 = Debug|x64 + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Release|Any CPU.Build.0 = Release|Any CPU + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Release|x64.ActiveCfg = Release|x64 + {05FD83DD-D98C-4C4C-812A-03F74C95740D}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE