Example #1
0
        private static void HandleFindProduce(ref Decorators.FarmAnimal moddedAnimal, ref Location moddedLocation)
        {
            var moddedPlayer = new Farmer(Game.GetPlayer());

            if (!IsValidLocation(moddedLocation) || !CanFindProduce(moddedAnimal, moddedPlayer) ||
                Random.NextDouble() >= 0.0002 || !HasNoImpediments(moddedAnimal, moddedLocation))
            {
                return;
            }
            if (moddedPlayer.IsCurrentLocation(moddedLocation.GetOriginal()))
            {
                BellsAndWhistles.PlaySound("dirtyHit", 450);
                BellsAndWhistles.PlaySound("dirtyHit", 900);
                BellsAndWhistles.PlaySound("dirtyHit", 1350);
            }

            if (Game.IsCurrentLocation(moddedLocation.GetOriginal()))
            {
                moddedAnimal.AnimateFindingProduce();
            }
            else
            {
                moddedAnimal.FindProduce(moddedPlayer.GetOriginal());
            }
        }
Example #2
0
        public static bool Prefix(
            ref StardewValley.FarmAnimal __instance,
            ref GameTime time,
            ref GameLocation location,
            ref bool __result)
        {
            var moddedAnimal = new Decorators.FarmAnimal(__instance);

            if (!moddedAnimal.HasHome() || moddedAnimal.IsEating() || Game1.IsClient || __instance.controller != null)
            {
                return(true);
            }
            var moddedLocation = new Location(location);

            HandleFindGrassToEat(ref moddedAnimal, ref moddedLocation);
            if (HandleNightTimeRoutine(ref moddedAnimal, ref moddedLocation))
            {
                __result = true;
            }
            else
            {
                HandleFindProduce(ref moddedAnimal, ref moddedLocation);
                __result = false;
            }

            return(false);
        }
        private static bool HandleStockSelection(
            ref Decorators.PurchaseAnimalsMenu moddedMenu,
            int x,
            int y,
            Farmer moddedPlayer)
        {
            var textureComponent = moddedMenu.GetAnimalsToPurchase().Where(o => (o.item as StardewValley.Object).Type == null)
                                   .FirstOrDefault(o => o.containsPoint(x, y));

            if (textureComponent == null)
            {
                return(true);
            }
            var amount = textureComponent.item.salePrice();

            if (!moddedPlayer.CanAfford(amount))
            {
                return(true);
            }
            var randomAnimalShopType =
                new Api.BetterFarmAnimalVariety(Mod.ReadConfig <ModConfig>()).GetRandomAnimalShopType(textureComponent.hoverText,
                                                                                                      moddedPlayer.GetOriginal());
            var farmAnimal1 = moddedPlayer.CreateFarmAnimal(randomAnimalShopType);

            SelectedStockBellsAndWhistles(ref moddedMenu);
            moddedMenu.SetOnFarm(true);
            moddedMenu.SetAnimalBeingPurchased(farmAnimal1);
            var farmAnimal2 = new Decorators.FarmAnimal(farmAnimal1);

            moddedMenu.SetPriceOfAnimal(farmAnimal2.GetPrice());
            return(false);
        }
Example #4
0
 private static bool ShouldStopFindingProduce(ref Decorators.FarmAnimal moddedAnimal)
 {
     return(Random.Seed((int)(moddedAnimal.GetUniqueId() / 2L +
                              Game.GetDaysPlayed() +
                              Game.GetTimeOfDay())).NextDouble() >
            moddedAnimal.GetFriendship() / 1500.0);
 }
        private static void HandleHatchling(
            ref Decorators.AnimalHouse moddedAnimalHouse,
            string name,
            Farmer moddedPlayer)
        {
            if (moddedAnimalHouse.IsFull())
            {
                return;
            }
            var withEggReadyToHatch = moddedAnimalHouse.GetIncubatorWithEggReadyToHatch();

            if (withEggReadyToHatch == null)
            {
                return;
            }
            string type;

            type = new Incubator(withEggReadyToHatch)
                   .GetRandomType(FarmAnimals.GroupTypesByCategory()
                                  .ToDictionary
                                      (kvp => kvp.Key,
                                      kvp => moddedPlayer.SanitizeBlueChickens(kvp.Value)));

            var building   = moddedAnimalHouse.GetBuilding();
            var farmAnimal = new Decorators.FarmAnimal(moddedPlayer.CreateFarmAnimal(type, name, building));

            farmAnimal.AddToBuilding(building);
            moddedAnimalHouse.ResetIncubator(withEggReadyToHatch);
            farmAnimal.SetCurrentProduce(-1);
        }
