public static void GameLocation_checkEventPrecondition_Prefix(ref string precondition)
        {
            try
            {
                if (precondition == null || precondition == "")
                {
                    return;
                }
                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))
                {
                    return;
                }
                Dictionary <string, NPC> spouses = Misc.GetSpouses(Game1.player, -1);
                for (int i = 1; i < split.Length; i++)
                {
                    if (split[i].Length == 0)
                    {
                        continue;
                    }

                    if (split[i][0] == 'O')
                    {
                        string name = split[i].Substring(2);
                        if (Game1.player.spouse != name && spouses.ContainsKey(name))
                        {
                            Monitor.Log($"Got unofficial spouse requirement for event: {name}, switching event condition to isSpouse O");
                            split[i] = $"o {name}";
                        }
                    }
                    else if (split[i][0] == 'o')
                    {
                        string name = split[i].Substring(2);
                        if (Game1.player.spouse != name && spouses.ContainsKey(name))
                        {
                            Monitor.Log($"Got unofficial spouse barrier to event: {name}, switching event condition to notSpouse o");
                            split[i] = $"O {name}";
                        }
                    }
                }
                precondition = string.Join("/", split);
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(GameLocation_checkEventPrecondition_Prefix)}:\n{ex}", LogLevel.Error);
            }
        }
