public static void NPC_engagementResponse_Postfix(NPC __instance, Farmer who, bool asRoommate = false) { Monitor.Log($"engagement response for {__instance.Name}"); if (asRoommate) { Monitor.Log($"{__instance.Name} is roomate"); return; } if (!who.friendshipData.ContainsKey(__instance.Name)) { Monitor.Log($"{who.Name} has no friendship data for {__instance.Name}", LogLevel.Error); return; } Misc.ResetSpouses(who); Friendship friendship = who.friendshipData[__instance.Name]; WorldDate weddingDate = new WorldDate(Game1.Date); weddingDate.TotalDays += Math.Max(1, ModEntry.config.DaysUntilMarriage); while (!Game1.canHaveWeddingOnDay(weddingDate.DayOfMonth, weddingDate.Season)) { weddingDate.TotalDays++; } friendship.WeddingDate = weddingDate; Maps.BuildSpouseRooms(Utility.getHomeOfFarmer(who)); }
public static void GameLoop_DayStarted(object sender, DayStartedEventArgs e) { Misc.ResetDivorces(); Helper.Events.GameLoop.OneSecondUpdateTicked += GameLoop_OneSecondUpdateTicked; Misc.ResetSpouses(Game1.player); foreach (GameLocation location in Game1.locations) { if (ReferenceEquals(location.GetType(), typeof(FarmHouse))) { FarmHouse fh = (location as FarmHouse); fh.showSpouseRoom(); Maps.BuildSpouseRooms(fh); Misc.PlaceSpousesInFarmhouse(fh); //location.resetForPlayerEntry(); } } if (Game1.IsMasterGame) { Game1.getFarm().addSpouseOutdoorArea(Game1.player.spouse == null ? "" : Game1.player.spouse); ModEntry.farmHelperSpouse = Misc.GetRandomSpouse(Game1.MasterPlayer); } foreach (Farmer f in Game1.getAllFarmers()) { var spouses = Misc.GetSpouses(f, -1).Keys; foreach (string s in spouses) { Monitor.Log($"{f.Name} is married to {s}"); } } }
public static void NPC_spouseObstacleCheck_Postfix(NPC __instance, bool __result) { try { if (__result && __instance.getSpouse() != null && __instance.currentLocation == Utility.getHomeOfFarmer(__instance.getSpouse())) { Farmer spouse = __instance.getSpouse(); Misc.ResetSpouses(spouse); int offset = 0; if (spouse.spouse != __instance.Name) { int idx = Misc.GetSpouses(spouse, 0).Keys.ToList().IndexOf(__instance.Name); offset = 7 * (idx + 1); } Vector2 spot = ((__instance.currentLocation as FarmHouse).upgradeLevel == 1) ? new Vector2(32f, 5f) : new Vector2(38f, 14f); __instance.setTilePosition((int)spot.X + offset, (int)spot.Y); __instance.faceDirection(ModEntry.myRand.Next(0, 4)); } } catch (Exception ex) { Monitor.Log($"Failed in {nameof(NPC_spouseObstacleCheck_Postfix)}:\n{ex}", LogLevel.Error); } }
public static void GameLoop_SaveLoaded(object sender, SaveLoadedEventArgs e) { ModEntry.spouseToDivorce = null; Misc.SetAllNPCsDatable(); FileIO.LoadTMXSpouseRooms(); Misc.ResetSpouses(Game1.player); Misc.SetNPCRelations(); }
public static bool Farmer_doDivorce_Prefix(ref Farmer __instance) { try { Monitor.Log("Trying to divorce"); __instance.divorceTonight.Value = false; if (!__instance.isMarried() || ModEntry.spouseToDivorce == null) { Monitor.Log("Tried to divorce but no spouse to divorce!"); return(false); } string key = ModEntry.spouseToDivorce; int points = 2000; if (ModEntry.divorceHeartsLost < 0) { points = 0; } else { points -= ModEntry.divorceHeartsLost * 250; } if (__instance.friendshipData.ContainsKey(key)) { Monitor.Log($"Divorcing {key}"); __instance.friendshipData[key].Points = Math.Min(2000, Math.Max(0, points)); Monitor.Log($"Resulting points: {__instance.friendshipData[key].Points}"); __instance.friendshipData[key].Status = points < 1000 ? FriendshipStatus.Divorced : FriendshipStatus.Friendly; Monitor.Log($"Resulting friendship status: {__instance.friendshipData[key].Status}"); __instance.friendshipData[key].RoommateMarriage = false; NPC ex = Game1.getCharacterFromName(key); ex.PerformDivorce(); if (__instance.spouse == key) { __instance.spouse = null; } Misc.ResetSpouses(__instance); Helper.Content.InvalidateCache("Maps/FarmHouse1_marriage"); Helper.Content.InvalidateCache("Maps/FarmHouse2_marriage"); Maps.BuildSpouseRooms(Utility.getHomeOfFarmer(Game1.player)); Game1.getFarm().addSpouseOutdoorArea(__instance.spouse == null ? "" : __instance.spouse); } ModEntry.spouseToDivorce = null; return(false); } catch (Exception ex) { Monitor.Log($"Failed in {nameof(Farmer_doDivorce_Prefix)}:\n{ex}", LogLevel.Error); } return(true); }
public static void FarmHouse_resetLocalState_Postfix(ref FarmHouse __instance) { try { Farmer f = __instance.owner; if (f == null) { return; } ModEntry.PMonitor.Log($"reset farmhouse state - upgrade level {__instance.upgradeLevel}"); Misc.ResetSpouses(f); if (f.currentLocation == __instance && Misc.IsInBed(__instance, f.GetBoundingBox())) { f.position.Value = Misc.GetFarmerBedPosition(__instance); } if (ModEntry.config.CustomBed && __instance.upgradeLevel > 0) { Maps.ReplaceBed(__instance); } if (__instance.upgradeLevel > 0 && __instance.upgradeLevel < 4) { Maps.BuildSpouseRooms(__instance); __instance.setFloors(); } if (Misc.ChangingKidsRoom()) { if (__instance.upgradeLevel > 1 && __instance.upgradeLevel < 4) { NPCPatches.SetCribs(__instance); Maps.ExpandKidsRoom(__instance); } } if (Misc.GetSpouses(f, 0).ContainsKey("Sebastian") && Game1.netWorldState.Value.hasWorldStateID("sebastianFrog")) { if (Game1.random.NextDouble() < 0.1 && Game1.timeOfDay > 610) { DelayedAction.playSoundAfterDelay("croak", 1000, null, -1); } } } catch (Exception ex) { Monitor.Log($"Failed in {nameof(FarmHouse_resetLocalState_Postfix)}:\n{ex}", LogLevel.Error); } }
public static void GameLoop_DayStarted(object sender, DayStartedEventArgs e) { Helper.Events.GameLoop.OneSecondUpdateTicked += GameLoop_OneSecondUpdateTicked; Misc.ResetSpouses(Game1.player); foreach (GameLocation location in Game1.locations) { if (ReferenceEquals(location.GetType(), typeof(FarmHouse))) { (location as FarmHouse).showSpouseRoom(); Maps.BuildSpouseRooms((location as FarmHouse)); Misc.PlaceSpousesInFarmhouse((location as FarmHouse)); } } if (Game1.IsMasterGame) { Game1.getFarm().addSpouseOutdoorArea(Game1.player.spouse == null ? "" : Game1.player.spouse); ModEntry.farmHelperSpouse = Misc.GetRandomSpouse(Game1.MasterPlayer); } }
public static bool ManorHouse_performAction_Prefix(ManorHouse __instance, string action, Farmer who, ref bool __result) { try { Misc.ResetSpouses(who); Dictionary <string, NPC> spouses = Misc.GetSpouses(who, -1); if (action != null && who.IsLocalPlayer && !Game1.player.divorceTonight && (Game1.player.isMarried() || spouses.Count > 0)) { string a = action.Split(new char[] { ' ' })[0]; if (a == "DivorceBook") { string s2 = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Question_" + Game1.player.spouse); if (s2 == null) { s2 = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Question"); } List <Response> responses = new List <Response>(); foreach (NPC spouse in spouses.Values) { responses.Add(new Response(spouse.name, spouse.displayName)); } responses.Add(new Response("No", Game1.content.LoadString("Strings\\Lexicon:QuestionDialogue_No"))); __instance.createQuestionDialogue(s2, responses.ToArray(), Divorce.afterDialogueBehavior); //__instance.createQuestionDialogue(s2, responses.ToArray(), "divorce"); __result = true; return(false); } } } catch (Exception ex) { Monitor.Log($"Failed in {nameof(ManorHouse_performAction_Prefix)}:\n{ex}", LogLevel.Error); } return(true); }
public static bool NPC_tryToReceiveActiveObject_Prefix(NPC __instance, ref Farmer who, Dictionary <string, string> ___dialogue, ref List <int> __state) { try { if (Misc.GetSpouses(who, 1).ContainsKey(__instance.Name)) { __state = new List <int> { who.friendshipData[__instance.Name].GiftsThisWeek, who.friendshipData[__instance.Name].GiftsToday, 0 }; who.friendshipData[__instance.Name].GiftsThisWeek = 0; if (ModEntry.config.MaxGiftsPerDay < 0 || who.friendshipData[__instance.Name].GiftsToday < ModEntry.config.MaxGiftsPerDay) { who.friendshipData[__instance.Name].GiftsToday = 0; } else { who.friendshipData[__instance.Name].GiftsToday = 1; __state[2] = 1; // flag to say we set it to 1 } } if (who.ActiveObject.ParentSheetIndex == 808 && __instance.Name.Equals("Krobus")) { if (who.getFriendshipHeartLevelForNPC(__instance.Name) >= 10 && who.houseUpgradeLevel >= 1 && !who.isEngaged()) { typeof(NPC).GetMethod("engagementResponse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { who, true }); return(false); } } if (who.ActiveObject.ParentSheetIndex == 458) { if (Misc.GetSpouses(who, 1).ContainsKey(__instance.Name)) { who.spouse = __instance.Name; Misc.ResetSpouses(who); Game1.currentLocation.playSound("dwop", NetAudio.SoundContext.NPC); FarmHouse fh = Utility.getHomeOfFarmer(who); if (ModEntry.config.BuildAllSpousesRooms) { Maps.BuildSpouseRooms(fh); } return(false); } if (!__instance.datable) { if (ModEntry.myRand.NextDouble() < 0.5) { 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)); Game1.drawDialogue(__instance); return(false); } else { if (__instance.datable && who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].IsDating()) { Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\UI:AlreadyDatingBouquet", __instance.displayName)); return(false); } if (__instance.datable && who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].IsDivorced()) { if (ModEntry.config.FriendlyDivorce) { who.friendshipData[__instance.Name].Points = ModEntry.config.MinPointsToDate; who.friendshipData[__instance.Name].Status = FriendshipStatus.Friendly; } else { __instance.CurrentDialogue.Push(new Dialogue(Game1.content.LoadString("Strings\\Characters:Divorced_bouquet"), __instance)); Game1.drawDialogue(__instance); return(false); } } if (__instance.datable && who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points < ModEntry.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)); Game1.drawDialogue(__instance); return(false); } if (__instance.datable && who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points < ModEntry.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)); Game1.drawDialogue(__instance); return(false); } Friendship friendship = who.friendshipData[__instance.Name]; if (!friendship.IsDating()) { friendship.Status = FriendshipStatus.Dating; Multiplayer mp = ModEntry.PHelper.Reflection.GetField <Multiplayer>(typeof(Game1), "multiplayer").GetValue(); mp.globalChatInfoMessage("Dating", new string[] { who.Name, __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)); who.changeFriendship(25, __instance); who.reduceActiveItemByOne(); who.completelyStopAnimatingOrDoingAction(); __instance.doEmote(20, true); Game1.drawDialogue(__instance); return(false); } } else if (who.ActiveObject.ParentSheetIndex == 460) { if (who.isEngaged()) { 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)); Game1.drawDialogue(__instance); return(false); } if (!__instance.datable || __instance.isMarriedOrEngaged() || (who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points < ModEntry.config.MinPointsToMarry * 0.6f)) { Monitor.Log($"Tried to give pendant to someone not datable"); if (ModEntry.myRand.NextDouble() < 0.5) { 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)); Game1.drawDialogue(__instance); return(false); } else if (__instance.datable && who.friendshipData.ContainsKey(__instance.Name) && who.friendshipData[__instance.Name].Points < ModEntry.config.MinPointsToMarry) { Monitor.Log($"Tried to give pendant to someone not marriable"); 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)); 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)); Game1.drawDialogue(__instance); who.changeFriendship(-50, __instance); return(false); } else { Monitor.Log($"Tried to give pendant to someone marriable"); if (!__instance.datable || who.houseUpgradeLevel >= 1) { typeof(NPC).GetMethod("engagementResponse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { who, false }); return(false); } Monitor.Log($"Can't marry"); if (ModEntry.myRand.NextDouble() < 0.5) { 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)); Game1.drawDialogue(__instance); return(false); } } else if (who.ActiveObject.parentSheetIndex == 809 && !who.ActiveObject.bigCraftable) { Monitor.Log($"Tried to give movie ticket"); if (Misc.GetSpouses(who, 1).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") { Monitor.Log($"Tried to give movie ticket to spouse"); foreach (MovieInvitation invitation in who.team.movieInvitations) { if (invitation.farmer == who) { return(true); } } foreach (MovieInvitation invitation2 in who.team.movieInvitations) { if (invitation2.invitedNPC == __instance) { return(true); } } 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 { __instance.CurrentDialogue.Push(new Dialogue(__instance.GetDispositionModifiedString("Strings\\Characters:MovieInvite_Invited", new object[0]), __instance)); } Game1.drawDialogue(__instance); who.reduceActiveItemByOne(); who.completelyStopAnimatingOrDoingAction(); who.currentLocation.localSound("give_gift"); MovieTheater.Invite(who, __instance); if (who == Game1.player) { ModEntry.mp.globalChatInfoMessage("MovieInviteAccept", new string[] { Game1.player.displayName, __instance.displayName }); return(false); } } return(true); } } catch (Exception ex) { Monitor.Log($"Failed in {nameof(NPC_tryToReceiveActiveObject_Prefix)}:\n{ex}", LogLevel.Error); } return(true); }
public static bool NPC_checkAction_Prefix(ref NPC __instance, ref Farmer who, ref bool __result) { try { Misc.ResetSpouses(who); if ((__instance.Name.Equals(who.spouse) || Misc.GetSpouses(who, 1).ContainsKey(__instance.Name)) && who.IsLocalPlayer) { int timeOfDay = Game1.timeOfDay; if (__instance.Sprite.CurrentAnimation == null) { __instance.faceDirection(-3); } if (__instance.Sprite.CurrentAnimation == null && who.friendshipData.ContainsKey(__instance.name) && who.friendshipData[__instance.name].Points >= 3125 && !who.mailReceived.Contains("CF_Spouse")) { __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 StardewValley.Object(Vector2.Zero, 434, "Cosmic Fruit", false, false, false, false), null); __instance.shouldSayMarriageDialogue.Value = false; __instance.currentMarriageDialogue.Clear(); who.mailReceived.Add("CF_Spouse"); __result = true; return(false); } if (__instance.Sprite.CurrentAnimation == null && !__instance.hasTemporaryMessageAvailable() && __instance.currentMarriageDialogue.Count == 0 && __instance.CurrentDialogue.Count == 0 && Game1.timeOfDay < 2200 && !__instance.isMoving() && who.ActiveObject == null && (!__instance.hasBeenKissedToday || ModEntry.config.UnlimitedDailyKisses)) { __instance.faceGeneralDirection(who.getStandingPosition(), 0, false); who.faceGeneralDirection(__instance.getStandingPosition(), 0, false); if (__instance.FacingDirection == 3 || __instance.FacingDirection == 1) { int spouseFrame = 28; bool facingRight = true; string name = __instance.Name; if (name == "Sam") { spouseFrame = 36; facingRight = true; } else if (name == "Penny") { spouseFrame = 35; facingRight = true; } else if (name == "Sebastian") { spouseFrame = 40; facingRight = false; } else if (name == "Alex") { spouseFrame = 42; facingRight = true; } else if (name == "Krobus") { spouseFrame = 16; facingRight = true; } else if (name == "Maru") { spouseFrame = 28; facingRight = false; } else if (name == "Emily") { spouseFrame = 33; facingRight = false; } else if (name == "Harvey") { spouseFrame = 31; facingRight = false; } else if (name == "Shane") { spouseFrame = 34; facingRight = false; } else if (name == "Elliott") { spouseFrame = 35; facingRight = false; } else if (name == "Leah") { spouseFrame = 25; facingRight = true; } else if (name == "Abigail") { spouseFrame = 33; facingRight = false; } bool flip = (facingRight && __instance.FacingDirection == 3) || (!facingRight && __instance.FacingDirection == 1); if (who.getFriendshipHeartLevelForNPC(__instance.Name) >= ModEntry.config.MinHeartsForKiss) { int delay = Game1.IsMultiplayer ? 1000 : 10; __instance.movementPause = delay; __instance.Sprite.setCurrentAnimation(new List <FarmerSprite.AnimationFrame> { new FarmerSprite.AnimationFrame(spouseFrame, delay, false, flip, new AnimatedSprite.endOfAnimationBehavior(__instance.haltMe), true) }); if (!__instance.hasBeenKissedToday.Value) { who.changeFriendship(10, __instance); } if (!ModEntry.config.RoommateRomance && who.friendshipData[__instance.Name].RoommateMarriage) { 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) { motion = new Vector2(0f, -0.5f), alphaFade = 0.01f } }); } else { 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) { motion = new Vector2(0f, -0.5f), alphaFade = 0.01f } }); } if (ModEntry.config.RealKissSound && Kissing.kissEffect != null && (ModEntry.config.RoommateRomance || !who.friendshipData[__instance.Name].RoommateMarriage)) { Kissing.kissEffect.Play(); } else { __instance.currentLocation.playSound("dwop", NetAudio.SoundContext.NPC); } who.exhausted.Value = false; __instance.hasBeenKissedToday.Value = true; __instance.Sprite.UpdateSourceRect(); } else { __instance.faceDirection((ModEntry.myRand.NextDouble() < 0.5) ? 2 : 0); __instance.doEmote(12, true); } int playerFaceDirection = 1; if ((facingRight && !flip) || (!facingRight && flip)) { playerFaceDirection = 3; } who.PerformKiss(playerFaceDirection); who.CanMove = false; who.FarmerSprite.PauseForSingleAnimation = false; who.FarmerSprite.animateOnce(new List <FarmerSprite.AnimationFrame> { new FarmerSprite.AnimationFrame(101, 1000, 0, false, who.FacingDirection == 3, null, false, 0), new FarmerSprite.AnimationFrame(6, 1, false, who.FacingDirection == 3, new AnimatedSprite.endOfAnimationBehavior(Farmer.completelyStopAnimating), false) }.ToArray(), null); __result = true; return(false); } } } } catch (Exception ex) { Monitor.Log($"Failed in {nameof(NPC_checkAction_Prefix)}:\n{ex}", LogLevel.Error); } return(true); }
public static void BuildSpouseRooms(FarmHouse farmHouse) { if (config.DisableCustomSpousesRooms) { return; } try { if (farmHouse is Cabin) { Monitor.Log("BuildSpouseRooms for Cabin"); } Farmer f = farmHouse.owner; if (f == null) { return; } Misc.ResetSpouses(f); Monitor.Log("Building all spouse rooms"); if (Misc.GetSpouses(f, 1).Count == 0 || farmHouse.upgradeLevel > 3) { ModEntry.PMonitor.Log("No spouses"); farmHouse.showSpouseRoom(); return; } List <string> spousesWithRooms = new List <string>(); foreach (string spouse in Misc.GetSpouses(f, 1).Keys) { Monitor.Log($"checking {spouse} for spouse room"); if (roomIndexes.ContainsKey(spouse) || tmxSpouseRooms.ContainsKey(spouse)) { Monitor.Log($"Adding {spouse} to list for spouse rooms"); spousesWithRooms.Add(spouse); } } if (spousesWithRooms.Count == 0) { ModEntry.PMonitor.Log("No spouses with rooms"); return; } spousesWithRooms = new List <string>(Misc.ReorderSpousesForRooms(spousesWithRooms)); if (!spousesWithRooms.Any()) { return; } if (!ModEntry.config.BuildAllSpousesRooms) { if (f.spouse != null && !f.friendshipData[f.spouse].IsEngaged() && (roomIndexes.ContainsKey(f.spouse) || tmxSpouseRooms.ContainsKey(f.spouse))) { Monitor.Log($"Building spouse room for official spouse {f.spouse}"); BuildOneSpouseRoom(farmHouse, f.spouse, -1); } else { Monitor.Log($"No spouse room for official spouse {f.spouse}, placing for {spousesWithRooms[0]} instead."); BuildOneSpouseRoom(farmHouse, spousesWithRooms[0], -1); spousesWithRooms = new List <string>(spousesWithRooms.Skip(1)); } return; } Monitor.Log($"Building {spousesWithRooms.Count} additional spouse rooms"); List <string> sheets = new List <string>(); for (int i = 0; i < farmHouse.map.TileSheets.Count; i++) { sheets.Add(farmHouse.map.TileSheets[i].Id); } int untitled = sheets.IndexOf("untitled tile sheet"); int floorsheet = sheets.IndexOf("walls_and_floors"); int indoor = sheets.IndexOf("indoor"); Monitor.Log($"Map has sheets: {string.Join(", ", sheets)}"); int ox = ModEntry.config.ExistingSpouseRoomOffsetX; int oy = ModEntry.config.ExistingSpouseRoomOffsetY; if (farmHouse.upgradeLevel > 1) { ox += 6; oy += 9; } Monitor.Log($"Preliminary adjustments"); for (int i = 0; i < 7; i++) { farmHouse.setMapTileIndex(ox + 29 + i, oy + 11, 0, "Buildings", indoor); farmHouse.removeTile(ox + 29 + i, oy + 9, "Front"); farmHouse.removeTile(ox + 29 + i, oy + 10, "Buildings"); farmHouse.setMapTileIndex(ox + 28 + i, oy + 10, 165, "Front", indoor); farmHouse.removeTile(ox + 29 + i, oy + 10, "Back"); } for (int i = 0; i < 8; i++) { farmHouse.setMapTileIndex(ox + 28 + i, oy + 10, 165, "Front", indoor); } for (int i = 0; i < 10; i++) { farmHouse.removeTile(ox + 35, oy + 0 + i, "Buildings"); farmHouse.removeTile(ox + 35, oy + 0 + i, "Front"); } for (int i = 0; i < 7; i++) { // horiz hall farmHouse.setMapTileIndex(ox + 29 + i, oy + 10, (i % 2 == 0 ? 352: 336), "Back", floorsheet); } for (int i = 0; i < 7; i++) { //farmHouse.removeTile(ox + 28, oy + 4 + i, "Back"); //farmHouse.setMapTileIndex(ox + 28, oy + 4 + i, (i % 2 == 0 ? 352 : ModEntry.config.HallTileEven), "Back", 0); } farmHouse.removeTile(ox + 28, oy + 9, "Front"); farmHouse.removeTile(ox + 28, oy + 10, "Buildings"); if (farmHouse.upgradeLevel > 1) { farmHouse.setMapTileIndex(ox + 28, oy + 10, 163, "Front", indoor); } farmHouse.removeTile(ox + 35, oy + 0, "Front"); farmHouse.removeTile(ox + 35, oy + 0, "Buildings"); int count = -1; ExtendMap(farmHouse, ox + 37 + (7 * spousesWithRooms.Count)); // remove and rebuild spouse rooms for (int j = 0; j < spousesWithRooms.Count; j++) { farmHouse.removeTile(ox + 35 + (7 * count), oy + 0, "Buildings"); for (int i = 0; i < 10; i++) { farmHouse.removeTile(ox + 35 + (7 * count), oy + 1 + i, "Buildings"); } BuildOneSpouseRoom(farmHouse, spousesWithRooms[j], count++); } Monitor.Log($"Building far wall"); // far wall farmHouse.setMapTileIndex(ox + 35 + (7 * count), oy + 0, 11, "Buildings", indoor); for (int i = 0; i < 10; i++) { farmHouse.setMapTileIndex(ox + 35 + (7 * count), oy + 1 + i, 68, "Buildings", indoor); } farmHouse.setMapTileIndex(ox + 35 + (7 * count), oy + 10, 130, "Front", indoor); } catch (Exception ex) { Monitor.Log($"Failed in {nameof(BuildSpouseRooms)}:\n{ex}", LogLevel.Error); } }