Ejemplo n.º 1
0
        private bool PrivateIsTileInRangeOfSprinklers(IEnumerable <SObject> sprinklers, GameLocation location, Vector2 tileLocation, bool isForAllSprinklers)
        {
            var sprinklersList = sprinklers.ToList();

            foreach (var sprinkler in sprinklersList)
            {
                if (!sprinkler.IsSprinkler())
                {
                    continue;
                }

                var info = GetSprinklerInfo(sprinkler);
                var manhattanDistance = ((int)tileLocation.X - (int)sprinkler.TileLocation.X) + ((int)tileLocation.Y - (int)sprinkler.TileLocation.Y);
                if (manhattanDistance > GetFloodFillSprinklerRange(info.Power))
                {
                    if (SprinklerBehavior is not ISprinklerBehavior.Independent || !info.Layout.Contains(tileLocation - sprinkler.TileLocation))
                    {
                        continue;
                    }
                }
                goto afterSimpleCheck;
            }

            return(false);

            afterSimpleCheck :;

            if (isForAllSprinklers)
            {
                return(SprinklerBehavior.GetSprinklerTiles(
                           new GameLocationMap(location, CustomWaterableTileProviders)
                           ).Contains(new IntPoint((int)tileLocation.X, (int)tileLocation.Y)));
            }
            else if (SprinklerBehavior is ISprinklerBehavior.Independent independent)
            {
                return(independent.GetSprinklerTiles(
                           new GameLocationMap(location, CustomWaterableTileProviders),
                           sprinklersList
                           .Where(s => s.IsSprinkler())
                           .Select(s => (position: new IntPoint((int)s.TileLocation.X, (int)s.TileLocation.Y), info: GetSprinklerInfo(s)))
                           ).Contains(new IntPoint((int)tileLocation.X, (int)tileLocation.Y)));
            }
            else
            {
                throw new InvalidOperationException("Current sprinkler behavior does not allow independent sprinkler activation.");
            }
        }
Ejemplo n.º 2
0
        public void ActivateSprinklersInLocation(GameLocation location)
        {
            if (location.IsOutdoors && Game1.IsRainingHere(location))
            {
                return;
            }
            if (Game1.player.team.SpecialOrderRuleActive("NO_SPRINKLER"))
            {
                return;
            }

            IMap map            = new GameLocationMap(location, CustomWaterableTileProviders);
            var  sprinklerTiles = SprinklerBehavior.GetSprinklerTiles(map);

            foreach (var sprinklerTile in sprinklerTiles)
            {
                map.WaterTile(sprinklerTile);
            }
            foreach (var sprinkler in location.Objects.Values.Where(o => o.IsSprinkler()))
            {
                sprinkler.ApplySprinklerAnimation(location);
            }
        }