using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine; using System; using Newtonsoft.Json.Linq; using System.Collections; public class UmaViewerMain : MonoBehaviour { public static UmaViewerMain Instance; private UmaViewerUI UI => UmaViewerUI.Instance; private UmaViewerBuilder Builder => UmaViewerBuilder.Instance; public List Characters = new List(); public List MobCharacters = new List(); public List Lives = new List(); public List Costumes = new List(); public Dictionary AbList = new Dictionary(); public List AbMotions = new List(); public List AbSounds = new List(); public List AbChara = new List(); public List AbEffect = new List(); public List CostumeList = new List(); private void Awake() { Instance = this; new Config(); Application.targetFrameRate = 120; AbList = UmaDatabaseController.Instance.MetaEntries; AbChara = AbList.Where(ab => ab.Key.StartsWith(UmaDatabaseController.CharaPath)).Select(ab=>ab.Value).ToList(); AbMotions = AbList.Where(ab => ab.Key.StartsWith(UmaDatabaseController.MotionPath)).Select(ab => ab.Value).ToList(); AbEffect = AbList.Where(ab => ab.Key.StartsWith(UmaDatabaseController.EffectPath)).Select(ab => ab.Value).ToList(); AbSounds = AbList.Where(ab => ab.Key.EndsWith(".awb") || ab.Key.EndsWith(".acb")).Select(ab => ab.Value).ToList(); CostumeList = AbList.Where(ab => ab.Key.StartsWith(UmaDatabaseController.CostumePath)).Select(ab => ab.Value).ToList(); } private IEnumerator Start() { Dictionary enNames = new Dictionary(); Dictionary mobNames = new Dictionary(); var loadingUI = UmaSceneController.instance; //Main chara names (En only) if (Config.Instance.Language == Language.En) { loadingUI.LoadingProgressChange(0, 11, "Downloading Character Data"); yield return null; yield return UmaViewerDownload.DownloadText("https://www.tracenacademy.com/api/BasicCharaDataInfo", txt => { if (string.IsNullOrEmpty(txt)) return; foreach (var item in JArray.Parse(txt)) { if (!enNames.ContainsKey((int)item["charaId"])) { enNames.Add((int)item["charaId"], item["charaNameEnglish"].ToString()); } } }); } //Mob names (EN & JP) loadingUI.LoadingProgressChange(1, 11, "Downloading Mob Data"); yield return null; yield return UmaViewerDownload.DownloadText("https://www.tracenacademy.com/api/BasicMobDataInfo", txt => { if (string.IsNullOrEmpty(txt)) return; foreach (var item in JArray.Parse(txt)) { if (!mobNames.ContainsKey((int)item["mobId"])) { mobNames.Add((int)item["mobId"], Config.Instance.Language == Language.Jp ? item["mobName"].ToString() : item["mobNameEnglish"].ToString()); } } }); var UmaCharaData = UmaDatabaseController.Instance.CharaData; loadingUI.LoadingProgressChange(2, 11, "Loading Character Data"); yield return null; foreach (var item in UmaCharaData) { var id = Convert.ToInt32(item["id"]); if (!Characters.Where(c => c.Id == id).Any()) { Characters.Add(new CharaEntry() { Name = item["charaname"].ToString(), EnName = enNames.ContainsKey(id) ? enNames[id] : "", Icon = UmaViewerBuilder.Instance.LoadCharaIcon(id.ToString()), Id = id, ThemeColor = "#" + item["ui_nameplate_color_1"].ToString() }); } } var MobCharaData = UmaDatabaseController.Instance.MobCharaData; loadingUI.LoadingProgressChange(3, 11, "Loading Mob Data"); yield return null; foreach (var item in MobCharaData) { if (Convert.ToInt32(item["use_live"]) == 0) { continue; } var id = Convert.ToInt32(item["mob_id"]); var name = mobNames.ContainsKey(id) ? mobNames[id] : ""; MobCharacters.Add(new CharaEntry() { Name = string.IsNullOrEmpty(name)? $"Mob_{id}" : name, Icon = UmaViewerBuilder.Instance.LoadMobCharaIcon(id.ToString()), Id = id, IsMob = true }); } loadingUI.LoadingProgressChange(4, 11, "Loading Costumes Data"); yield return null; foreach (var item in CostumeList) { var costume = new CostumeEntry(); var name = Path.GetFileName(item.Name); costume.Id = name.Replace("dress_",""); costume.Icon = Builder.LoadSprite(item); Costumes.Add(costume); } var DressData = UmaDatabaseController.Instance.DressData; foreach (var data in DressData) { var costume = Costumes.FirstOrDefault(a => a.Id.Split('_')[0].Contains(data["id"].ToString()) ); if (costume != null) { costume.CharaId = Convert.ToInt32(data["chara_id"]); costume.DressName = data["dressname"].ToString(); costume.BodyType = Convert.ToInt32(data["body_type"]); costume.BodyTypeSub = Convert.ToInt32(data["body_type_sub"]); } } loadingUI.LoadingProgressChange(5, 11, "Loading Live Data"); yield return null; var asset = AbList["livesettings"]; if (asset != null) { string filePath = asset.FilePath; if (File.Exists(filePath)) { AssetBundle bundle = UmaAssetManager.LoadAssetBundle(asset, true); foreach (var item in UmaDatabaseController.Instance.LiveData) { var musicId = Convert.ToInt32(item["music_id"]); var songName = item["songname"].ToString(); var membercount = Convert.ToInt32(item["live_member_number"]); var defaultdress = Convert.ToInt32(item["default_main_dress"]); if (!Lives.Where(c => c.MusicId == musicId).Any()) { if (bundle.Contains(musicId.ToString())) { TextAsset liveData = bundle.LoadAsset(musicId.ToString()); Lives.Add(new LiveEntry(liveData.text) { MusicId = musicId, SongName = songName, MemberCount = membercount, DefaultDress = defaultdress, Icon = UmaViewerBuilder.Instance.LoadLiveIcon(musicId) }); } } } } } loadingUI.LoadingProgressChange(6, 11, "Loading UI"); yield return null; UI.LoadModelPanels(); loadingUI.LoadingProgressChange(7, 11, "Loading UI"); yield return null; UI.LoadMiniModelPanels(); loadingUI.LoadingProgressChange(8, 11, "Loading UI"); yield return null; UI.LoadPropPanel(); loadingUI.LoadingProgressChange(9, 11, "Loading UI"); yield return null; UI.LoadMapPanel(); loadingUI.LoadingProgressChange(10, 11, "Loading UI"); yield return null; UI.LoadLivePanels(); loadingUI.LoadingProgressChange(-1, -1); UmaAssetManager.LoadAssetBundle(AbList["shader"], true); //Load Shader First } public void OpenUrl(string url) { Application.OpenURL(url); } }