Example #6
0
        private static bool RollRandomProduceChance(Decorators.FarmAnimal moddedAnimal, byte fullness, int seed)
        {
            var random    = new Random(seed);
            var happiness = moddedAnimal.GetHappiness();

            return((random.NextDouble() < fullness / 200.0) & (random.NextDouble() < happiness / 70.0));
        }
 private static void PurchasedAnimalBellsAndWhistles(Decorators.FarmAnimal moddedAnimal)
 {
     if (moddedAnimal.MakesSound())
     {
         BellsAndWhistles.CueSound(moddedAnimal.GetSound(), "Pitch", 1200 + Random.Next(-200, 201));
     }
     BellsAndWhistles.AddHudMessage(
         Content.LoadString("Strings\\StringsFromCSFiles:PurchaseAnimalsMenu.cs.11324", moddedAnimal.GetDisplayType()),
         Color.LimeGreen, 3500f);
 }
        public void OverwriteFarmAnimal(ref Decorators.FarmAnimal moddedAnimal, string requestedType)
        {
            if (!moddedAnimal.HasName())
            {
                return;
            }
            var typeLog = GetTypeLog(moddedAnimal.GetUniqueId());
            var type    = typeLog == null ? requestedType ?? moddedAnimal.GetTypeString() : typeLog.Current;

            moddedAnimal.UpdateFromData(type);
        }
Example #9
0
        public static bool Prefix(ref StardewValley.FarmAnimal __instance, ref Farmer who)
        {
            var moddedAnimal = new Decorators.FarmAnimal(__instance);

            AttemptToSpawnProduce(ref moddedAnimal, Game.GetMasterPlayer());
            if (ShouldStopFindingProduce(ref moddedAnimal))
            {
                moddedAnimal.SetCurrentProduce(-1);
            }
            return(false);
        }
Example #10
0
 private static void HandleFindGrassToEat(
     ref Decorators.FarmAnimal moddedAnimal,
     ref Location moddedLocation)
 {
     if (!moddedLocation.IsOutdoors() || moddedAnimal.GetFullness() >= 195 || Random.NextDouble() >= 0.002 ||
         !Paritee.StardewValley.Core.Characters.FarmAnimal.UnderMaxPathFindingPerTick())
     {
         return;
     }
     Paritee.StardewValley.Core.Characters.FarmAnimal.IncreasePathFindingThisTick();
     moddedAnimal.SetFindGrassPathController(moddedLocation.GetOriginal());
 }
Example #11
0
        public static bool Prefix(ref StardewValley.FarmAnimal __instance, ref Building home)
        {
            var moddedAnimal = new Decorators.FarmAnimal(__instance);

            if (!moddedAnimal.HasName())
            {
                return(true);
            }
            moddedAnimal.SetHome(home);
            Mod.ReadSaveData <FarmAnimals>("farm-animals").OverwriteFarmAnimal(ref moddedAnimal, null);
            return(false);
        }
