public static void TrySpousesKiss() { GameLocation location = Game1.currentLocation; if (location == null || !ReferenceEquals(location.GetType(), typeof(FarmHouse))) { return; } Farmer owner = (location as FarmHouse).owner; lastKissTime++; if (location == null || location.characters == null) { return; } List <NPC> list = location.characters.ToList(); Misc.ShuffleList(ref list); foreach (NPC npc1 in list) { if (!owner.friendshipData.ContainsKey(npc1.Name)) { continue; } if (!ModEntry.config.RoommateRomance && owner.friendshipData[npc1.Name].RoommateMarriage) { continue; } foreach (NPC npc2 in list) { if (!owner.friendshipData.ContainsKey(npc2.Name)) { continue; } if (npc1.Name == npc2.Name || (!ModEntry.config.RoommateRomance && owner.friendshipData[npc2.Name].RoommateMarriage)) { continue; } if (lastKissTime >= ModEntry.config.MinSpouseKissInterval) { kissingSpouses.Clear(); } float distance = Vector2.Distance(npc1.position, npc2.position); if ( npc1.getSpouse() != null && npc2.getSpouse() != null && npc1.getSpouse().Name == npc2.getSpouse().Name && distance < ModEntry.config.MaxDistanceToKiss && !kissingSpouses.Contains(npc1.Name) && !kissingSpouses.Contains(npc2.Name) && owner.getFriendshipHeartLevelForNPC(npc1.Name) >= ModEntry.config.MinHeartsForKiss && owner.getFriendshipHeartLevelForNPC(npc2.Name) >= ModEntry.config.MinHeartsForKiss && lastKissTime > ModEntry.config.MinSpouseKissInterval && ModEntry.myRand.NextDouble() < ModEntry.config.SpouseKissChance && (!ModEntry.config.PreventRelativesFromKissing || !Misc.AreSpousesRelated(npc1.Name, npc2.Name)) ) { kissingSpouses.Add(npc1.Name); kissingSpouses.Add(npc2.Name); ModEntry.PMonitor.Log("spouses kissing"); lastKissTime = 0; Vector2 npc1pos = npc1.position; Vector2 npc2pos = npc2.position; int npc1face = npc1.facingDirection; int npc2face = npc1.facingDirection; Vector2 midpoint = new Vector2((npc1.position.X + npc2.position.X) / 2, (npc1.position.Y + npc2.position.Y) / 2); PerformKiss(npc1, midpoint, npc2.Name); PerformKiss(npc2, midpoint, npc1.Name); DelayedAction action = new DelayedAction(1000); var t = Task.Run(async delegate { await Task.Delay(TimeSpan.FromSeconds(1)); npc1.position.Value = npc1pos; npc2.position.Value = npc2pos; npc1.FacingDirection = npc1face; npc2.FacingDirection = npc2face; return; }); } } } }