|
@@ -0,0 +1,164 @@
|
|
|
+using SimpleJSON;
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+
|
|
|
+namespace COM3D2.MultipleMaids.Util
|
|
|
+{
|
|
|
+ internal static class MMData
|
|
|
+ {
|
|
|
+ private const string CM_EXTENSIONS_DB = "cm3d2_extensions.json";
|
|
|
+ private const string UI_NAMES_DB = "ui_names.json";
|
|
|
+ private const string BGM_DB = "bgm.json";
|
|
|
+ private const string VOICES_DB = "personal_voices.json";
|
|
|
+
|
|
|
+ public static Dictionary<string, string> Dances { get; private set; }
|
|
|
+ public static Dictionary<string, string> Dogus { get; private set; }
|
|
|
+ public static Dictionary<string, string> Particles { get; private set; }
|
|
|
+ public static Dictionary<string, string> Items { get; private set; }
|
|
|
+ public static Dictionary<string, string> Backgrounds { get; private set; }
|
|
|
+ public static Dictionary<string, IVoice[]> NormalVoices { get; private set; }
|
|
|
+ public static Dictionary<string, IVoice[]> HVoices { get; private set; }
|
|
|
+
|
|
|
+ private static readonly Random rand = new Random();
|
|
|
+
|
|
|
+ static MMData()
|
|
|
+ {
|
|
|
+ Dances = new Dictionary<string, string>();
|
|
|
+ Dogus = new Dictionary<string, string>();
|
|
|
+ Particles = new Dictionary<string, string>();
|
|
|
+ Items = new Dictionary<string, string>();
|
|
|
+ Backgrounds = new Dictionary<string, string>();
|
|
|
+ NormalVoices = new Dictionary<string, IVoice[]>();
|
|
|
+ HVoices = new Dictionary<string, IVoice[]>();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void ParseUINames(string location)
|
|
|
+ {
|
|
|
+ string uiNames = Path.Combine(location, UI_NAMES_DB);
|
|
|
+
|
|
|
+ if (File.Exists(uiNames))
|
|
|
+ {
|
|
|
+ JSONNode uiNamesJson = JSON.Parse(File.ReadAllText(uiNames));
|
|
|
+
|
|
|
+ Dogus = ParseObj(uiNamesJson, "dogu");
|
|
|
+ Particles = ParseObj(uiNamesJson, "particles");
|
|
|
+ Items = ParseObj(uiNamesJson, "items");
|
|
|
+ Backgrounds = ParseObj(uiNamesJson, "bg");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void ParseExtensions(string location)
|
|
|
+ {
|
|
|
+ string extensionsPath = Path.Combine(location, CM_EXTENSIONS_DB);
|
|
|
+
|
|
|
+ if (File.Exists(extensionsPath))
|
|
|
+ {
|
|
|
+ JSONNode extensionsJson = JSON.Parse(File.ReadAllText(extensionsPath));
|
|
|
+
|
|
|
+ foreach (string key in extensionsJson.Keys)
|
|
|
+ {
|
|
|
+ if ((key != "CM3D2_Legacy" || !GameUty.IsEnabledCompatibilityMode) && GameMain.Instance.BgMgr.CreateAssetBundle(key) == null)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Dogus.Merge(ParseObj(extensionsJson, "dogu"));
|
|
|
+ Items.Merge(ParseObj(extensionsJson, "item"));
|
|
|
+ Backgrounds.Merge(ParseObj(extensionsJson, "bg"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void ParseBGM(string location)
|
|
|
+ {
|
|
|
+ string bgmPath = Path.Combine(location, BGM_DB);
|
|
|
+
|
|
|
+ if (File.Exists(bgmPath))
|
|
|
+ {
|
|
|
+ JSONNode bgmJson = JSON.Parse(File.ReadAllText(bgmPath));
|
|
|
+ Backgrounds = bgmJson.Linq.ToDictionary(k => k.Key, k => k.Value.ToString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void ParseVoices(string location)
|
|
|
+ {
|
|
|
+ void Parse(Dictionary<string, IVoice[]> target, JSONNode node, string type)
|
|
|
+ {
|
|
|
+ JSONNode normalVoices = node[type];
|
|
|
+ if (!normalVoices)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (string key in normalVoices.Keys)
|
|
|
+ {
|
|
|
+ JSONArray obj = normalVoices[key].AsArray;
|
|
|
+ IVoice[] voices = new IVoice[obj.Count];
|
|
|
+
|
|
|
+ for (int i = 0; i < voices.Length; i++)
|
|
|
+ {
|
|
|
+ JSONNode voiceObj = obj[i];
|
|
|
+ if (voiceObj.IsNumber)
|
|
|
+ {
|
|
|
+ voices[i] = new SingleVoice(voiceObj.AsInt);
|
|
|
+ }
|
|
|
+ else if (voiceObj.IsArray && voiceObj.Count == 2)
|
|
|
+ {
|
|
|
+ voices[i] = new VoiceRange(voiceObj[0].AsInt, voiceObj[1].AsInt);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ target[key] = voices;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ string personalVoicesPath = Path.Combine(location, VOICES_DB);
|
|
|
+
|
|
|
+ if (File.Exists(VOICES_DB))
|
|
|
+ {
|
|
|
+ JSONNode voicesJson = JSON.Parse(File.ReadAllText(personalVoicesPath));
|
|
|
+
|
|
|
+ Parse(NormalVoices, voicesJson, "normal");
|
|
|
+ Parse(HVoices, voicesJson, "h");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void LoadDatabase(string location)
|
|
|
+ {
|
|
|
+ ParseUINames(location);
|
|
|
+ ParseExtensions(location);
|
|
|
+ ParseVoices(location);
|
|
|
+ ParseBGM(location);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void Merge<TKey, TVal>(this Dictionary<TKey, TVal> self, Dictionary<TKey, TVal> with)
|
|
|
+ {
|
|
|
+ if (with.Count == 0)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (KeyValuePair<TKey, TVal> keyVal in with)
|
|
|
+ {
|
|
|
+ self[keyVal.Key] = keyVal.Value;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Dictionary<string, string> ParseObj(JSONNode obj, string key)
|
|
|
+ {
|
|
|
+ return !obj[key] ? new Dictionary<string, string>() : obj[key].Linq.ToDictionary(k => k.Key, k => k.Value.ToString());
|
|
|
+ }
|
|
|
+
|
|
|
+ public static int PickRandomVoice(Dictionary<string, IVoice[]> voiceStorage, string personality)
|
|
|
+ {
|
|
|
+ if (!voiceStorage.TryGetValue(personality, out IVoice[] voices))
|
|
|
+ {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return voices[rand.Next(voices.Length)].PickRandomVoice();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|