123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- 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();
- }
- }
- }
|