public static void PlaceSpousesInFarmhouse(FarmHouse farmHouse) { Farmer farmer = farmHouse.owner; if (farmer == null) { return; } List <NPC> allSpouses = GetSpouses(farmer, 1).Values.ToList(); if (allSpouses.Count == 0) { Monitor.Log("no spouses"); return; } ShuffleList(ref allSpouses); List <string> bedSpouses = new List <string>(); string kitchenSpouse = null; foreach (NPC spouse in allSpouses) { int type = ModEntry.myRand.Next(0, 100); Monitor.Log($"spouse rand {type}, bed: {ModEntry.config.PercentChanceForSpouseInBed} kitchen {ModEntry.config.PercentChanceForSpouseInKitchen}"); if (type < ModEntry.config.PercentChanceForSpouseInBed) { if (bedSpouses.Count < GetBedWidth(farmHouse) && (ModEntry.config.RoommateRomance || !farmer.friendshipData[spouse.Name].IsRoommate()) && HasSleepingAnimation(spouse.Name)) { Monitor.Log("made bed spouse: " + spouse.Name); bedSpouses.Add(spouse.Name); } } else if (type < ModEntry.config.PercentChanceForSpouseInBed + ModEntry.config.PercentChanceForSpouseInKitchen) { if (kitchenSpouse == null) { Monitor.Log("made kitchen spouse: " + spouse.Name); kitchenSpouse = spouse.Name; } } } List <string> allBedSpouses = new List <string>(GetSpouses(farmer, 1).Keys.ToList()); List <NPC> roomSpouses = GetSpouses(farmer, -1).Values.ToList().FindAll((s) => (Maps.roomIndexes.ContainsKey(s.Name) || Maps.tmxSpouseRooms.ContainsKey(s.Name)) && !farmer.friendshipData[s.Name].IsEngaged()); foreach (NPC j in allSpouses) { Monitor.Log("placing " + j.Name); Point kitchenSpot = farmHouse.getKitchenStandingSpot(); Vector2 spouseRoomSpot = (farmHouse.upgradeLevel == 1) ? new Vector2(32f, 5f) : new Vector2(38f, 14f); if (farmer.Equals(Game1.MasterPlayer)) { if (ModEntry.outdoorAreaData.areas.ContainsKey(j.Name)) { SetupSpouseArea(ModEntry.outdoorAreaData.areas[j.Name], j.Name); if (!Game1.isRaining && !Game1.IsWinter && Game1.shortDayNameFromDayOfSeason(Game1.dayOfMonth).Equals("Sat") && !j.Name.Equals("Krobus")) { Monitor.Log("going to outdoor patio"); j.setUpForOutdoorPatioActivity(); continue; } } else if (farmer.spouse.Equals(j.Name)) { OutdoorArea area = new OutdoorArea() { startX = 69, startY = 6, }; SetupSpouseArea(area, j.Name); if (!Game1.isRaining && !Game1.IsWinter && Game1.shortDayNameFromDayOfSeason(Game1.dayOfMonth).Equals("Sat") && !j.Name.Equals("Krobus")) { Monitor.Log("going to outdoor patio"); j.setUpForOutdoorPatioActivity(); continue; } } } if (!farmHouse.Equals(j.currentLocation)) { continue; } Monitor.Log("in farm house"); j.shouldPlaySpousePatioAnimation.Value = false; Vector2 spot = (farmHouse.upgradeLevel == 1) ? new Vector2(32f, 5f) : new Vector2(38f, 14f); if (bedSpouses.Count > 0 && (IsInBed(farmHouse, j.GetBoundingBox()) || bedSpouses.Contains(j.Name))) { Monitor.Log($"putting {j.Name} in bed"); j.position.Value = GetSpouseBedPosition(farmHouse, allBedSpouses, j.Name); if (HasSleepingAnimation(j.Name) && Game1.timeOfDay >= 2000) { j.playSleepingAnimation(); } } else if (kitchenSpouse == j.Name) { Monitor.Log($"{j.Name} is in kitchen"); j.setTilePosition(farmHouse.getKitchenStandingSpot()); } else if (!ModEntry.config.BuildAllSpousesRooms && farmer.spouse != j.Name) { j.setTilePosition(farmHouse.getRandomOpenPointInHouse(ModEntry.myRand)); } else { if (!roomSpouses.Contains(j)) { j.setTilePosition(farmHouse.getRandomOpenPointInHouse(ModEntry.myRand)); j.faceDirection(ModEntry.myRand.Next(0, 4)); Monitor.Log($"{j.Name} spouse random loc"); continue; } else { int offset = roomSpouses.IndexOf(j) * 7; j.setTilePosition((int)spot.X + offset, (int)spot.Y); j.faceDirection(ModEntry.myRand.Next(0, 4)); j.setSpouseRoomMarriageDialogue(); Monitor.Log($"{j.Name} loc: {(spot.X + offset)},{spot.Y}"); } } } }