Sucessfully loaded in songs with the WAV music packs. Just need to implement functionality in the WAV "packs"

This commit is contained in:
2018-02-03 20:40:03 -08:00
parent 1fb92f7cf7
commit b5b6c20830
8 changed files with 335 additions and 64 deletions

View File

@ -5,6 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using StardewSymphonyRemastered;
using StardewValley;
using System.IO;
namespace StardewSymphonyRemastered.Framework
{
@ -168,9 +169,9 @@ namespace StardewSymphonyRemastered.Framework
/// </summary>
/// <param name="songListKey"></param>
/// <returns></returns>
public Dictionary<MusicPack,List<string>> getListOfApplicableMusicPacks(string songListKey)
public Dictionary<MusicPack,List<Song>> getListOfApplicableMusicPacks(string songListKey)
{
Dictionary<MusicPack, List<string>> listOfValidDictionaries = new Dictionary<MusicPack, List<string>>();
Dictionary<MusicPack, List<Song>> listOfValidDictionaries = new Dictionary<MusicPack, List<Song>>();
foreach(var v in this.musicPacks)
{
var songList= v.Value.songInformation.getSongList(songListKey).Value;
@ -207,44 +208,39 @@ namespace StardewSymphonyRemastered.Framework
var songName = musicPackPair.Value.ElementAt(randInt2);
this.currentMusicPack.playSong(songName);
this.currentMusicPack.playSong(songName.name);
}
/// <summary>
/// TODO: Make WAV MUSIC PACKS
/// </summary>
/// <param name="wavMusicPack"></param>
public void addMusicPack(WavMusicPack wavMusicPack)
{
}
/// <summary>
/// Adds a valid xwb music pack to the list of music packs available.
/// </summary>
/// <param name="xwbMusicPack"></param>
/// <param name="musicPack"></param>
/// <param name="displayLogInformation">Whether or not to display the process to the console. Will include information from the pack's metadata. Default:False</param>
/// <param name="xwbMusicPack">If displayLogInformation is also true this will display the name of all of the songs in the music pack when it is added in.</param>
public void addMusicPack(XACTMusicPack xwbMusicPack,bool displayLogInformation=false,bool displaySongs=false)
public void addMusicPack(MusicPack musicPack,bool displayLogInformation=false,bool displaySongs=false)
{
if (displayLogInformation == true)
{
StardewSymphony.ModMonitor.Log("Adding a new music pack!");
StardewSymphony.ModMonitor.Log(" Name:" + xwbMusicPack.musicPackInformation.name);
StardewSymphony.ModMonitor.Log(" Author:" + xwbMusicPack.musicPackInformation.author);
StardewSymphony.ModMonitor.Log(" Description:" + xwbMusicPack.musicPackInformation.description);
StardewSymphony.ModMonitor.Log(" Version Info:" + xwbMusicPack.musicPackInformation.versionInfo);
StardewSymphony.ModMonitor.Log(" Location:" + musicPack.shortenedDirectory);
StardewSymphony.ModMonitor.Log(" Name:" + musicPack.musicPackInformation.name);
StardewSymphony.ModMonitor.Log(" Author:" + musicPack.musicPackInformation.author);
StardewSymphony.ModMonitor.Log(" Description:" + musicPack.musicPackInformation.description);
StardewSymphony.ModMonitor.Log(" Version Info:" + musicPack.musicPackInformation.versionInfo);
StardewSymphony.ModMonitor.Log(" Song List:");
if (displaySongs == true)
{
foreach(var songname in xwbMusicPack.songInformation.listOfSongsWithoutTriggers)
foreach(var song in musicPack.songInformation.listOfSongsWithoutTriggers)
{
StardewSymphony.ModMonitor.Log(" " + songname);
StardewSymphony.ModMonitor.Log(" " + song.name);
}
}
}
this.musicPacks.Add(xwbMusicPack.musicPackInformation.name,xwbMusicPack);
this.musicPacks.Add(musicPack.musicPackInformation.name,musicPack);
}
}
}

View File

@ -13,6 +13,7 @@ namespace StardewSymphonyRemastered.Framework
public class MusicPack
{
public string directory;
public string shortenedDirectory;
public StardewSymphonyRemastered.Framework.SongSpecifics songInformation;
public MusicPackMetaData musicPackInformation;
@ -52,5 +53,9 @@ namespace StardewSymphonyRemastered.Framework
return "";
}
public virtual void setModDirectoryFromFullDirectory()
{
}
}
}