Beispiel #2
0
        public static void DialogueBox_Prefix(ref List <string> dialogues)
        {
            try
            {
                if (dialogues[1] == Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1826"))
                {
                    List <string> newDialogues = new List <string>()
                    {
                        dialogues[0]
                    };



                    List <NPC> spouses = Misc.GetSpouses(Game1.player, 1).Values.OrderBy(o => Game1.player.friendshipData[o.Name].Points).Reverse().Take(4).ToList();

                    List <int> which = new List <int> {
                        0, 1, 2, 3
                    };

                    Misc.ShuffleList(ref which);

                    List <int> myWhich = new List <int>(which).Take(spouses.Count).ToList();

                    for (int i = 0; i < spouses.Count; i++)
                    {
                        switch (which[i])
                        {
                        case 0:
                            newDialogues.Add(Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1827", spouses[i].displayName));
                            break;

                        case 1:
                            newDialogues.Add(((spouses[i].Gender == 0) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1832") : Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1834")) + " " + ((spouses[i].Gender == 0) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1837", spouses[i].displayName[0]) : Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1838", spouses[i].displayName[0])));
                            break;

                        case 2:
                            newDialogues.Add(Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1843", spouses[i].displayName));
                            break;

                        case 3:
                            newDialogues.Add(((spouses[i].Gender == 0) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1831") : Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1833")) + " " + ((spouses[i].Gender == 0) ? Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1837", spouses[i].displayName[0]) : Game1.content.LoadString("Strings\\StringsFromCSFiles:Event.cs.1838", spouses[i].displayName[i])));
                            break;
                        }
                    }
                    dialogues = new List <string>(newDialogues);
                }
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(DialogueBox_Prefix)}:\n{ex}", LogLevel.Error);
            }
        }
Beispiel #3
0
        public static bool Utility_pickPersonalFarmEvent_Prefix(ref FarmEvent __result)
        {
            lastBirthingSpouse = null;
            lastPregnantSpouse = null;
            ModEntry.PMonitor.Log("picking event");
            if (Game1.weddingToday)
            {
                __result = null;
                return(false);
            }

            List <NPC> allSpouses = Misc.GetSpouses(Game1.player, 1).Values.ToList();

            Misc.ShuffleList(ref allSpouses);

            foreach (NPC spouse in allSpouses)
            {
                Farmer f = spouse.getSpouse();

                Friendship friendship = f.friendshipData[spouse.Name];

                if (friendship.DaysUntilBirthing <= 0 && friendship.NextBirthingDate != null)
                {
                    lastBirthingSpouse = spouse;
                    __result           = new BirthingEvent();
                    return(false);
                }
            }
            foreach (NPC spouse in allSpouses)
            {
                Farmer f = spouse.getSpouse();
                if (!ModEntry.config.RoommateRomance && f.friendshipData[spouse.Name].RoommateMarriage)
                {
                    continue;
                }

                int          heartsWithSpouse = f.getFriendshipHeartLevelForNPC(spouse.Name);
                Friendship   friendship       = f.friendshipData[spouse.Name];
                List <Child> kids             = f.getChildren();
                bool         can = spouse.daysAfterLastBirth <= 0 && Utility.getHomeOfFarmer(f).upgradeLevel >= 2 && friendship.DaysUntilBirthing < 0 && heartsWithSpouse >= 10 && friendship.DaysMarried >= 7 && (ModEntry.config.MaxChildren < 0 || kids.Count == 0 || (kids.Count < ModEntry.config.MaxChildren));
                ModEntry.PMonitor.Log($"Checking ability to get pregnant: {spouse.Name} {can}{(friendship.DaysUntilBirthing >= 0 ? " Already pregnant! Gives birth in: "+friendship.DaysUntilBirthing:"")}");
                if (can && Game1.player.currentLocation == Game1.getLocationFromName(Game1.player.homeLocation) && ModEntry.myRand.NextDouble() < ModEntry.config.BabyRequestChance)
                {
                    ModEntry.PMonitor.Log("Making a baby!");
                    lastPregnantSpouse = spouse;
                    __result           = new QuestionEvent(1);
                    return(false);
                }
            }
            return(true);
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        public static void FarmHouse_getWalls_Postfix(FarmHouse __instance, ref List <Microsoft.Xna.Framework.Rectangle> __result)
        {
            try
            {
                //Monitor.Log($"Getting walls for {__instance}");
                if (__instance.owner == null)
                {
                    return;
                }
                //int ecribs = Math.Max(ModEntry.config.ExtraCribs, 0);
                int espace = Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0);
                //int ebeds = Math.Max(ModEntry.config.ExtraKidsBeds, 0);

                if (__instance.upgradeLevel > 1 && espace > 0)
                {
                    int x = espace;
                    __result.Remove(new Microsoft.Xna.Framework.Rectangle(15, 1, 13, 3));
                    __result.Add(new Microsoft.Xna.Framework.Rectangle(15, 1, 13 + x, 3));
                }
                if (ModEntry.config.BuildAllSpousesRooms)
                {
                    int count = Misc.GetSpouses(__instance.owner, 0).Keys.ToList().FindAll((spouse) => Maps.roomIndexes.ContainsKey(spouse) || Maps.tmxSpouseRooms.ContainsKey(spouse)).Count;

                    if (count > 0)
                    {
                        for (int i = 0; i < count; i++)
                        {
                            if (__instance.upgradeLevel > 1)
                            {
                                __result.Add(new Microsoft.Xna.Framework.Rectangle(41 + i * 7, 10, 7, 3));
                            }
                            else
                            {
                                __result.Add(new Microsoft.Xna.Framework.Rectangle(35 + i * 7, 1, 7, 3));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(FarmHouse_getWalls_Postfix)}:\n{ex}", LogLevel.Error);
            }
        }
Beispiel #6
0
 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);
 }
Beispiel #7
0
 public static bool Farmer_isMarried_Prefix(Farmer __instance, ref bool __result)
 {
     try
     {
         __result = __instance.team.IsMarried(__instance.UniqueMultiplayerID) || Misc.GetSpouses(__instance, 1).Count > 0;
         return(false);
     }
     catch (Exception ex)
     {
         Monitor.Log($"Failed in {nameof(Farmer_isMarried_Prefix)}:\n{ex}", LogLevel.Error);
     }
     return(true);
 }
Beispiel #8
0
        public static void GameLoop_OneSecondUpdateTicked(object sender, OneSecondUpdateTickedEventArgs e)
        {
            foreach (GameLocation location in Game1.locations)
            {
                if (location is FarmHouse)
                {
                    FarmHouse fh = location as FarmHouse;
                    if (fh.owner == null)
                    {
                        continue;
                    }

                    List <string> allSpouses = Misc.GetSpouses(fh.owner, 1).Keys.ToList();
                    List <string> bedSpouses = Misc.ReorderSpousesForSleeping(allSpouses.FindAll((s) => ModEntry.config.RoommateRomance || !fh.owner.friendshipData[s].RoommateMarriage));

                    foreach (NPC character in fh.characters)
                    {
                        if (!(character.currentLocation == fh))
                        {
                            continue;
                        }

                        if (allSpouses.Contains(character.Name))
                        {
                            if (Misc.IsInBed(fh, character.GetBoundingBox()))
                            {
                                character.farmerPassesThrough = true;
                                if (!character.isMoving() && !Kissing.kissingSpouses.Contains(character.Name))
                                {
                                    Vector2 bedPos = Misc.GetSpouseBedPosition(fh, bedSpouses, character.Name);
                                    if (Game1.timeOfDay >= 2000 || Game1.timeOfDay <= 600)
                                    {
                                        character.position.Value      = bedPos;
                                        character.ignoreScheduleToday = true;
                                        if (!character.isSleeping.Value)
                                        {
                                            Monitor.Log($"putting {character.Name} to sleep");
                                            character.isSleeping.Value = true;
                                        }
                                        if (character.Sprite.CurrentAnimation == null)
                                        {
                                            if (!Misc.HasSleepingAnimation(character.Name))
                                            {
                                                character.Sprite.StopAnimation();
                                                character.faceDirection(0);
                                            }
                                            else
                                            {
                                                character.playSleepingAnimation();
                                            }
                                        }
                                    }
                                    else
                                    {
                                        character.faceDirection(3);
                                        character.isSleeping.Value = false;
                                    }
                                }
                                else
                                {
                                    character.isSleeping.Value = false;
                                }
                                character.HideShadow = true;
                            }
                            else if (Game1.timeOfDay < 2000 && Game1.timeOfDay > 600)
                            {
                                character.farmerPassesThrough = false;
                                character.HideShadow          = false;
                                character.isSleeping.Value    = false;
                            }
                        }
                    }
                    if (location == Game1.player.currentLocation && ModEntry.config.AllowSpousesToKiss)
                    {
                        Kissing.TrySpousesKiss();
                    }
                }
            }
        }
        public static void Event_setUpCharacters_Postfix(Event __instance, GameLocation location)
        {
            try
            {
                if (!__instance.isWedding || !ModEntry.config.AllSpousesJoinWeddings)
                {
                    return;
                }

                List <string> spouses = Misc.GetSpouses(Game1.player, 0).Keys.ToList();
                Misc.ShuffleList(ref spouses);
                foreach (NPC actor in __instance.actors)
                {
                    if (spouses.Contains(actor.Name))
                    {
                        int     idx = spouses.IndexOf(actor.Name);
                        Vector2 pos;
                        if (idx < weddingPositions.Count)
                        {
                            pos = new Vector2(weddingPositions[idx][0] * Game1.tileSize, weddingPositions[idx][1] * Game1.tileSize);
                        }
                        else
                        {
                            int x = 25 + ((idx - 4) % 6);
                            int y = 62 - ((idx - 4) / 6);
                            pos = new Vector2(x * Game1.tileSize, y * Game1.tileSize);
                        }
                        actor.position.Value = pos;
                        if (ModEntry.config.AllSpousesWearMarriageClothesAtWeddings)
                        {
                            bool flipped = false;
                            int  frame   = 37;
                            if (pos.Y < 62 * Game1.tileSize)
                            {
                                if (pos.X == 25 * Game1.tileSize)
                                {
                                    flipped = true;
                                }
                                else if (pos.X < 30 * Game1.tileSize)
                                {
                                    frame = 36;
                                }
                            }
                            else if (pos.X < 28 * Game1.tileSize)
                            {
                                flipped = true;
                            }

                            actor.Sprite.setCurrentAnimation(new List <FarmerSprite.AnimationFrame>
                            {
                                new FarmerSprite.AnimationFrame(frame, 0, false, flipped, null, true)
                            });
                        }
                        else
                        {
                            Utility.facePlayerEndBehavior(actor, location);
                        }
                    }
                }
            }

            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(Event_answerDialogueQuestion_Prefix)}:\n{ex}", LogLevel.Error);
            }
        }
