/// <summary>Raised after a player warps to a new location.</summary>
 /// <param name="sender">The event sender.</param>
 /// <param name="e">The event arguments.</param>
 private void OnPlayerWarped(object sender, WarpedEventArgs e)
 {
     if (e.IsLocalPlayer)
     {
         musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
     }
 }
 /// <summary>
 /// Choose new music when a menu is closed.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void MenuEvents_MenuClosed(object sender, StardewModdingAPI.Events.EventArgsClickableMenuClosed e)
 {
     if (menuChangedMusic == true)
     {
         musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
     }
 }
        /*********
        ** Public methods
        *********/
        /// <summary>The mod entry point, called after the mod is first loaded.</summary>
        /// <param name="helper">Provides simplified APIs for writing mods.</param>
        public override void Entry(IModHelper helper)
        {
            ModHelper  = helper;
            ModMonitor = this.Monitor;
            Config     = helper.ReadConfig <Config>();
            helper.Events.GameLoop.SaveLoaded += this.OnSaveLoaded;

            helper.Events.Player.Warped         += this.OnPlayerWarped;
            helper.Events.GameLoop.UpdateTicked += this.OnUpdateTicked;
            helper.Events.Input.ButtonPressed   += this.OnButtonPressed;
            helper.Events.GameLoop.Saving       += this.OnSaving;

            helper.Events.Display.MenuChanged += this.OnMenuChanged;

            helper.Events.GameLoop.GameLaunched += this.OnGameLaunched;


            musicManager   = new MusicManager();
            textureManager = new TextureManager();
            this.LoadTextures();

            menuChangedMusic = false;


            //Initialize all of the lists upon creation during entry.
            SongSpecifics.initializeMenuList();
            SongSpecifics.initializeFestivalsList();

            this.LoadMusicPacks();
        }
 /// <summary>
 /// Raised every frame. Mainly used just to initiate the music packs. Probably not needed.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void GameEvents_UpdateTick(object sender, EventArgs e)
 {
     if (musicPacksInitialized == false)
     {
         initializeMusicPacks();
         musicPacksInitialized = true;
         musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
     }
 }
        /// <summary>
        /// Entry point for the mod.
        /// </summary>
        /// <param name="helper"></param>
        public override void Entry(IModHelper helper)
        {
            DefaultSoundBank = Game1.soundBank;
            DefaultWaveBank  = Game1.waveBank;
            ModHelper        = helper;
            ModMonitor       = Monitor;
            Manifest         = ModManifest;
            Config           = helper.ReadConfig <Config>();
            StardewModdingAPI.Events.SaveEvents.AfterLoad += SaveEvents_AfterLoad;
            // StardewModdingAPI.Events.EventArgsLocationsChanged += LocationEvents_CurrentLocationChanged;

            StardewModdingAPI.Events.PlayerEvents.Warped      += PlayerEvents_Warped;
            StardewModdingAPI.Events.GameEvents.UpdateTick    += GameEvents_UpdateTick;
            StardewModdingAPI.Events.ControlEvents.KeyPressed += ControlEvents_KeyPressed;
            StardewModdingAPI.Events.SaveEvents.BeforeSave    += SaveEvents_BeforeSave;

            StardewModdingAPI.Events.MenuEvents.MenuChanged += MenuEvents_MenuChanged;
            StardewModdingAPI.Events.MenuEvents.MenuClosed  += MenuEvents_MenuClosed;

            StardewModdingAPI.Events.GameEvents.FirstUpdateTick += GameEvents_FirstUpdateTick;
            StardewModdingAPI.Events.GameEvents.OneSecondTick   += GameEvents_OneSecondTick;


            musicManager = new MusicManager();

            MusicPath              = Path.Combine(ModHelper.DirectoryPath, "Content", "Music");
            WavMusicDirectory      = Path.Combine(MusicPath, "Wav");
            XACTMusicDirectory     = Path.Combine(MusicPath, "XACT");
            TemplateMusicDirectory = Path.Combine(MusicPath, "Templates");


            textureManager = new TextureManager();
            this.createDirectories();
            this.createBlankXACTTemplate();
            this.createBlankWAVTemplate();

            musicPacksInitialized = false;
            menuChangedMusic      = false;


            //Initialize all of the lists upon creation during entry.
            SongSpecifics.initializeMenuList();
            SongSpecifics.initializeEventsList();
            SongSpecifics.initializeFestivalsList();

            initializeMusicPacks();
        }
        /// <summary>Raised after a game menu is opened, closed, or replaced.</summary>
        /// <param name="sender">The event sender.</param>
        /// <param name="e">The event arguments.</param>
        private void OnMenuChanged(object sender, MenuChangedEventArgs e)
        {
            // menu closed
            if (e.NewMenu == null)
            {
                if (menuChangedMusic)
                {
                    musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
                }
            }

            // menu changed
            else
            {
                musicManager.SelectMenuMusic(SongSpecifics.getCurrentConditionalString());
            }
        }
        /// <summary>
        /// Events to occur after the game has loaded in.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SaveEvents_AfterLoad(object sender, EventArgs e)
        {
            //Locaion initialization MUST occur after load. Anything else can occur before.
            SongSpecifics.initializeLocationsList(); //Gets all Game locations once the player has loaded the game, and all buildings on the player's farm and adds them to a location list.
            musicManager.initializeSeasonalMusic();  //Initialize the seasonal music using all locations gathered in the location list.
            musicManager.initializeMenuMusic();
            musicManager.initializeFestivalMusic();
            musicManager.initializeEventMusic();

            foreach (var musicPack in musicManager.musicPacks)
            {
                musicPack.Value.readFromJson();
            }

            SongSpecifics.menus.Sort();
            SongSpecifics.locations.Sort();
            SongSpecifics.festivals.Sort();
            SongSpecifics.events.Sort();

            musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
        }
 /// <summary>
 /// Raised when the player changes locations. This should determine the next song to play.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void LocationEvents_CurrentLocationChanged(object sender, StardewModdingAPI.Events.EventArgsCurrentLocationChanged e)
 {
     musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
 }
 /// <summary>
 /// Choose new music when a menu is opened.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void MenuEvents_MenuChanged(object sender, StardewModdingAPI.Events.EventArgsClickableMenuChanged e)
 {
     //var ok = musicManager.currentMusicPack.getNameOfCurrentSong();
     musicManager.selectMenuMusic(SongSpecifics.getCurrentConditionalString());
 }
 /// <summary>
 /// Raised when the player changes locations. This should determine the next song to play.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void PlayerEvents_Warped(object sender, StardewModdingAPI.Events.EventArgsPlayerWarped e)
 {
     musicManager.selectMusic(SongSpecifics.getCurrentConditionalString());
 }