View File

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace StardewSymphonyRemastered.Framework
{
/// <summary>
/// The class to be used to manage individual songs.
/// </summary>
public class Song
{
/// <summary>
/// The path to the song. In the case of XACT songs this points to the .xwb file. For WAV files this points directly to the WAV file itself.
/// </summary>
public string pathToSong;
/// <summary>
/// The name of the song itself.
/// </summary>
public string name;
/// <summary>
/// Blank Constructor;
/// </summary>
public Song()
{
}
/// <summary>
/// Constructor to be used for WAV files.
/// </summary>
/// <param name="PathToSong"></param>
public Song(string PathToSong)
{
this.pathToSong=PathToSong;
this.name = getNameFromPath(this.pathToSong);
}
/// <summary>
/// Constructor to be used for XACT music packs.
/// </summary>
/// <param name="PathToSong"></param>
/// <param name="Name"></param>
public Song(string PathToSong,string Name)
{
this.pathToSong = PathToSong;
this.name = Name;
}
/// <summary>
/// Parse the name of the file from the path provided.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string getNameFromPath(string path)
{
return Path.GetFileNameWithoutExtension(path);
}
/// <summary>
/// Read the info from a .json file.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static Song ReadFromJson(string path)
{
return StardewSymphony.ModHelper.ReadJsonFile<Song>(path);
}
/// <summary>
/// Write the information of the instance to a .json file.
/// </summary>
/// <param name="path">The path to which the json file is written to.</param>
public void writeToJson(string path)
{
StardewSymphony.ModHelper.WriteJsonFile<Song>(path, this);
}
}
}

View File

