Esempio n. 1
0
        public static void NPC_engagementResponse_Postfix(NPC __instance, Farmer who, bool asRoommate = false)
        {
            Monitor.Log($"engagement response for {__instance.Name}");
            if (asRoommate)
            {
                Monitor.Log($"{__instance.Name} is roomate");
                return;
            }
            if (!who.friendshipData.ContainsKey(__instance.Name))
            {
                Monitor.Log($"{who.Name} has no friendship data for {__instance.Name}", LogLevel.Error);
                return;
            }
            Misc.ResetSpouses(who);
            Friendship friendship  = who.friendshipData[__instance.Name];
            WorldDate  weddingDate = new WorldDate(Game1.Date);

            weddingDate.TotalDays += Math.Max(1, ModEntry.config.DaysUntilMarriage);
            while (!Game1.canHaveWeddingOnDay(weddingDate.DayOfMonth, weddingDate.Season))
            {
                weddingDate.TotalDays++;
            }
            friendship.WeddingDate = weddingDate;

            Maps.BuildSpouseRooms(Utility.getHomeOfFarmer(who));
        }
Esempio n. 2
0
        public static void GameLoop_DayStarted(object sender, DayStartedEventArgs e)
        {
            Misc.ResetDivorces();
            Helper.Events.GameLoop.OneSecondUpdateTicked += GameLoop_OneSecondUpdateTicked;
            Misc.ResetSpouses(Game1.player);


            foreach (GameLocation location in Game1.locations)
            {
                if (ReferenceEquals(location.GetType(), typeof(FarmHouse)))
                {
                    FarmHouse fh = (location as FarmHouse);
                    fh.showSpouseRoom();
                    Maps.BuildSpouseRooms(fh);
                    Misc.PlaceSpousesInFarmhouse(fh);
                    //location.resetForPlayerEntry();
                }
            }
            if (Game1.IsMasterGame)
            {
                Game1.getFarm().addSpouseOutdoorArea(Game1.player.spouse == null ? "" : Game1.player.spouse);
                ModEntry.farmHelperSpouse = Misc.GetRandomSpouse(Game1.MasterPlayer);
            }
            foreach (Farmer f in Game1.getAllFarmers())
            {
                var spouses = Misc.GetSpouses(f, -1).Keys;
                foreach (string s in spouses)
                {
                    Monitor.Log($"{f.Name} is married to {s}");
                }
            }
        }
Esempio n. 3
0
        public static void NPC_spouseObstacleCheck_Postfix(NPC __instance, bool __result)
        {
            try
            {
                if (__result && __instance.getSpouse() != null && __instance.currentLocation == Utility.getHomeOfFarmer(__instance.getSpouse()))
                {
                    Farmer spouse = __instance.getSpouse();
                    Misc.ResetSpouses(spouse);

                    int offset = 0;
                    if (spouse.spouse != __instance.Name)
                    {
                        int idx = Misc.GetSpouses(spouse, 0).Keys.ToList().IndexOf(__instance.Name);
                        offset = 7 * (idx + 1);
                    }
                    Vector2 spot = ((__instance.currentLocation as FarmHouse).upgradeLevel == 1) ? new Vector2(32f, 5f) : new Vector2(38f, 14f);
                    __instance.setTilePosition((int)spot.X + offset, (int)spot.Y);
                    __instance.faceDirection(ModEntry.myRand.Next(0, 4));
                }
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(NPC_spouseObstacleCheck_Postfix)}:\n{ex}", LogLevel.Error);
            }
        }
Esempio n. 4
0
 public static void GameLoop_SaveLoaded(object sender, SaveLoadedEventArgs e)
 {
     ModEntry.spouseToDivorce = null;
     Misc.SetAllNPCsDatable();
     FileIO.LoadTMXSpouseRooms();
     Misc.ResetSpouses(Game1.player);
     Misc.SetNPCRelations();
 }
        public static bool Farmer_doDivorce_Prefix(ref Farmer __instance)
        {
            try
            {
                Monitor.Log("Trying to divorce");
                __instance.divorceTonight.Value = false;
                if (!__instance.isMarried() || ModEntry.spouseToDivorce == null)
                {
                    Monitor.Log("Tried to divorce but no spouse to divorce!");
                    return(false);
                }

                string key = ModEntry.spouseToDivorce;

                int points = 2000;
                if (ModEntry.divorceHeartsLost < 0)
                {
                    points = 0;
                }
                else
                {
                    points -= ModEntry.divorceHeartsLost * 250;
                }

                if (__instance.friendshipData.ContainsKey(key))
                {
                    Monitor.Log($"Divorcing {key}");
                    __instance.friendshipData[key].Points = Math.Min(2000, Math.Max(0, points));
                    Monitor.Log($"Resulting points: {__instance.friendshipData[key].Points}");

                    __instance.friendshipData[key].Status = points < 1000 ? FriendshipStatus.Divorced : FriendshipStatus.Friendly;
                    Monitor.Log($"Resulting friendship status: {__instance.friendshipData[key].Status}");

                    __instance.friendshipData[key].RoommateMarriage = false;

                    NPC ex = Game1.getCharacterFromName(key);
                    ex.PerformDivorce();
                    if (__instance.spouse == key)
                    {
                        __instance.spouse = null;
                    }
                    Misc.ResetSpouses(__instance);
                    Helper.Content.InvalidateCache("Maps/FarmHouse1_marriage");
                    Helper.Content.InvalidateCache("Maps/FarmHouse2_marriage");
                    Maps.BuildSpouseRooms(Utility.getHomeOfFarmer(Game1.player));
                    Game1.getFarm().addSpouseOutdoorArea(__instance.spouse == null ? "" : __instance.spouse);
                }

                ModEntry.spouseToDivorce = null;
                return(false);
            }
            catch (Exception ex)
            {
                Monitor.Log($"Failed in {nameof(Farmer_doDivorce_Prefix)}:\n{ex}", LogLevel.Error);
            }
            return(true);
        }
Esempio n. 6
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);
            }
        }
Esempio n. 7
0
        public static void GameLoop_DayStarted(object sender, DayStartedEventArgs e)
        {
            Helper.Events.GameLoop.OneSecondUpdateTicked += GameLoop_OneSecondUpdateTicked;
            Misc.ResetSpouses(Game1.player);

            foreach (GameLocation location in Game1.locations)
            {
                if (ReferenceEquals(location.GetType(), typeof(FarmHouse)))
                {
                    (location as FarmHouse).showSpouseRoom();
                    Maps.BuildSpouseRooms((location as FarmHouse));
                    Misc.PlaceSpousesInFarmhouse((location as FarmHouse));
                }
            }
            if (Game1.IsMasterGame)
            {
                Game1.getFarm().addSpouseOutdoorArea(Game1.player.spouse == null ? "" : Game1.player.spouse);
                ModEntry.farmHelperSpouse = Misc.GetRandomSpouse(Game1.MasterPlayer);
            }
        }
Esempio n. 8
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);
 }
Esempio n. 9
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);
        }
Esempio n. 10
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);
        }
Esempio n. 11
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);
            }
        }