Example #12
0
        public static bool Prefix(ref StardewValley.Menus.PurchaseAnimalsMenu __instance, ref SpriteBatch b)
        {
            var purchaseAnimalsMenu = new Decorators.PurchaseAnimalsMenu(__instance);
            var farmAnimal          = new Decorators.FarmAnimal(purchaseAnimalsMenu.GetAnimalBeingPurchased());

            if (!BellsAndWhistles.IsFaded() && purchaseAnimalsMenu.IsOnFarm())
            {
                var str = Content.FormatMoneyString(farmAnimal.GetPrice());
                var x   = Game.GetViewport().Width / 2 - Content.GetWidthOfString(str) / 2;
                var y   = (int)(18.0 * SpriteText.fontPixelZoom * 2.0);
                BellsAndWhistles.DrawScroll(b, str, x, y);
            }

            return(true);
        }
Example #13
0
        private static void HandleProduceSpawn(Decorators.FarmAnimal moddedAnimal)
        {
            if (!moddedAnimal.LaysProduce() || !moddedAnimal.HasHome())
            {
                return;
            }
            var indoors        = Paritee.StardewValley.Core.Locations.AnimalHouse.GetIndoors(moddedAnimal.GetHome());
            var tileLocation   = moddedAnimal.GetTileLocation();
            var currentProduce = moddedAnimal.GetCurrentProduce();
            var produceQuality = moddedAnimal.GetProduceQuality();
            var flag           = true;

            foreach (var @object in indoors.Objects.Values)
            {
                int num;
                if ((bool)@object.bigCraftable && (int)@object.parentSheetIndex == 165 && @object.heldObject.Value != null)
                {
                    num = (@object.heldObject.Value as Chest).addItem(
                        new StardewValley.Object(Vector2.Zero, currentProduce, null, false, true, false, false)
                    {
                        Quality = produceQuality
                    }) == null
            ? 1
            : 0;
                }
                else
                {
                    num = 0;
                }
                if (num != 0)
                {
                    @object.showNextIndex.Value = true;
                    flag = false;
                    break;
                }
            }

            if (flag && !indoors.Objects.ContainsKey(tileLocation))
            {
                var @object = new StardewValley.Object(Vector2.Zero, currentProduce, null, false, true, false, true)
                {
                    Quality = produceQuality
                };
                Location.SpawnObject(indoors, tileLocation, @object);
            }

            moddedAnimal.SetCurrentProduce(-1);
        }
Example #14
0
 public static void Postfix(ref StardewValley.FarmAnimal __instance, ref GameLocation environtment)
 {
     if (__instance.pushAccumulator == 1)
     {
         __instance.pushAccumulator = 0;
     }
     else
     {
         __instance.daysToLay.Value = (byte)__instance.pauseTimer;
         var moddedAnimal = new Decorators.FarmAnimal(__instance);
         moddedAnimal.SetPauseTimer(0);
         var hitGlowTimer = (byte)moddedAnimal.GetHitGlowTimer();
         moddedAnimal.SetHitGlowTimer(0);
         HandleCurrentProduce(ref moddedAnimal, hitGlowTimer);
     }
 }
Example #15
0
        private static bool HasNoImpediments(Decorators.FarmAnimal moddedAnimal, Location moddedLocation)
        {
            var boundingBox = moddedAnimal.GetBoundingBox();

            for (var corner = 0; corner < 4; ++corner)
            {
                var cornersOfThisRectangle = StardewValley.Utility.getCornersOfThisRectangle(ref boundingBox, corner);
                var key = new Vector2(cornersOfThisRectangle.X / 64f, cornersOfThisRectangle.Y / 64f);
                if (moddedLocation.GetOriginal().terrainFeatures.ContainsKey(key) ||
                    moddedLocation.GetOriginal().objects.ContainsKey(key))
                {
                    return(false);
                }
            }

            return(true);
        }