@ -14,13 +14,13 @@ namespace StardewSymphonyRemastered.Framework
/// </summary>
public class SongSpecifics
{
Dictionary<string, List<string>> listOfSongsWithTriggers; //triggerName, <songs>
Dictionary<string, List<Song>> listOfSongsWithTriggers; //triggerName, <songs>
Dictionary<string, List<string>> eventSongs;
Dictionary<string, List<Song>> eventSongs;
Dictionary<string, List<string>> festivalSongs;
Dictionary<string, List<Song>> festivalSongs;
public List<string> listOfSongsWithoutTriggers;
public List<Song> listOfSongsWithoutTriggers;
public static List<string> locations = new List<string>();
public static List<string> festivals = new List<string>();
@ -71,11 +71,11 @@ namespace StardewSymphonyRemastered.Framework
"night"
};
listOfSongsWithTriggers = new Dictionary<string, List<string>>();
eventSongs = new Dictionary<string, List<string>>();
festivalSongs = new Dictionary<string, List<string>>();
listOfSongsWithTriggers = new Dictionary<string, List<Song>>();
eventSongs = new Dictionary<string, List<Song>>();
festivalSongs = new Dictionary<string, List<Song>>();
this.listOfSongsWithoutTriggers = new List<string>();
this.listOfSongsWithoutTriggers = new List<Song>();
this.addSongLists();
@ -263,9 +263,9 @@ namespace StardewSymphonyRemastered.Framework
/// Adds the song's reference to a music pack.
/// </summary>
/// <param name="songName"></param>
public void addSongToMusicPack(string songName)
public void addSongToMusicPack(Song song)
{
this.listOfSongsWithoutTriggers.Add(songName);
this.listOfSongsWithoutTriggers.Add(song);
}
/// <summary>
@ -275,7 +275,8 @@ namespace StardewSymphonyRemastered.Framework
/// <returns></returns>
public bool isSongInList(string songName)
{
return listOfSongsWithoutTriggers.Contains(songName);
Song s = getSongFromList(listOfSongsWithoutTriggers, songName);
return listOfSongsWithoutTriggers.Contains(s);
}
/// <summary>
@ -287,16 +288,16 @@ namespace StardewSymphonyRemastered.Framework
{
foreach (var season in seasons)
{
listOfSongsWithTriggers.Add(loc + seperator + season, new List<string>());
listOfSongsWithTriggers.Add(loc + seperator + season, new List<Song>());
foreach(var Weather in weather)
{
listOfSongsWithTriggers.Add(loc + seperator + season + seperator + Weather, new List<string>());
listOfSongsWithTriggers.Add(loc + seperator + season + seperator + Weather, new List<Song>());
foreach(var day in daysOfWeek)
{
listOfSongsWithTriggers.Add(loc + seperator + season + seperator + Weather + seperator + day, new List<string>());
listOfSongsWithTriggers.Add(loc + seperator + season + seperator + Weather + seperator + day, new List<Song>());
foreach(var time in timesOfDay)
{
listOfSongsWithTriggers.Add(loc + seperator + season + seperator + Weather + seperator + day + seperator + time, new List<string>());
listOfSongsWithTriggers.Add(loc + seperator + season + seperator + Weather + seperator + day + seperator + time, new List<Song>());
}
}
}
@ -306,16 +307,16 @@ namespace StardewSymphonyRemastered.Framework
//Add in some default seasonal music because maybe a location doesn't have some music?
foreach (var season in seasons)
{
listOfSongsWithTriggers.Add(season, new List<string>());
listOfSongsWithTriggers.Add(season, new List<Song>());
foreach (var Weather in weather)
{
listOfSongsWithTriggers.Add( season + seperator + Weather, new List<string>());
listOfSongsWithTriggers.Add( season + seperator + Weather, new List<Song>());
foreach (var day in daysOfWeek)
{
listOfSongsWithTriggers.Add(season + seperator + Weather + seperator + day, new List<string>());
listOfSongsWithTriggers.Add(season + seperator + Weather + seperator + day, new List<Song>());
foreach (var time in timesOfDay)
{
listOfSongsWithTriggers.Add(season + seperator + Weather + seperator + day + seperator + time, new List<string>());
listOfSongsWithTriggers.Add(season + seperator + Weather + seperator + day + seperator + time, new List<Song>());
}
}
}
@ -328,40 +329,41 @@ namespace StardewSymphonyRemastered.Framework
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public KeyValuePair<string,List<string>>getSongList(string key)
public KeyValuePair<string,List<Song>>getSongList(string key)
{
string keyPhrase = key.Split(seperator).ElementAt(0);
if (keyPhrase == "event")
{
/*
foreach (KeyValuePair<string, List<string>> pair in eventSongs)
foreach (KeyValuePair<string, List<Song>> pair in eventSongs)
{
if (pair.Key == key) return pair;
}
*/
return new KeyValuePair<string, List<string>>(key, eventSongs[key]);
//return new KeyValuePair<string, List<Song>>(key, eventSongs[key]);
}
else if (keyPhrase == "festival")
{
/*
foreach (KeyValuePair<string, List<string>> pair in festivalSongs)
foreach (KeyValuePair<string, List<Song>> pair in festivalSongs)
{
if (pair.Key == key) return pair;
}
*/
return new KeyValuePair<string, List<string>>(key, festivalSongs[key]);
//return new KeyValuePair<string, List<string>>(key, festivalSongs[key]);
}
else
{
/*
foreach(KeyValuePair<string,List<string>> pair in listOfSongsWithTriggers)
foreach(KeyValuePair<string,List<Song>> pair in listOfSongsWithTriggers)
{
if (pair.Key == key) return pair;
}
*/
return new KeyValuePair<string, List<string>>(key, listOfSongsWithTriggers[key]);
//return new KeyValuePair<string, List<string>>(key, listOfSongsWithTriggers[key]);
}
return new KeyValuePair<string, List<Song>>("",null);
}
/// <summary>
@ -371,9 +373,9 @@ namespace StardewSymphonyRemastered.Framework
/// <param name="songName"></param>
public void addSongToList(string songListKey,string songName)
{
var songList = getSongList(songListKey);
songList.Value.Add(songName);
var songKeyPair = getSongList(songListKey);
var song = getSongFromList(songKeyPair.Value, songName);
songKeyPair.Value.Add(song);
}
/// <summary>
@ -383,8 +385,24 @@ namespace StardewSymphonyRemastered.Framework
/// <param name="songName"></param>
public void removeSongFromList(string songListKey,string songName)
{
var songList = getSongList(songListKey);
songList.Value.Remove(songName);
var songKeyPair = getSongList(songListKey);
var song = getSongFromList(songKeyPair.Value, songName);
songKeyPair.Value.Remove(song);
}
/// <summary>
/// Get the Song instance that is referenced with the song's name.
/// </summary>
/// <param name="songList"></param>
/// <param name="songName"></param>
/// <returns></returns>
public Song getSongFromList(List<Song> songList,string songName)
{
foreach(var song in songList)
{
if (song.name == songName) return song;
}
return null;
}
#endregion
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -11,5 +12,97 @@ namespace StardewSymphonyRemastered.Framework
/// </summary>
public class WavMusicPack : MusicPack
{
public Song currentSong;
public string songsDirectory;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="directoryToMusicPack"></param>
public WavMusicPack(string directoryToMusicPack)
{
this.directory = directoryToMusicPack;
this.setModDirectoryFromFullDirectory();
this.songsDirectory = Path.Combine(this.directory, "Songs");
this.songInformation = new SongSpecifics();
this.musicPackInformation = MusicPackMetaData.readFromJson(Path.Combine(directoryToMusicPack, "MusicPackInformation.json"));
if (this.musicPackInformation == null)
{
StardewSymphony.ModMonitor.Log("Error: MusicPackInformation.json not found at: " + directoryToMusicPack + ". Blank information will be put in place.", StardewModdingAPI.LogLevel.Warn);
this.musicPackInformation = new MusicPackMetaData("???", "???", "", "0.0.0");
}
this.loadMusicFiles();
}
/// <summary>
/// A shortened directory name for display purposes.
/// </summary>
/// <returns></returns>
public override void setModDirectoryFromFullDirectory()
{
string[] spliter = this.directory.Split(Path.DirectorySeparatorChar);
string directoryLocation = "";
for (int i = spliter.Length - 6; i < spliter.Length; i++)
{
directoryLocation += spliter[i];
if (i != spliter.Length - 1)
{
directoryLocation += Path.DirectorySeparatorChar;
}
}
this.shortenedDirectory = directoryLocation;
}
/// <summary>
/// Returns the name of the currently playing song.
/// </summary>
/// <returns></returns>
public override string getNameOfCurrentSong()
{
return this.currentSong.name;
}
/// <summary>
/// Load in the music files from the pack's respective Directory/Songs folder. Typically Content/Music/Wav/FolderName/Songs
/// </summary>
public override void loadMusicFiles()
{
string[] wavFiles = Directory.GetFiles(this.songsDirectory, "*.wav");
List<Song> listOfSongs = new List<Song>();
foreach(var wav in wavFiles)
{
Song song = new Song(wav);
listOfSongs.Add(song);
}
this.songInformation.listOfSongsWithoutTriggers = listOfSongs;
}
public override void pauseSong()
{
throw new NotImplementedException();
}
public override void playSong(string name)
{
throw new NotImplementedException();
}
public override void resumeSong()
{
throw new NotImplementedException();
}
public override void stopSong()
{
throw new NotImplementedException();
}
public override void swapSong(string songName)
{
throw new NotImplementedException();
}
}
}

View File

@ -34,6 +34,7 @@ namespace StardewSymphonyRemastered.Framework
this.directory = directoryToXwb;
this.WaveBankPath = pathToWaveBank;
this.SoundBankPath = pathToSoundBank;
this.setModDirectoryFromFullDirectory();
this.songInformation = new SongSpecifics();
this.currentCue = null;
this.musicPackInformation = MusicPackMetaData.readFromJson(Path.Combine(directoryToXwb, "MusicPackInformation.json"));
@ -53,7 +54,21 @@ namespace StardewSymphonyRemastered.Framework
/// </summary>
public override void loadMusicFiles()
{
this.songInformation.listOfSongsWithoutTriggers=StardewSymphonyRemastered.Framework.MusicHexProcessor.ProcessSongNamesFromHex(this,StardewSymphony.Reset,this.SoundBankPath);
var listOfSongStrings = StardewSymphonyRemastered.Framework.MusicHexProcessor.ProcessSongNamesFromHex(this, StardewSymphony.Reset, this.SoundBankPath);
List<Song> listofSongs = new List<Song>();
foreach(var songname in listOfSongStrings)
{
Song song = new Song(this.WaveBankPath, songname);
listofSongs.Add(song);
}
this.songInformation.listOfSongsWithoutTriggers = listofSongs;
}
/// <summary>
@ -158,5 +173,25 @@ namespace StardewSymphonyRemastered.Framework
return this.currentCue.Name;
}
/// <summary>
/// Returns a shortened directory name for display purposes.
/// </summary>
/// <returns></returns>
public override void setModDirectoryFromFullDirectory()
{
string[] spliter = this.WaveBankPath.Split(Path.DirectorySeparatorChar);
string directoryLocation="";
for (int i = spliter.Length - 5; i < spliter.Length; i++)
{
directoryLocation += spliter[i];
if (i != spliter.Length - 1)
{
directoryLocation += Path.DirectorySeparatorChar;
}
}
this.shortenedDirectory = directoryLocation;
}
}
}

