public static void AbigailCaveTick()
        {
            Game1.player.CurrentToolIndex = Game1.player.items.Count;

            List <NPC> list = Game1.player.currentLocation.characters.ToList().FindAll((n) => (n is Monster) && (n as Monster).Health <= 0);

            foreach (NPC n in list)
            {
                Game1.player.currentLocation.characters.Remove(n);
            }

            if (abigailTicks < 0)
            {
                return;
            }
            Game1.exitActiveMenu();

            if (abigailTicks == 0)
            {
                FieldInfo f1 = Game1.player.currentLocation.characters.GetType().GetField("OnValueRemoved", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                f1.SetValue(Game1.player.currentLocation.characters, null);
            }

            Vector2 v   = Vector2.Zero;
            float   yrt = (float)(1 / Math.Sqrt(2));

            if (Helper.Input.IsDown(SButton.Up))
            {
                if (Helper.Input.IsDown(SButton.Right))
                {
                    v = new Vector2(yrt, -yrt);
                }
                else if (Helper.Input.IsDown(SButton.Left))
                {
                    v = new Vector2(-yrt, -yrt);
                }
                else
                {
                    v = new Vector2(0, -1);
                }
            }
            else if (Helper.Input.IsDown(SButton.Down))
            {
                if (Helper.Input.IsDown(SButton.Right))
                {
                    v = new Vector2(yrt, yrt);
                }
                else if (Helper.Input.IsDown(SButton.Left))
                {
                    v = new Vector2(-yrt, yrt);
                }
                else
                {
                    v = new Vector2(0, 1);
                }
            }
            else if (Helper.Input.IsDown(SButton.Right))
            {
                v = new Vector2(1, 0);
            }
            else if (Helper.Input.IsDown(SButton.Left))
            {
                v = new Vector2(-1, 0);
            }
            else if (Helper.Input.IsDown(SButton.MouseLeft))
            {
                float x  = Game1.viewport.X + Game1.getOldMouseX() - Game1.player.position.X;
                float y  = Game1.viewport.Y + Game1.getOldMouseY() - Game1.player.position.Y;
                float dx = Math.Abs(x);
                float dy = Math.Abs(y);
                if (y < 0)
                {
                    if (x > 0)
                    {
                        if (dy > dx)
                        {
                            if (dy - dx > dy / 2)
                            {
                                v = new Vector2(0, -1);
                            }
                            else
                            {
                                v = new Vector2(yrt, -yrt);
                            }
                        }
                        else
                        {
                            if (dx - dy > x / 2)
                            {
                                v = new Vector2(1, 0);
                            }
                            else
                            {
                                v = new Vector2(yrt, -yrt);
                            }
                        }
                    }
                    else
                    {
                        if (dy > dx)
                        {
                            if (dy - dx > dy / 2)
                            {
                                v = new Vector2(0, -1);
                            }
                            else
                            {
                                v = new Vector2(-yrt, -yrt);
                            }
                        }
                        else
                        {
                            if (dx - dy > x / 2)
                            {
                                v = new Vector2(-1, 0);
                            }
                            else
                            {
                                v = new Vector2(-yrt, -yrt);
                            }
                        }
                    }
                }
                else
                {
                    if (x > 0)
                    {
                        if (dy > dx)
                        {
                            if (dy - dx > dy / 2)
                            {
                                v = new Vector2(0, 1);
                            }
                            else
                            {
                                v = new Vector2(yrt, yrt);
                            }
                        }
                        else
                        {
                            if (dx - dy > x / 2)
                            {
                                v = new Vector2(1, 0);
                            }
                            else
                            {
                                v = new Vector2(yrt, yrt);
                            }
                        }
                    }
                    else
                    {
                        if (dy > dx)
                        {
                            if (dy - dx > dy / 2)
                            {
                                v = new Vector2(0, -1);
                            }
                            else
                            {
                                v = new Vector2(-yrt, yrt);
                            }
                        }
                        else
                        {
                            if (dx - dy > x / 2)
                            {
                                v = new Vector2(-1, 0);
                            }
                            else
                            {
                                v = new Vector2(-yrt, yrt);
                            }
                        }
                    }
                }
            }

            if (v != Vector2.Zero && Game1.player.millisecondsPlayed - lastProjectile > 350)
            {
                Game1.player.currentLocation.projectiles.Add(new AbigailProjectile(1, 383, 0, 0, 0, v.X * 6, v.Y * 6, new Vector2(Game1.player.getStandingX() - 24, Game1.player.getStandingY() - 48), "Cowboy_monsterDie", "Cowboy_gunshot", false, true, Game1.player.currentLocation, Game1.player, true));
                lastProjectile = Game1.player.millisecondsPlayed;
            }

            foreach (SButton button in abigailShootButtons)
            {
                if (Helper.Input.IsDown(button))
                {
                    switch (button)
                    {
                    case SButton.Up:
                        break;

                    case SButton.Right:
                        v = new Vector2(1, 0);
                        break;

                    case SButton.Down:
                        v = new Vector2(0, 1);
                        break;

                    default:
                        v = new Vector2(-1, 0);
                        break;
                    }
                }
            }


            abigailTicks++;
            if (abigailTicks > 80000 / 16f)
            {
                if (Game1.player.currentLocation.characters.ToList().FindAll((n) => (n is Monster)).Count > 0)
                {
                    return;
                }

                abigailTicks           = -1;
                Game1.player.hat.Value = null;
                Game1.stopMusicTrack(Game1.MusicContext.Default);

                if (!Game1.player.mailReceived.Contains("ScubaFins"))
                {
                    Game1.playSound("Cowboy_Secret");
                    SwimMaps.AddScubaChest(Game1.player.currentLocation, new Vector2(8, 8), "ScubaFins");
                }

                Game1.player.currentLocation.setMapTile(8, 16, 91, "Buildings", null);
                Game1.player.currentLocation.setMapTile(9, 16, 92, "Buildings", null);
                Game1.player.currentLocation.setTileProperty(9, 16, "Back", "Water", "T");
                Game1.player.currentLocation.setMapTile(10, 16, 93, "Buildings", null);
                Game1.player.currentLocation.setMapTile(8, 17, 107, "Buildings", null);
                Game1.player.currentLocation.setMapTile(9, 17, 108, "Back", null);
                Game1.player.currentLocation.setTileProperty(9, 17, "Back", "Water", "T");
                Game1.player.currentLocation.removeTile(9, 17, "Buildings");
                Game1.player.currentLocation.setMapTile(10, 17, 109, "Buildings", null);
                Game1.player.currentLocation.setMapTile(8, 18, 139, "Buildings", null);
                Game1.player.currentLocation.setMapTile(9, 18, 140, "Buildings", null);
                Game1.player.currentLocation.setMapTile(10, 18, 141, "Buildings", null);
                SwimMaps.AddWaterTiles(Game1.player.currentLocation);
            }
            else
            {
                if (Game1.random.NextDouble() < 0.04)
                {
                    int   which = Game1.random.Next(3);
                    Point p     = new Point();
                    switch (Game1.random.Next(4))
                    {
                    case 0:
                        p = new Point(8 + which, 1);
                        break;

                    case 1:
                        p = new Point(1, 8 + which);
                        break;

                    case 2:
                        p = new Point(8 + which, 16);
                        break;

                    case 3:
                        p = new Point(16, 8 + which);
                        break;
                    }
                    Game1.player.currentLocation.characters.Add(new AbigailMetalHead(new Vector2(p.X * Game1.tileSize, p.Y * Game1.tileSize), 0));
                }
            }
        }
 public static void GameLoop_DayStarted(object sender, DayStartedEventArgs e)
 {
     foreach (KeyValuePair <string, DiveMap> kvp in ModEntry.diveMaps)
     {
         GameLocation location = Game1.getLocationFromName(kvp.Key);
         if (location == null)
         {
             Monitor.Log($"GameLocation {kvp.Key} not found in day started loop");
             continue;
         }
         if (kvp.Value.Features.Contains("OceanTreasure") || kvp.Value.Features.Contains("OceanResources") || kvp.Value.Features.Contains("Minerals"))
         {
             Monitor.Log($"Clearing overlay objects from GameLocation {location.Name} ");
             location.overlayObjects.Clear();
         }
         if (kvp.Value.Features.Contains("OceanTreasure"))
         {
             Monitor.Log($"Adding ocean treasure to GameLocation {location.Name} ");
             SwimMaps.AddOceanTreasure(location);
         }
         if (kvp.Value.Features.Contains("OceanResources"))
         {
             Monitor.Log($"Adding ocean forage to GameLocation {location.Name} ");
             SwimMaps.AddOceanForage(location);
         }
         if (kvp.Value.Features.Contains("Minerals"))
         {
             Monitor.Log($"Adding minerals to GameLocation {location.Name} ");
             SwimMaps.AddMinerals(location);
         }
         if (kvp.Value.Features.Contains("SmolFishies") || kvp.Value.Features.Contains("BigFishies") || kvp.Value.Features.Contains("Crabs"))
         {
             Monitor.Log($"Clearing characters from GameLocation {location.Name} ");
             location.characters.Clear();
         }
         if (kvp.Value.Features.Contains("SmolFishies"))
         {
             Monitor.Log($"Adding smol fishies to GameLocation {location.Name} ");
             SwimMaps.AddFishies(location);
         }
         if (kvp.Value.Features.Contains("BigFishies"))
         {
             Monitor.Log($"Adding big fishies to GameLocation {location.Name} ");
             SwimMaps.AddFishies(location, false);
         }
         if (kvp.Value.Features.Contains("Crabs"))
         {
             Monitor.Log($"Adding crabs to GameLocation {location.Name} ");
             SwimMaps.AddCrabs(location);
         }
         if (kvp.Value.Features.Contains("WaterTiles"))
         {
             Monitor.Log($"Adding water tiles to GameLocation {location.Name} ");
             SwimMaps.AddWaterTiles(location);
         }
         if (kvp.Value.Features.Contains("Underwater"))
         {
             Monitor.Log($"Removing water tiles from GameLocation {location.Name} ");
             SwimMaps.RemoveWaterTiles(location);
         }
     }
     if (Game1.getLocationFromName("ScubaCave") != null && !Game1.player.mailReceived.Contains("ScubaMask"))
     {
         SwimMaps.AddScubaChest(Game1.getLocationFromName("ScubaCave"), new Vector2(10, 14), "ScubaMask");
     }
     ModEntry.marinerQuestionsWrongToday = false;
     ModEntry.oxygen = SwimUtils.MaxOxygen();
 }