Example #16
0
        private static bool AttemptToSpawnProduce(ref Decorators.FarmAnimal moddedAnimal, Farmer who)
        {
            var translatedVector2 =
                StardewValley.Utility.getTranslatedVector2(moddedAnimal.GetTileLocation(), moddedAnimal.GetFacingDirection(),
                                                           1f);
            var currentProduce = moddedAnimal.GetCurrentProduce();

            if (!Paritee.StardewValley.Core.Characters.FarmAnimal.IsProduceAnItem(currentProduce))
            {
                return(false);
            }
            var @object = new StardewValley.Object(Vector2.Zero, currentProduce, null, false, true, false, true)
            {
                Quality = moddedAnimal.GetProduceQuality()
            };

            Location.SpawnObject(Game.GetFarm(), translatedVector2, @object);
            return(true);
        }
        private static void HandleNewborn(
            ref Decorators.AnimalHouse moddedAnimalHouse,
            string name,
            ref QuestionEvent questionEvent,
            Farmer moddedPlayer)
        {
            var withEggReadyToHatch = moddedAnimalHouse.GetIncubatorWithEggReadyToHatch();
            var moddedParent        = new Decorators.FarmAnimal(questionEvent.animal);
            var dictionary          = FarmAnimals.GroupTypesByCategory().Where(kvp => kvp.Value.Contains(moddedParent.GetTypeString()))
                                      .ToDictionary(kvp => kvp.Key, kvp => moddedPlayer.SanitizeBlueChickens(kvp.Value));
            var randomTypeFromProduce = moddedParent.GetRandomTypeFromProduce(dictionary);
            var building   = moddedAnimalHouse.GetBuilding();
            var farmAnimal = new Decorators.FarmAnimal(moddedPlayer.CreateFarmAnimal(randomTypeFromProduce, name, building));

            farmAnimal.AssociateParent(questionEvent.animal);
            farmAnimal.AddToBuilding(building);
            farmAnimal.SetCurrentProduce(-1);
            Event.ForceQuestionEventToProceed(questionEvent);
        }
Example #18
0
        private static void HandleCurrentProduce(ref Decorators.FarmAnimal moddedAnimal, byte originalFullness)
        {
            var daysToLay = moddedAnimal.GetDaysToLay(moddedAnimal.GetOwner());
            var seed      = (int)moddedAnimal.GetUniqueId() / 2 + Game.GetDaysPlayed();
            var flag      = RollRandomProduceChance(moddedAnimal, originalFullness, seed);

            if (!moddedAnimal.IsAProducer() || moddedAnimal.IsBaby())
            {
                moddedAnimal.SetCurrentProduce(-1);
            }
            else
            {
                if (moddedAnimal.GetDaysSinceLastLay() < daysToLay)
                {
                    return;
                }
                if (!flag)
                {
                    moddedAnimal.SetCurrentProduce(-1);
                }
                else
                {
                    HandleGameStats(moddedAnimal);
                    var player         = Game.GetPlayer();
                    var farmAnimals    = FarmAnimals.ReadCache();
                    var typeStr        = moddedAnimal.GetTypeString();
                    var farmAnimalType = farmAnimals.Categories.SelectMany(o => (IEnumerable <FarmAnimalType>)o.Types)
                                         .Where(o => o.Type == typeStr).FirstOrDefault();
                    var deluxeProduceLuck = farmAnimalType == null ? 0.0 : farmAnimalType.DeluxeProduceLuck;
                    var produceIndex      = moddedAnimal.RollProduce(seed, player, deluxeProduceLuck);
                    moddedAnimal.SetCurrentProduce(produceIndex);
                    if (!Paritee.StardewValley.Core.Characters.FarmAnimal.IsProduceAnItem(produceIndex))
                    {
                        return;
                    }
                    moddedAnimal.SetDaysSinceLastLay(0);
                    HandleProduceQuality(moddedAnimal, seed);
                    HandleProduceSpawn(moddedAnimal);
                }
            }
        }
        private static bool HandleOnFarm(
            ref Decorators.PurchaseAnimalsMenu moddedMenu,
            int x,
            int y,
            Farmer moddedPlayer)
        {
            if (moddedMenu.IsNamingAnimal())
            {
                return(true);
            }
            var viewport   = Game.GetViewport();
            var buildingAt = Game.GetFarm().getBuildingAt(new Vector2((x + viewport.X) / 64, (y + viewport.Y) / 64));

            if (buildingAt == null)
            {
                return(true);
            }
            var animalBeingPurchased = moddedMenu.GetAnimalBeingPurchased();
            var moddedAnimal         = new Decorators.FarmAnimal(animalBeingPurchased);

            if (!moddedAnimal.CanLiveIn(buildingAt) || new Building(buildingAt).IsFull() || !moddedAnimal.CanBeNamed())
            {
                return(true);
            }
            var priceOfAnimal = moddedMenu.GetPriceOfAnimal();

            if (!moddedPlayer.CanAfford(priceOfAnimal))
            {
                return(true);
            }
            moddedAnimal.AddToBuilding(buildingAt);
            moddedMenu.SetAnimalBeingPurchased(animalBeingPurchased);
            moddedMenu.SetNewAnimalHome(null);
            moddedMenu.SetNamingAnimal(false);
            moddedPlayer.SpendMoney(priceOfAnimal);
            PurchasedAnimalBellsAndWhistles(moddedAnimal);
            return(false);
        }