Beispiel #10
0
        public static void FarmHouse_getFloors_Postfix(FarmHouse __instance, ref List <Microsoft.Xna.Framework.Rectangle> __result)
        {
            try
            {
                //Monitor.Log($"Getting floors for {__instance}");
                if (__instance.owner == null)
                {
                    return;
                }
                //int ecribs = Math.Max(ModEntry.config.ExtraCribs, 0);
                int espace = Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0);
                //int ebeds = Math.Max(ModEntry.config.ExtraKidsBeds, 0);
                if (__instance.upgradeLevel > 1 && espace > 0)
                {
                    int x = espace;
                    __result.Remove(new Microsoft.Xna.Framework.Rectangle(15, 3, 13, 6));
                    __result.Add(new Microsoft.Xna.Framework.Rectangle(15, 3, 13 + x, 6));
                }
                if (ModEntry.config.BuildAllSpousesRooms)
                {
                    int count = Misc.GetSpouses(__instance.owner, 0).Keys.ToList().FindAll((spouse) => Maps.roomIndexes.ContainsKey(spouse) || Maps.tmxSpouseRooms.ContainsKey(spouse)).Count;

                    if (__instance.owner.spouse != null && !__instance.owner.friendshipData[__instance.owner.spouse].IsEngaged() && (Maps.roomIndexes.ContainsKey(__instance.owner.spouse) || Maps.tmxSpouseRooms.ContainsKey(__instance.owner.spouse)))
                    {
                        count++;
                    }
                    if (count > 0)
                    {
                        if (__instance.upgradeLevel > 1)
                        {
                            __result.Remove(new Microsoft.Xna.Framework.Rectangle(23, 12, 12, 11));
                            __result.Add(new Microsoft.Xna.Framework.Rectangle(23, 12, 11, 11));
                            __result.Add(new Microsoft.Xna.Framework.Rectangle(34, 19, count * 7, 1));
                        }
                        else
                        {
                            __result.Remove(new Microsoft.Xna.Framework.Rectangle(20, 3, 9, 8));
                            __result.Add(new Microsoft.Xna.Framework.Rectangle(20, 3, 8, 8));
                            __result.Add(new Microsoft.Xna.Framework.Rectangle(28, 10, count * 7, 1));
                        }
                        for (int i = 0; i < count; i++)
                        {
                            if (__instance.upgradeLevel > 1)
                            {
                                __result.Add(new Microsoft.Xna.Framework.Rectangle(35 + i * 7, 13, 6, 6));
                                __result.Add(new Microsoft.Xna.Framework.Rectangle(34 + (i * 7), 13, 1, 6));
                            }
                            else
                            {
                                __result.Add(new Microsoft.Xna.Framework.Rectangle(29 + i * 7, 4, 6, 6));
                                __result.Add(new Microsoft.Xna.Framework.Rectangle(28 + (i * 7), 4, 1, 6));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(FarmHouse_getFloors_Postfix)}:\n{ex}", LogLevel.Error);
            }
        }
Beispiel #11
0
        internal static void afterDialogueBehavior(Farmer who, string whichAnswer)
        {
            Monitor.Log("answer " + whichAnswer);

            if (Misc.GetSpouses(Game1.player, 1).ContainsKey(whichAnswer))
            {
                Monitor.Log("divorcing " + whichAnswer);
                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>();
                responses.Add(new Response($"divorce_Yes_{whichAnswer}", Game1.content.LoadString("Strings\\Lexicon:QuestionDialogue_Yes")));
                if (ModEntry.config.ComplexDivorce)
                {
                    responses.Add(new Response($"divorce_complex_{whichAnswer}", Helper.Translation.Get("divorce_complex")));
                }
                responses.Add(new Response("No", Game1.content.LoadString("Strings\\Lexicon:QuestionDialogue_No")));
                (Game1.activeClickableMenu as DialogueBox)?.closeDialogue();
                Game1.currentLocation.createQuestionDialogue(s2, responses.ToArray(), afterDialogueBehavior);
            }
            else if (whichAnswer.StartsWith("divorce_Yes_"))
            {
                Monitor.Log("confirmed " + whichAnswer);
                string spouse = whichAnswer.Split('_')[2];
                if (Game1.player.Money >= 50000 || spouse == "Krobus")
                {
                    Monitor.Log("divorce initiated successfully");
                    if (!Game1.player.isRoommate(spouse))
                    {
                        Game1.player.Money        -= 50000;
                        ModEntry.divorceHeartsLost = ModEntry.config.FriendlyDivorce ? 0 : -1;
                    }
                    else
                    {
                        ModEntry.divorceHeartsLost = 0;
                    }
                    ModEntry.spouseToDivorce          = spouse;
                    Game1.player.divorceTonight.Value = true;
                    string s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed_" + spouse);
                    if (s == null)
                    {
                        s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed");
                    }
                    Game1.drawObjectDialogue(s);
                    if (!Game1.player.isRoommate(spouse))
                    {
                        ModEntry.mp.globalChatInfoMessage("Divorce", new string[]
                        {
                            Game1.player.Name
                        });
                    }
                }
                else
                {
                    Monitor.Log("not enough money to divorce");
                    Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\UI:NotEnoughMoney1"));
                }
            }
            else if (whichAnswer.StartsWith("divorce_complex_"))
            {
                complexDivorceSpouse       = whichAnswer.Replace("divorce_complex_", "");
                ModEntry.divorceHeartsLost = 1;
                ShowNextDialogue("divorce_fault_", Game1.currentLocation);
            }
            else if (whichAnswer.StartsWith("divorce_fault_"))
            {
                Monitor.Log("divorce fault");
                string r = Helper.Translation.Get(whichAnswer);
                if (r != null)
                {
                    if (int.TryParse(r.Split('#')[r.Split('#').Length - 1], out int lost))
                    {
                        ModEntry.divorceHeartsLost += lost;
                    }
                }
                string      nextKey = $"divorce_{r.Split('#')[r.Split('#').Length - 2]}reason_";
                Translation test    = Helper.Translation.Get(nextKey + "q");
                if (!test.HasValue())
                {
                    ShowNextDialogue($"divorce_method_", Game1.currentLocation);
                    return;
                }
                ShowNextDialogue($"divorce_{r.Split('#')[r.Split('#').Length - 2]}reason_", Game1.currentLocation);
            }
            else if (whichAnswer.Contains("reason_"))
            {
                Monitor.Log("divorce reason");
                string r = Helper.Translation.Get(whichAnswer);
                if (r != null)
                {
                    if (int.TryParse(r.Split('#')[r.Split('#').Length - 1], out int lost))
                    {
                        ModEntry.divorceHeartsLost += lost;
                    }
                }

                ShowNextDialogue($"divorce_method_", Game1.currentLocation);
            }
            else if (whichAnswer.StartsWith("divorce_method_"))
            {
                Monitor.Log("divorce method");
                ModEntry.spouseToDivorce = complexDivorceSpouse;
                string r = Helper.Translation.Get(whichAnswer);
                if (r != null)
                {
                    if (int.TryParse(r.Split('#')[r.Split('#').Length - 1], out int lost))
                    {
                        ModEntry.divorceHeartsLost += lost;
                    }
                }

                if (Game1.player.Money >= 50000 || complexDivorceSpouse == "Krobus")
                {
                    if (!Game1.player.isRoommate(complexDivorceSpouse))
                    {
                        int money = 50000;
                        if (int.TryParse(r.Split('#')[r.Split('#').Length - 2], out int mult))
                        {
                            money = (int)Math.Round(money * mult / 100f);
                        }
                        Monitor.Log($"money cost {money}");
                        Game1.player.Money -= money;
                    }
                    Game1.player.divorceTonight.Value = true;
                    string s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed_" + complexDivorceSpouse);
                    if (s == null)
                    {
                        s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed");
                    }
                    Game1.drawObjectDialogue(s);
                    if (!Game1.player.isRoommate(complexDivorceSpouse))
                    {
                        ModEntry.mp.globalChatInfoMessage("Divorce", new string[]
                        {
                            Game1.player.Name
                        });
                    }
                    Monitor.Log($"hearts lost {ModEntry.divorceHeartsLost}");
                }
                else
                {
                    Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\UI:NotEnoughMoney1"));
                }
            }
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        internal static void ExpandKidsRoom(FarmHouse farmHouse)
        {
            ModEntry.PMonitor.Log("Expanding kids room");

            //int extraWidth = Math.Max(ModEntry.config.ExtraCribs,0) * 3 + Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0) + Math.Max(ModEntry.config.ExtraKidsBeds, 0) * 4;
            int extraWidth = Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0);
            int width      = 14;
            int height     = 9;
            int startx     = 15;
            int starty     = 0;
            int ox         = ModEntry.config.ExistingKidsRoomOffsetX;
            int oy         = ModEntry.config.ExistingKidsRoomOffsetY;

            Map map = PHelper.Content.Load <Map>("Maps\\" + farmHouse.Name + "2" + (Misc.GetSpouses(farmHouse.owner, 1).Count > 0? "_marriage":""), ContentSource.GameContent);

            List <string> sheets = new List <string>();

            for (int i = 0; i < map.TileSheets.Count; i++)
            {
                sheets.Add(map.TileSheets[i].Id);
            }

            List <int> backIndexes  = new List <int>();
            List <int> frontIndexes = new List <int>();
            List <int> buildIndexes = new List <int>();
            List <int> backSheets   = new List <int>();
            List <int> frontSheets  = new List <int>();
            List <int> buildSheets  = new List <int>();


            for (int i = 0; i < width * height; i++)
            {
                backIndexes.Add(getTileIndexAt(map, ox + startx + (i % width), oy + starty + (i / width), "Back"));
                backSheets.Add(sheets.IndexOf(getTileSheetIDAt(map, ox + startx + (i % width), oy + starty + (i / width), "Back")));
                frontIndexes.Add(getTileIndexAt(map, ox + startx + (i % width), oy + starty + (i / width), "Front"));
                frontSheets.Add(sheets.IndexOf(getTileSheetIDAt(map, ox + startx + (i % width), oy + starty + (i / width), "Front")));
                buildIndexes.Add(getTileIndexAt(map, ox + startx + (i % width), oy + starty + (i / width), "Buildings"));
                buildSheets.Add(sheets.IndexOf(getTileSheetIDAt(map, ox + startx + (i % width), oy + starty + (i / width), "Buildings")));
            }

            if (extraWidth > 0)
            {
                Monitor.Log("total width: " + (29 + ox + extraWidth));
                ExtendMap(farmHouse, 29 + ox + extraWidth);
            }

            //int cribsWidth = (Math.Max(ModEntry.config.ExtraCribs, 0) + 1)* 3;
            //int bedsWidth = (Math.Max(ModEntry.config.ExtraKidsBeds, 0) + 1) * 4;
            int spaceWidth = Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0) + 3;

            // cribs
            int k = 0;

            /*
             * if (ModEntry.config.ExtraCribs >= 0)
             * {
             *      for (int j = 0; j < ModEntry.config.ExtraCribs + 1; j++)
             *      {
             *              for (int i = 0; i < 3 * height; i++)
             *              {
             *                      int x = ox + startx + (3 * j) + i % 3;
             *                      int y = oy + starty + i / 3;
             *                      int xt = i % 3;
             *                      int yt = i / 3;
             *
             *                      setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
             *                      setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
             *                      setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
             *              }
             *              farmHouse.setTileProperty(ox + startx + (3 * j), oy + starty + 5, "Buildings", "Action", $"Crib{j}");
             *              farmHouse.setTileProperty(ox + startx + (3 * j) + 1, oy + starty + 5, "Buildings", "Action", $"Crib{j}");
             *              farmHouse.setTileProperty(ox + startx + (3 * j) + 2, oy + starty + 5, "Buildings", "Action", $"Crib{j}");
             *      }
             *
             * }
             * else // remove existing crib
             * {
             *      k = 0;
             *      for (int i = 0; i < 3 * height; i++)
             *      {
             *              k %= (3 * height);
             *
             *              int x = ox + startx + i % 3;
             *              int y = oy + starty + i / 3;
             *              int xt = 3 + (k % 3);
             *              int yt = k / 3;
             *
             *              setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
             *              setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
             *              setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
             *              k++;
             *      }
             * }
             *
             * // mid space
             *
             * k = 0;
             * for (int i = 0; i < 3 * height; i++)
             * {
             *      k %= (3 * height);
             *
             *      int x = ox + startx + i % 3;
             *      int y = oy + starty + i / 3;
             *      int xt = 3 + (k % 3);
             *      int yt = k / 3;
             *
             *      setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
             *      setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
             *      setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
             *      k++;
             * }
             */

            if (ModEntry.config.ExtraKidsRoomWidth > 0)
            {
                k = 0;
                for (int j = 0; j < ModEntry.config.ExtraKidsRoomWidth / 3; j++)
                {
                    k = 0;
                    for (int i = 0; i < 3 * height; i++)
                    {
                        k %= (3 * height);

                        int x  = 6 + ox + startx + (3 * j) + i % 3;
                        int y  = oy + starty + i / 3;
                        int xt = 3 + (k % 3);
                        int yt = k / 3;

                        setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
                        setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
                        setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
                        k++;
                    }
                }
                for (int j = 0; j < ModEntry.config.ExtraKidsRoomWidth % 3; j++)
                {
                    k %= 3;
                    for (int i = 0; i < height; i++)
                    {
                        int x  = 6 + (3 * (ModEntry.config.ExtraKidsRoomWidth / 3)) + ox + startx + j;
                        int y  = oy + starty + i;
                        int xt = 3 + j;
                        int yt = i;

                        setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
                        setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
                        setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
                    }
                }
            }

            /*
             * // beds
             * if (ModEntry.config.ExtraKidsBeds >= 0)
             * {
             *      for (int j = 0; j < ModEntry.config.ExtraKidsBeds + 1; j++)
             *      {
             *              k = 0;
             *              for (int i = 0; i < 4 * height; i++)
             *              {
             *                      k %= (4 * height);
             *
             *                      int x = cribsWidth + spaceWidth + ox + startx + (4 * j) + i % 4;
             *                      int y = oy + starty + i / 4;
             *                      int xt = 6 + (k % 4);
             *                      int yt = k / 4;
             *
             *                      setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
             *                      setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
             *                      setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
             *                      k++;
             *              }
             *      }
             *
             *      // far bed and wall
             *      k = 0;
             *      for (int i = 0; i < 4 * height; i++)
             *      {
             *              k %= (4 * height);
             *              setupTile(cribsWidth + spaceWidth + bedsWidth + ox + startx + i % 4, oy + starty + i / 4, 10 + (k % 4), k / 4, farmHouse, frontIndexes, frontSheets, 14, 0);
             *              setupTile(cribsWidth + spaceWidth + bedsWidth + ox + startx + i % 4, oy + starty + i / 4, 10 + (k % 4), k / 4, farmHouse, buildIndexes, buildSheets, 14, 1);
             *              setupTile(cribsWidth + spaceWidth + bedsWidth + ox + startx + i % 4, oy + starty + i / 4, 10 + (k % 4), k / 4, farmHouse, backIndexes, backSheets, 14, 2);
             *              k++;
             *      }
             * }
             * else if (ModEntry.config.ExtraKidsBeds == -1)
             * {
             *      // remove left bed
             *
             *      k = 0;
             *      for (int i = 0; i < 3 * height; i++)
             *      {
             *              k %= (3 * height);
             *
             *              int x = cribsWidth + spaceWidth + ox + startx + i % 3;
             *              int y = oy + starty + i / 3;
             *              int xt = 3 + (k % 3);
             *              int yt = k / 3;
             *
             *              setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
             *              setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
             *              setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
             *              k++;
             *      }
             *      // extra strip
             *
             *      for (int i = 0; i < height; i++)
             *      {
             *              setupTile(cribsWidth + spaceWidth + 3 + ox + startx, oy + starty + i, 3, i, farmHouse, frontIndexes, frontSheets, 14, 0);
             *              setupTile(cribsWidth + spaceWidth + 3 + ox + startx, oy + starty + i, 3, i, farmHouse, buildIndexes, buildSheets, 14, 1);
             *              setupTile(cribsWidth + spaceWidth + 3 + ox + startx, oy + starty + i, 3, i, farmHouse, backIndexes, backSheets, 14, 2);
             *      }
             *
             *      // far wall and bed
             *      k = 0;
             *
             *      for (int i = 0; i < 4 * height; i++)
             *      {
             *              k %= (4 * height);
             *              setupTile(cribsWidth + spaceWidth + 4 + ox + startx + i % 4, oy + starty + i / 4, 10 + (k % 4), k / 4, farmHouse, frontIndexes, frontSheets, 14, 0);
             *              setupTile(cribsWidth + spaceWidth + 4 + ox + startx + i % 4, oy + starty + i / 4, 10 + (k % 4), k / 4, farmHouse, buildIndexes, buildSheets, 14, 1);
             *              setupTile(cribsWidth + spaceWidth + 4 + ox + startx + i % 4, oy + starty + i / 4, 10 + (k % 4), k / 4, farmHouse, backIndexes, backSheets, 14, 2);
             *              k++;
             *      }
             * }
             * else
             * {
             */
            // remove both beds
            k = 0;
            for (int i = 0; i < 3 * height; i++)
            {
                k %= (3 * height);

                int x  = 3 + spaceWidth + ox + startx + i % 3;
                int y  = oy + starty + i / 3;
                int xt = 3 + (k % 3);
                int yt = k / 3;

                setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
                setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
                setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
                k++;
            }
            k = 0;
            for (int i = 0; i < 3 * height; i++)
            {
                k %= (3 * height);

                int x  = 3 + spaceWidth + 3 + ox + startx + i % 3;
                int y  = oy + starty + i / 3;
                int xt = 3 + (k % 3);
                int yt = k / 3;

                setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, 14, 0);
                setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, 14, 1);
                setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, 14, 2);
                k++;
            }

            // extra strip

            for (int i = 0; i < height; i++)
            {
                setupTile(3 + spaceWidth + 6 + ox + startx, oy + starty + i, i == height - 1 ? 12 : 3, i, farmHouse, frontIndexes, frontSheets, 14, 0);
                setupTile(3 + spaceWidth + 6 + ox + startx, oy + starty + i, 3, i, farmHouse, buildIndexes, buildSheets, 14, 1);
                setupTile(3 + spaceWidth + 6 + ox + startx, oy + starty + i, 3, i, farmHouse, backIndexes, backSheets, 14, 2);
            }

            // far wall

            for (int i = 0; i < height; i++)
            {
                setupTile(3 + spaceWidth + 7 + ox + startx, oy + starty + i, 13, i, farmHouse, frontIndexes, frontSheets, 14, 0);
                setupTile(3 + spaceWidth + 7 + ox + startx, oy + starty + i, 13, i, farmHouse, buildIndexes, buildSheets, 14, 1);
                setupTile(3 + spaceWidth + 7 + ox + startx, oy + starty + i, 13, i, farmHouse, backIndexes, backSheets, 14, 2);
            }

            //}
            // bottom
            for (int i = 0; i < extraWidth; i++)
            {
                Tile tile = map.GetLayer("Buildings").PickTile(new Location((29 + ox + i) * Game1.tileSize, (9 + oy) * Game1.tileSize), Game1.viewport.Size);
                if (tile == null || tile.TileIndex == -1)
                {
                    Monitor.Log($"Adding building tile at {29 + ox + i},{ 9 + oy}");
                    farmHouse.setMapTileIndex(29 + ox + i, 9 + oy, 0, "Buildings");
                }
            }
        }
