/// <summary> /// Checks if the key is only as specific as having a time set. (i.e not location or day specific) /// </summary> /// <param name="key"></param> /// <returns></returns> public static bool IsKeyTimeSpecific(string key) { SongConditionals condition = new SongConditionals(key); if (condition.isTimeSpecific()) { return(true); } return(false); }
public static bool IsKeyGeneric(string key) { SongConditionals condition = new SongConditionals(key); if (condition.isLocationSpecific() == false && condition.isTimeSpecific() == false && condition.isDaySpecific() == false) { return(true); } return(false); }
/// <summary> /// Checks to see if a song can be played given a set of conditionals. /// </summary> /// <param name="key"></param> /// <returns></returns> public bool canBePlayed(string key) { foreach (KeyValuePair <string, SongConditionals> pair in this.songConditionals) { SongConditionals temp = new SongConditionals(key); if (pair.Value.canBePlayed(temp) == true) { return(true); } } return(false); }
/// <summary> /// Checks if a song can be played provided a given key. /// </summary> /// <param name="key"></param> /// <returns></returns> public bool canBePlayed(SongConditionals other) { if (this.isLocationSpecific()) { if (!string.IsNullOrEmpty(other.location)) { if (this.location.Equals(other.location) == false) { return(false); //If there is a check but not the right location return false } } else { return(false); //If there is no check against this then return false; } } if (this.isTimeSpecific()) { if (!string.IsNullOrEmpty(other.time)) { if (this.time.Equals(other.time) == false) { return(false); //If the two times don't match return false } } else { return(false); //If there is no check against this and this is time specific don't allow it. } } if (this.isDaySpecific()) { //condition specific check if (!string.IsNullOrEmpty(other.dayOfWeek)) { if (this.dayOfWeek.Equals(other.dayOfWeek) == false) { return(false); } } else { return(false); //There is no check against this day of the week. Don't allow it. } } //Check for season. if (this.isSeasonSpecific()) { if (!string.IsNullOrEmpty(other.season)) { if (this.season.Equals(other.season) == false) { return(false); } } else { return(false); } } //Check for weather. if (this.isWeatherSpecific()) { if (!string.IsNullOrEmpty(other.weather)) { if (this.weather.Equals(other.weather) == false) { return(false); } } else { return(false); } } if (!string.IsNullOrEmpty(this.menu)) { if (!string.IsNullOrEmpty(other.menu)) { if (this.menu.Equals(other.menu) == false) { return(false); } } } if (!string.IsNullOrEmpty(this.festival)) { if (!string.IsNullOrEmpty(other.festival)) { if (this.festival.Equals(other.festival) == false) { return(false); } } } if (!string.IsNullOrEmpty(this.eventKey)) { if (!string.IsNullOrEmpty(other.eventKey)) { if (this.eventKey.Equals(other.eventKey) == false) { return(false); } } } return(true); }
/// <summary>Select the actual song to be played right now based on the selector key. The selector key should be called when the player's location changes.</summary> public bool selectMusic(string songListKey, bool warpCheck = false) { if (this.CurrentMusicPack != null) { if (this.CurrentMusicPack.IsPlaying() && StardewSymphony.Config.WaitForSongToFinishBeforeMusicSwap) { StardewSymphony.ModMonitor.Log("Waiting for music to finish before playing another song."); return(false); } } if (warpCheck == true) { if (StardewSymphony.Config.LocationsToIgnoreWarpMusicChange.ContainsKey(Game1.player.currentLocation.Name)) { if (StardewSymphony.Config.LocationsToIgnoreWarpMusicChange[Game1.player.currentLocation.Name] == true) { return(false); } } return(false); } //Prevent generic song changes when running about. SongConditionals conditional = new SongConditionals(songListKey); // stop timer timer when music is selected this.Timer.Enabled = false; // get applicable music packs var listOfValidMusicPacks = this.GetApplicableMusicPacks(songListKey); //If the list of valid packs are 0, check if I'm currently at an event or festival or get some location specific music and try to play a generalized song from there. if (listOfValidMusicPacks.Count == 0) { //No valid songs to play at this time. if (StardewSymphony.Config.EnableDebugLog) { StardewSymphony.ModMonitor.Log("Error: There are no songs to play across any music pack for the song key: " + songListKey + ".7 Are you sure you did this properly?"); } StardewSymphony.menuChangedMusic = false; return(false); } //All music packs that have songs have been taken into acount. //Check all songs in all music packs to see if it can be played here. List <KeyValuePair <MusicPackV2, string> > packSongNames = new List <KeyValuePair <MusicPackV2, string> >(); List <KeyValuePair <MusicPackV2, string> > locpackSongNames = new List <KeyValuePair <MusicPackV2, string> >(); foreach (var ok in listOfValidMusicPacks) { foreach (SongInformation song in ok.Key.SongInformation.songs.Values) { if (song.canBePlayed(songListKey)) { foreach (SongConditionals con in song.songConditionals.Values) { if (con.isLocationSpecific() == false) { //If the key is generic skip over it. if (con.isKeyGeneric()) { if (this.CurrentMusicPack != null) { if (this.CurrentMusicPack.IsPlaying()) { continue; } } } //If I have warped and the key only is to be played when time changes prevent a new song from playing. //If the key is more specific (I.E has a location associated with it) then music will change. if (warpCheck == true && con.isTimeSpecific()) { if (this.CurrentMusicPack != null) { if (this.CurrentMusicPack.IsPlaying()) { continue; } } } } else { locpackSongNames.Add(new KeyValuePair <MusicPackV2, string>(ok.Key, song.name)); } } packSongNames.Add(new KeyValuePair <MusicPackV2, string>(ok.Key, song.name)); } } } //If there is a valid key for the place/time/event/festival I am at, play it! int randInt = this.Random.Next(0, packSongNames.Count - 1); var musicPackPair = packSongNames.ElementAt(randInt); /* * //Check to see if the only location song was the one I was just playing. If so ignore it and chose more generic music. * if (locpackSongNames.Count == 1) * { * if (musicPackPair.Key == locpackSongNames[0].Key) * { * if (musicPackPair.Value == locpackSongNames[0].Value) * { * //Don't care * } * } * } * //If not the try to chose another location specific song. * else * { * packSongNames = locpackSongNames; * randInt = this.Random.Next(0, packSongNames.Count - 1); * musicPackPair = packSongNames.ElementAt(randInt); * }*/ while (true) { if (this.CurrentMusicPack != null) { if (packSongNames.Count == 0) { return(false); } if (musicPackPair.Key.Name == this.CurrentMusicPack.Name) { if (musicPackPair.Value == this.CurrentMusicPack.CurrentSongName) { if (packSongNames.Count == 1) { return(false); } else { //Used to eliminate chosing the same song from the same pack. packSongNames.Remove(musicPackPair); randInt = this.Random.Next(0, packSongNames.Count - 1); musicPackPair = packSongNames.ElementAt(randInt); } } else { //Different song from same pack break; } } else { //Different pack so probably different song. break; } } else { break; } } //used to swap the music packs and stop the last playing song. this.SwapMusicPacks(musicPackPair.Key.Name); string songName = musicPackPair.Value; this.CurrentMusicPack.PlaySong(songName); return(true); }