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/";
/// 3d/effect/
public static string EffectPath = "3d/effect/";
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
{
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: {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 * FROM chara_data C,(SELECT D.'index' charaid,D.'text' charaname FROM text_data D WHERE id like 6) T WHERE C.id like T.charaid";
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;
}
}
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";
}
}