using UnityEngine; using System; using System.Collections.Generic; using Mono.Data.Sqlite; using System.Data; public class UmaDatabaseController { private static UmaDatabaseController instance; /// /// Database Loader instance /// public static UmaDatabaseController Instance { get { if (instance == null) { instance = new UmaDatabaseController(); } return instance; } } /// /// https://prd-storage-umamusume.akamaized.net/dl/resources/ /// public static string ServerUrl = "https://prd-storage-umamusume.akamaized.net/dl/resources/"; /// Android/assetbundles/ public static string AssetUrl = "Windows/assetbundles/"; /// 3d/chara/body/ public static string BodyPath = "3d/chara/body/"; /// 3d/chara/head/ public static string HeadPath = "3d/chara/head/"; /// 3d/motion/ public static string MotionPath = "3d/motion/"; /// 3d/chara/ public static string CharaPath = "3d/chara/"; public IEnumerable MetaEntries; public IEnumerable CharaData; public IEnumerable FaceTypeData; public IEnumerable LiveData; /// Meta Database Connection private SqliteConnection metaDb; /// Master Database Connection private SqliteConnection masterDb; /// Loads the file database public UmaDatabaseController() { try { if (Application.platform == RuntimePlatform.Android) { metaDb = new SqliteConnection($@"Data Source={GetGameRootPath()}/meta;"); masterDb = new SqliteConnection($@"Data Source={GetGameRootPath()}/master/master.mdb;"); } else { metaDb = new SqliteConnection($@"Data Source={Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low"}\Cygames\umamusume\meta;"); masterDb = new SqliteConnection($@"Data Source={Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low"}\Cygames\umamusume\master\master.mdb;"); } metaDb.Open(); MetaEntries = ReadMeta(metaDb); masterDb.Open(); CharaData = ReadMaster(masterDb); FaceTypeData = ReadFaceTypeData(masterDb); LiveData = ReadAllLiveData(masterDb); } catch { UmaViewerUI.Instance.LyricsText.text = $"Database not found: \n{GetGameRootPath()}/meta\n{GetGameRootPath()}/master/master.mdb"; UmaViewerUI.Instance.LyricsText.color = Color.red; } } static IEnumerable ReadMeta(SqliteConnection conn) { List entries = new List(); SqliteCommand sqlite_cmd = conn.CreateCommand(); sqlite_cmd.CommandText = "SELECT m,n,h,c,d FROM a"; SqliteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader(); while (sqlite_datareader.Read()) { try { UmaDatabaseEntry entry = new UmaDatabaseEntry() { Type = (UmaFileType)Enum.Parse(typeof(UmaFileType), sqlite_datareader["m"] as String), Name = sqlite_datareader["n"] as String, Url = sqlite_datareader["h"] as String, Checksum = sqlite_datareader["c"].ToString(), Prerequisites = sqlite_datareader["d"] as String }; entries.Add(entry); } catch(Exception e) { Debug.LogError("Error caught: " + e); } } return entries; } static IEnumerable ReadMaster(SqliteConnection conn) { SqliteCommand sqlite_cmd = conn.CreateCommand(); sqlite_cmd.CommandText = "SELECT id,tail_model_id FROM chara_data"; SqliteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader(); while (sqlite_datareader.Read()) { UmaCharaData entry = new UmaCharaData() { id = sqlite_datareader.GetInt32(0), tail_model_id = sqlite_datareader.GetInt32(1).ToString(), }; yield return entry; } } static IEnumerable ReadFaceTypeData(SqliteConnection conn) { SqliteCommand sqlite_cmd = conn.CreateCommand(); sqlite_cmd.CommandText = "SELECT * FROM face_type_data"; SqliteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader(); while (sqlite_datareader.Read()) { FaceTypeData entry = new FaceTypeData() { label = sqlite_datareader.GetString(0), eyebrow_l = sqlite_datareader.GetString(1), eyebrow_r = sqlite_datareader.GetString(2), eye_l = sqlite_datareader.GetString(3), eye_r = sqlite_datareader.GetString(4), mouth = sqlite_datareader.GetString(5), mouth_shape_type = sqlite_datareader.GetInt32(6), inverce_face_type = sqlite_datareader.GetString(7), set_face_group = sqlite_datareader.GetInt32(8), }; yield return entry; } } static IEnumerable ReadAllLiveData(SqliteConnection conn) { SqliteCommand sqlite_cmd = conn.CreateCommand(); sqlite_cmd.CommandText = $"SELECT * FROM live_data L,(SELECT D.'index' songid,D.'text' songname FROM text_data D WHERE id like 16) T WHERE L.music_id like T.songid"; SqliteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader(); var result = new DataTable(); result.Load(sqlite_datareader); var temp = result.Rows.GetEnumerator(); while (temp.MoveNext()) { yield return (DataRow)temp.Current; } } public static DataRow ReadCharaData(int id) { SqliteCommand sqlite_cmd = instance.masterDb.CreateCommand(); sqlite_cmd.CommandText = $"SELECT * FROM chara_data WHERE id LIKE {id}"; SqliteDataReader sqlite_datareader = sqlite_cmd.ExecuteReader(); var result = new DataTable(); result.Load(sqlite_datareader); DataRow row = result.Rows[0]; return row; } public static string GetABPath(UmaDatabaseEntry entry) { if (Application.platform == RuntimePlatform.Android) { return $"{GetGameRootPath()}/dat/{entry.Url.Substring(0, 2)}/{entry.Url}"; } return $"{GetGameRootPath()}\\dat\\{entry.Url.Substring(0, 2)}\\{entry.Url}"; } public static string GetGameRootPath() { if (Application.platform == RuntimePlatform.Android) { return Application.persistentDataPath; } return $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "Low"}\\Cygames\\umamusume"; } }