View File

@ -63,13 +63,12 @@ namespace StardewSymphonyRemastered
this.createDirectories();
this.createBlankXACTTemplate();
this.createBlankWAVTemplate();
musicPacksInitialized = false;
}
private void GameEvents_UpdateTick(object sender, EventArgs e)
{
if (Game1.activeClickableMenu.GetType()!=typeof(StardewValley.Menus.TitleMenu)&& Game1.audioEngine.isNull()) return;
if (musicPacksInitialized == false)
{
initializeMusicPacks();
@ -81,6 +80,7 @@ namespace StardewSymphonyRemastered
{
//load in all packs here.
loadXACTMusicPacks();
loadWAVMusicPacks();
}
public void createDirectories()
@ -90,6 +90,7 @@ namespace StardewSymphonyRemastered
if (!Directory.Exists(XACTMusicDirectory)) Directory.CreateDirectory(XACTMusicDirectory);
if (!Directory.Exists(TemplateMusicDirectory)) Directory.CreateDirectory(TemplateMusicDirectory);
}
public void createBlankXACTTemplate()
{
string path= Path.Combine(TemplateMusicDirectory, "XACT");
@ -103,11 +104,35 @@ namespace StardewSymphonyRemastered
}
if (!File.Exists(Path.Combine(path, "readme.txt")))
{
string info = "Place the Wave Bank.xwb file and Sound Bank.xsb file you created in XACT in a similar directory in Content/Music/XACT/SoundPackName with a new meta data to load it!";
string info = "Place the Wave Bank.xwb file and Sound Bank.xsb file you created in XACT in a similar directory in Content/Music/XACT/SoundPackName.\nModify MusicPackInformation.json as desire!\nRun the mod!";
File.WriteAllText(Path.Combine(path, "readme.txt"),info);
}
}
public void createBlankWAVTemplate()
{
string path = Path.Combine(TemplateMusicDirectory, "WAV");
string pathSongs = Path.Combine(path, "Songs");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (!Directory.Exists(pathSongs))
{
Directory.CreateDirectory(pathSongs);
}
if (!File.Exists(Path.Combine(path, "MusicPackInformation.json")))
{
MusicPackMetaData blankMetaData = new MusicPackMetaData("Omegas's Music Data Example", "Omegasis", "Just a simple example of how metadata is formated for music packs. Feel free to copy and edit this one!", "1.0.0 CoolExample");
blankMetaData.writeToJson(Path.Combine(path, "MusicPackInformation.json"));
}
if (!File.Exists(Path.Combine(path, "readme.txt")))
{
string info = "Place the .wav song files in the Songs folder, modify the MusicPackInformation.json as desired, and then run!";
File.WriteAllText(Path.Combine(path, "readme.txt"), info);
}
}
public static void loadXACTMusicPacks()
{
@ -155,6 +180,23 @@ namespace StardewSymphonyRemastered
}
public static void loadWAVMusicPacks()
{
string[] listOfDirectories = Directory.GetDirectories(WavMusicDirectory);
foreach (string folder in listOfDirectories)
{
string metaData = Path.Combine(folder, "MusicPackInformation.json");
if (!File.Exists(metaData))
{
ModMonitor.Log("WARNING! Loading in a music pack from: " + folder + ". There is no MusicPackInformation.json associated with this music pack meaning that while songs can be played from this pack, no information about it will be displayed.", LogLevel.Error);
}
StardewSymphonyRemastered.Framework.WavMusicPack musicPack = new WavMusicPack(folder);
musicManager.addMusicPack(musicPack,true,true);
}
}
/// <summary>
/// Raised when the player changes locations. This should determine the next song to play.
/// </summary>
@ -175,9 +217,6 @@ namespace StardewSymphonyRemastered
StardewSymphonyRemastered.Framework.SongSpecifics.addLocations();
StardewSymphonyRemastered.Framework.SongSpecifics.addFestivals();
StardewSymphonyRemastered.Framework.SongSpecifics.addEvents();
}

View File

@ -43,6 +43,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Framework\MusicPackMetaData.cs" />
<Compile Include="Framework\Song.cs" />
<Compile Include="StaticExtentions.cs" />
<Compile Include="StardewSymphony.cs" />
<Compile Include="Framework\MusicHexProcessor.cs" />