Beispiel #15
0
        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);
            }
        }
Beispiel #16
0
        public static void Input_ButtonPressed(object sender, ButtonPressedEventArgs e)
        {
            if ((e.Button != SButton.MouseLeft && e.Button != SButton.MouseRight) || Game1.currentLocation == null || !(Game1.currentLocation is ManorHouse) || Game1.currentLocation.lastQuestionKey == null || !Game1.currentLocation.lastQuestionKey.StartsWith("divorce"))
            {
                return;
            }

            IClickableMenu menu = Game1.activeClickableMenu;

            if (menu == null || !ReferenceEquals(menu.GetType(), typeof(DialogueBox)))
            {
                return;
            }
            int             resp  = (int)typeof(DialogueBox).GetField("selectedResponse", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(menu);
            List <Response> resps = (List <Response>) typeof(DialogueBox).GetField("responses", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(menu);

            if (resp < 0 || resps == null || resp >= resps.Count || resps[resp] == null)
            {
                return;
            }


            Game1.currentLocation.lastQuestionKey = "";
            string whichAnswer = resps[resp].responseKey;

            Monitor.Log("answer " + whichAnswer);

            if (Misc.GetSpouses(Game1.player, 1).ContainsKey(whichAnswer))
            {
                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>();
                responses.Add(new Response($"Yes_{whichAnswer}", Game1.content.LoadString("Strings\\Lexicon:QuestionDialogue_Yes")));
                if (ModEntry.config.ComplexDivorce)
                {
                    responses.Add(new Response($"divorce_complex_{whichAnswer}", Helper.Translation.Get("divorce_complex")));
                }
                responses.Add(new Response("No", Game1.content.LoadString("Strings\\Lexicon:QuestionDialogue_No")));
                Game1.currentLocation.createQuestionDialogue(s2, responses.ToArray(), $"divorce_{whichAnswer}");
            }
            else if (whichAnswer.StartsWith("Yes_"))
            {
                string spouse = whichAnswer.Substring(4);
                ModEntry.spouseToDivorce = spouse;
                if (Game1.player.Money >= 50000 || spouse == "Krobus")
                {
                    if (!Game1.player.isRoommate(spouse))
                    {
                        Game1.player.Money        -= 50000;
                        ModEntry.divorceHeartsLost = ModEntry.config.FriendlyDivorce ? 0 : -1;
                    }
                    else
                    {
                        ModEntry.divorceHeartsLost = 0;
                    }
                    Game1.player.divorceTonight.Value = true;
                    string s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed_" + spouse);
                    if (s == null)
                    {
                        s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed");
                    }
                    Game1.drawObjectDialogue(s);
                    if (!Game1.player.isRoommate(spouse))
                    {
                        ModEntry.mp.globalChatInfoMessage("Divorce", new string[]
                        {
                            Game1.player.Name
                        });
                    }
                }
                else
                {
                    Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\UI:NotEnoughMoney1"));
                }
            }
            else if (whichAnswer.StartsWith("divorce_complex_"))
            {
                complexDivorceSpouse       = whichAnswer.Replace("divorce_complex_", "");
                ModEntry.divorceHeartsLost = 1;
                ShowNextDialogue("divorce_fault_", Game1.currentLocation);
            }
            else if (whichAnswer.StartsWith("divorce_fault_"))
            {
                Monitor.Log("divorce fault");
                string r = Helper.Translation.Get(whichAnswer);
                if (r != null)
                {
                    if (int.TryParse(r.Split('#')[r.Split('#').Length - 1], out int lost))
                    {
                        ModEntry.divorceHeartsLost += lost;
                    }
                }
                string      nextKey = $"divorce_{r.Split('#')[r.Split('#').Length - 2]}reason_";
                Translation test    = Helper.Translation.Get(nextKey + "q");
                if (!test.HasValue())
                {
                    ShowNextDialogue($"divorce_method_", Game1.currentLocation);
                    return;
                }
                ShowNextDialogue($"divorce_{r.Split('#')[r.Split('#').Length - 2]}reason_", Game1.currentLocation);
            }
            else if (whichAnswer.Contains("reason_"))
            {
                Monitor.Log("divorce reason");
                string r = Helper.Translation.Get(whichAnswer);
                if (r != null)
                {
                    if (int.TryParse(r.Split('#')[r.Split('#').Length - 1], out int lost))
                    {
                        ModEntry.divorceHeartsLost += lost;
                    }
                }

                ShowNextDialogue($"divorce_method_", Game1.currentLocation);
            }
            else if (whichAnswer.StartsWith("divorce_method_"))
            {
                Monitor.Log("divorce method");
                ModEntry.spouseToDivorce = complexDivorceSpouse;
                string r = Helper.Translation.Get(whichAnswer);
                if (r != null)
                {
                    if (int.TryParse(r.Split('#')[r.Split('#').Length - 1], out int lost))
                    {
                        ModEntry.divorceHeartsLost += lost;
                    }
                }

                if (Game1.player.Money >= 50000 || complexDivorceSpouse == "Krobus")
                {
                    if (!Game1.player.isRoommate(complexDivorceSpouse))
                    {
                        int money = 50000;
                        if (int.TryParse(r.Split('#')[r.Split('#').Length - 2], out int mult))
                        {
                            money = (int)Math.Round(money * mult / 100f);
                        }
                        Monitor.Log($"money cost {money}");
                        Game1.player.Money -= money;
                    }
                    Game1.player.divorceTonight.Value = true;
                    string s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed_" + complexDivorceSpouse);
                    if (s == null)
                    {
                        s = Game1.content.LoadStringReturnNullIfNotFound("Strings\\Locations:ManorHouse_DivorceBook_Filed");
                    }
                    Game1.drawObjectDialogue(s);
                    if (!Game1.player.isRoommate(complexDivorceSpouse))
                    {
                        ModEntry.mp.globalChatInfoMessage("Divorce", new string[]
                        {
                            Game1.player.Name
                        });
                    }
                    Monitor.Log($"hearts lost {ModEntry.divorceHeartsLost}");
                }
                else
                {
                    Game1.drawObjectDialogue(Game1.content.LoadString("Strings\\UI:NotEnoughMoney1"));
                }
            }
        }
Beispiel #17
0
        public static void FarmHouse_performTenMinuteUpdate_Postfix(FarmHouse __instance, int timeOfDay)
        {
            try
            {
                if (__instance.owner == null)
                {
                    return;
                }

                List <string> mySpouses = Misc.GetSpouses(__instance.owner, 1).Keys.ToList();
                if (Game1.IsMasterGame && Game1.timeOfDay >= 2200 && Game1.IsMasterGame)
                {
                    int           upgradeLevel = __instance.upgradeLevel;
                    List <string> roomSpouses  = mySpouses.FindAll((s) => Maps.roomIndexes.ContainsKey(s) || Maps.tmxSpouseRooms.ContainsKey(s));
                    List <string> bedSpouses   = mySpouses.FindAll((s) => ModEntry.config.RoommateRomance || !__instance.owner.friendshipData[s].RoommateMarriage);
                    foreach (NPC c in __instance.characters)
                    {
                        if (c.isMarried())
                        {
                            string spouseName = c.Name;

                            if (Misc.GetSpouses(Game1.player, 1).ContainsKey(spouseName))
                            {
                                c.checkForMarriageDialogue(timeOfDay, __instance);
                            }

                            Point bedSpot;
                            if (timeOfDay >= 2200)
                            {
                                if (!bedSpouses.Contains(c.Name))
                                {
                                    if (!roomSpouses.Exists((n) => n == spouseName))
                                    {
                                        bedSpot = __instance.getRandomOpenPointInHouse(ModEntry.myRand);
                                    }
                                    else
                                    {
                                        int     offset = roomSpouses.IndexOf(spouseName) * 7;
                                        Vector2 spot   = (upgradeLevel == 1) ? new Vector2(32f, 5f) : new Vector2(38f, 14f);
                                        bedSpot = new Point((int)spot.X + offset, (int)spot.Y);
                                    }
                                }
                                else
                                {
                                    int  bedWidth = Misc.GetBedWidth(__instance);
                                    bool up       = upgradeLevel > 1;

                                    Point bedStart = new Point(21 - (up ? (bedWidth / 2) - 1 : 0) + (up ? 6 : 0), 2 + (up ? 9 : 0));
                                    int   x        = 1 + (int)((bedSpouses.IndexOf(spouseName) + 1) / (float)(bedSpouses.Count + 1) * (bedWidth - 2));
                                    bedSpot = new Point(bedStart.X + x, bedStart.Y + 2);
                                }

                                c.controller = null;
                                if (c.Position != Misc.GetSpouseBedPosition(__instance, bedSpouses, c.Name) && (!Misc.IsInBed(__instance, c.GetBoundingBox()) || !Kissing.kissingSpouses.Contains(c.Name)))
                                {
                                    c.controller = new PathFindController(c, __instance, bedSpot, 0, new PathFindController.endBehavior(FarmHouse.spouseSleepEndFunction));
                                    if (c.controller.pathToEndPoint == null || !__instance.isTileOnMap(c.controller.pathToEndPoint.Last <Point>().X, c.controller.pathToEndPoint.Last <Point>().Y))
                                    {
                                        c.controller = null;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(FarmHouse_performTenMinuteUpdate_Postfix)}:\n{ex}", LogLevel.Error);
            }
        }
Beispiel #18
0
        internal static void ExpandKidsRoom(FarmHouse farmHouse)
        {
            ModEntry.PMonitor.Log("Expanding kids room");

            //int extraWidth = Math.Max(ModEntry.config.ExtraCribs,0) * 3 + Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0) + Math.Max(ModEntry.config.ExtraKidsBeds, 0) * 4;
            int extraWidth = Math.Max(ModEntry.config.ExtraKidsRoomWidth, 0);
            int roomWidth  = 14;
            int height     = 9;
            int startx     = 15;
            int starty     = 0;
            //int ox = ModEntry.config.ExistingKidsRoomOffsetX;
            int ox = 0;
            //int oy = ModEntry.config.ExistingKidsRoomOffsetY;
            int oy = 0;

            Map map = Helper.Content.Load <Map>("Maps\\" + farmHouse.Name + "2" + (Misc.GetSpouses(farmHouse.owner, 1).Count > 0? "_marriage":""), ContentSource.GameContent);

            List <string> sheets = new List <string>();

            for (int i = 0; i < map.TileSheets.Count; i++)
            {
                sheets.Add(map.TileSheets[i].Id);
            }

            List <int> backIndexes  = new List <int>();
            List <int> frontIndexes = new List <int>();
            List <int> buildIndexes = new List <int>();
            List <int> backSheets   = new List <int>();
            List <int> frontSheets  = new List <int>();
            List <int> buildSheets  = new List <int>();


            for (int i = 0; i < roomWidth * height; i++)
            {
                backIndexes.Add(getTileIndexAt(map, ox + startx + (i % roomWidth), oy + starty + (i / roomWidth), "Back"));
                backSheets.Add(sheets.IndexOf(getTileSheetIDAt(map, ox + startx + (i % roomWidth), oy + starty + (i / roomWidth), "Back")));
                frontIndexes.Add(getTileIndexAt(map, ox + startx + (i % roomWidth), oy + starty + (i / roomWidth), "Front"));
                frontSheets.Add(sheets.IndexOf(getTileSheetIDAt(map, ox + startx + (i % roomWidth), oy + starty + (i / roomWidth), "Front")));
                buildIndexes.Add(getTileIndexAt(map, ox + startx + (i % roomWidth), oy + starty + (i / roomWidth), "Buildings"));
                buildSheets.Add(sheets.IndexOf(getTileSheetIDAt(map, ox + startx + (i % roomWidth), oy + starty + (i / roomWidth), "Buildings")));
            }

            if (extraWidth > 0)
            {
                Monitor.Log("total width: " + (29 + ox + extraWidth));
                ExtendMap(farmHouse, 29 + ox + extraWidth);
            }

            int k = 0;

            if (ModEntry.config.ExtraKidsRoomWidth > 0)
            {
                for (int j = 0; j < ModEntry.config.ExtraKidsRoomWidth - 1; j++)
                {
                    k %= 3;
                    for (int i = 0; i < height; i++)
                    {
                        int x  = roomWidth + j + ox + startx - 2;
                        int y  = oy + starty + i;
                        int xt = 4 + k;
                        int yt = i;

                        setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, roomWidth, 0);
                        setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, roomWidth, 1);
                        setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, roomWidth, 2);
                    }
                    k++;
                }
                for (int i = 0; i < height; i++)
                {
                    int x  = startx + roomWidth + ox + extraWidth - 3;
                    int y  = oy + starty + i;
                    int xt = roomWidth - 2;
                    int yt = i;

                    setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, roomWidth, 0);
                    setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, roomWidth, 1);
                    setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, roomWidth, 2);
                }
            }

            // far wall
            for (int i = 0; i < height; i++)
            {
                int x  = startx + roomWidth + ox + extraWidth - 2;
                int y  = oy + starty + i;
                int xt = roomWidth - 1;
                int yt = i;

                setupTile(x, y, xt, yt, farmHouse, frontIndexes, frontSheets, roomWidth, 0);
                setupTile(x, y, xt, yt, farmHouse, buildIndexes, buildSheets, roomWidth, 1);
                setupTile(x, y, xt, yt, farmHouse, backIndexes, backSheets, roomWidth, 2);
            }

            // bottom barrier
            for (int i = 0; i < extraWidth; i++)
            {
                int  x    = startx + roomWidth + ox + i;
                Tile tile = farmHouse.map.GetLayer("Buildings").PickTile(new Location(x * Game1.tileSize, (9 + oy) * Game1.tileSize), Game1.viewport.Size);
                if (tile == null || tile.TileIndex == -1)
                {
                    Monitor.Log($"Adding building tile at {startx + roomWidth + ox + i},{ 9 + oy}");
                    farmHouse.setMapTileIndex(x, 9 + oy, 0, "Buildings");
                }
            }

            Microsoft.Xna.Framework.Rectangle?crib_location = farmHouse.GetCribBounds();
            if (crib_location != null)
            {
                Monitor.Log($"Adding cribs");
                for (int i = 0; i < Misc.GetExtraCribs(); i++)
                {
                    Microsoft.Xna.Framework.Rectangle rect = new Microsoft.Xna.Framework.Rectangle(crib_location.Value.X + i * 3, crib_location.Value.Y, crib_location.Value.Width, crib_location.Value.Height);
                    Monitor.Log($"Adding crib at {rect}");
                    Map override_map     = Game1.game1.xTileContent.Load <Map>("Maps\\FarmHouse_Crib_" + farmHouse.cribStyle.Value);
                    HashSet <string> amo = Helper.Reflection.GetField <HashSet <string> >(farmHouse, "_appliedMapOverrides").GetValue();
                    amo.Remove($"crib{i + 2}");
                    Helper.Reflection.GetField <HashSet <string> >(farmHouse, "_appliedMapOverrides").SetValue(amo);
                    farmHouse.ApplyMapOverride(override_map, $"crib{i+2}", null, rect);
                }
            }
        }