Example #20
0
        private static void HandleGameStats(Decorators.FarmAnimal moddedAnimal)
        {
            try
            {
                switch (moddedAnimal.GetDefaultProduce())
                {
                case 176:
                case 180:
                    ++Game1.stats.ChickenEggsLayed;
                    break;

                case 440:
                    ++Game1.stats.RabbitWoolProduced;
                    break;

                case 442:
                    ++Game1.stats.DuckEggsLayed;
                    break;
                }
            }
            catch
            {
            }
        }
Example #21
0
        private static bool HandleNightTimeRoutine(
            ref Decorators.FarmAnimal moddedAnimal,
            ref Location moddedLocation)
        {
            if (Game.GetTimeOfDay() < 1700 || !moddedLocation.IsOutdoors() || moddedAnimal.HasController() ||
                Random.NextDouble() >= 0.002)
            {
                return(false);
            }
            if (moddedLocation.AnyFarmers())
            {
                moddedLocation.RemoveAnimal(moddedAnimal.GetOriginal());
                moddedAnimal.ReturnHome();
                return(true);
            }

            if (Paritee.StardewValley.Core.Characters.FarmAnimal.UnderMaxPathFindingPerTick())
            {
                Paritee.StardewValley.Core.Characters.FarmAnimal.IncreasePathFindingThisTick();
                moddedAnimal.SetFindHomeDoorPathController(moddedLocation.GetOriginal());
            }

            return(false);
        }
Example #22
0
        public void AddAnimal(Decorators.FarmAnimal animalToBeAdded)
        {
            var typeLog = new TypeLog(animalToBeAdded.GetTypeString(), animalToBeAdded.GetTypeString());

            AddAnimal(animalToBeAdded, typeLog);
        }
Example #23
0
 public void AddAnimal(Decorators.FarmAnimal animalToBeAdded, TypeLog typeLog)
 {
     AddAnimal(new FarmAnimal(animalToBeAdded.GetUniqueId(), typeLog));
 }
Example #24
0
 public string GetSavedTypeOrDefault(Decorators.FarmAnimal moddedAnimal)
 {
     return(GetSavedTypeOrDefault(moddedAnimal.GetUniqueId(), moddedAnimal.IsCoopDweller()));
 }
Example #25
0
 private static bool CanFindProduce(Decorators.FarmAnimal moddedAnimal, Farmer moddedPlayer)
 {
     return(!moddedAnimal.IsBaby() && moddedAnimal.CanFindProduce() &&
            Paritee.StardewValley.Core.Characters.FarmAnimal.IsProduceAnItem(moddedAnimal.GetCurrentProduce()));
 }
Example #26
0
        private static void HandleProduceQuality(Decorators.FarmAnimal moddedAnimal, int seed)
        {
            var quality = moddedAnimal.RollProduceQuality(moddedAnimal.GetOwner(), seed);

            moddedAnimal.SetProduceQuality(quality);
        }