浏览代码

Merge remote-tracking branch 'remotes/godric3/customBattleMusic' into develop

AlexVinS 8 年之前
父节点
当前提交
9cf3f4fe93
共有 1 个文件被更改,包括 27 次插入10 次删除
  1. 27 10
      client/CMusicHandler.cpp

+ 27 - 10
client/CMusicHandler.cpp

@@ -20,6 +20,7 @@
 #include "../lib/filesystem/Filesystem.h"
 #include "../lib/StringConstants.h"
 #include "../lib/CRandomGenerator.h"
+#include "../lib/VCMIDirs.h"
 
 #define VCMI_SOUND_NAME(x)
 #define VCMI_SOUND_FILE(y) #y,
@@ -252,18 +253,34 @@ CMusicHandler::CMusicHandler():
 	listener(settings.listen["general"]["music"])
 {
 	listener(std::bind(&CMusicHandler::onVolumeChange, this, _1));
-	// Map music IDs
-	// Vectors for helper
-	const std::string setEnemy[] = {"AITheme0", "AITheme1", "AITheme2"};
-	const std::string setBattle[] = {"Combat01", "Combat02", "Combat03", "Combat04"};
 
-	auto fillSet = [=](std::string setName, const std::string list[], size_t amount)
+	auto mp3Folders = CResourceHandler::get()->getFilteredFiles([](const ResourceID & id) ->  bool
 	{
-		for (size_t i=0; i < amount; i++)
-			addEntryToSet(setName, i, "music/" + list[i]);
-	};
-	fillSet("enemy-turn", setEnemy, ARRAY_COUNT(setEnemy));
-	fillSet("battle", setBattle, ARRAY_COUNT(setBattle));
+		if (id.getType() != EResType::DIRECTORY)
+			return false;
+		if (!(boost::algorithm::iends_with(id.getName(), "mp3")))
+			return false;
+		return true;
+	});
+
+	boost::filesystem::path userDataPath = VCMIDirs::get().userDataPath();
+	int battleMusicID = 0;
+	int AIThemeID = 0;
+	for (ResourceID folder : mp3Folders)
+	{
+		const boost::filesystem::directory_iterator enddir;
+		for (boost::filesystem::directory_iterator dir(userDataPath / folder.getName()); dir != enddir; ++dir)
+		{
+			if (is_regular(dir->status()))
+			{
+				std::string name = dir->path().filename().string();
+				if (boost::algorithm::istarts_with(name, "Combat"))
+					addEntryToSet("battle", battleMusicID++, "Music/" + name);
+				else if (boost::algorithm::istarts_with(name, "AITheme"))
+					addEntryToSet("enemy-turn", AIThemeID++, "Music/" + name);
+			}
+		}
+	}
 
 	JsonNode terrains(ResourceID("config/terrains.json"));
 	for (auto entry : terrains.Struct())