using System; using System.Collections.Generic; using System.Text.RegularExpressions; using Continentis.MainGame; using Continentis.MainGame.Card; using Continentis.MainGame.Character; using Continentis.MainGame.Equipment; using Continentis.MainGame.UI; using NaughtyAttributes; using SLSFramework.UModAssistance; using UMod; using UnityEngine; using UnityEngine.Serialization; namespace Continentis.Mods { [CreateAssetMenu(fileName = "ModManifest", menuName = "Continentis/Mod/Manifest", order = 1)] public partial class ModManifest : ScriptableObject { public string inEditorModFolder; public List keywordDataIDList = new List(); public List cardDataIDList = new List(); public List characterDataIDList = new List(); public List equipmentDataIDList = new List(); public List hudDataIDList = new List(); public List localizationFiles = new List(); public void SaveToDatabase(ModHost host) { SaveIDListToDatabase(host, keywordDataIDList); SaveIDListToDatabase(host, cardDataIDList); SaveIDListToDatabase(host, characterDataIDList); SaveIDListToDatabase(host, equipmentDataIDList); SaveIDListToDatabase(host, hudDataIDList); } private void SaveIDListToDatabase(ModHost host, List idList) where T : ScriptableObject { ModManager.Database.TryAdd(typeof(T), new Dictionary()); foreach (var assetName in idList) { T data = host.Assets.Load(assetName); if (!ModManager.Database[typeof(T)].TryAdd(assetName, data)) { Debug.LogWarning($"Asset '{assetName}' already exists in the database. Skipping addition."); } } } } #if UNITY_EDITOR public partial class ModManifest { [Button] private void CollectAllKeywordData() => keywordDataIDList = CollectData(); [Button] private void CollectAllCardData() => cardDataIDList = CollectData(); [Button] private void CollectAllCharacterData() => characterDataIDList = CollectData(); [Button] private void CollectAllEquipmentData() => equipmentDataIDList = CollectData(); [Button] private void CollectAllHUDData() => hudDataIDList = CollectData(); [Button] private void CollectAllLocalizations() => localizationFiles = CollectLocalizations(); } public partial class ModManifest { private List CollectData() where T : ScriptableObject { string inEditorModPath = "Assets/Mods/" + inEditorModFolder; string dataTypeName = typeof(T).Name; string[] guids = UnityEditor.AssetDatabase.FindAssets($"t:{dataTypeName}", new[] { inEditorModPath }); List collectedDataIDList = new List(); foreach (string guid in guids) { string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid); T data = UnityEditor.AssetDatabase.LoadAssetAtPath(path); string assetFileName = System.IO.Path.GetFileNameWithoutExtension(path); if (!Regex.IsMatch(assetFileName, @"^\w+_\w+_.+$")) { Debug.LogWarning("Asset name does not follow the 'Type_ModName_AssetName' format: " + assetFileName); } if (data != null) { collectedDataIDList.Add(assetFileName); } } Debug.Log($"Collected {collectedDataIDList.Count} CardData assets."); return collectedDataIDList; } private List CollectLocalizations() { string inEditorModPath = "Assets/Mods/" + inEditorModFolder; string dataTypeName = nameof(TextAsset); string[] guids = UnityEditor.AssetDatabase.FindAssets($"t:{dataTypeName}", new[] { inEditorModPath }); List collectedTextAssets = new List(); Debug.Log($"Found {guids.Length} TextAsset assets."); foreach (string guid in guids) { string path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid); string assetFileName = System.IO.Path.GetFileNameWithoutExtension(path); TextAsset data = UnityEditor.AssetDatabase.LoadAssetAtPath(path); if (assetFileName.Contains("Localization")) { collectedTextAssets.Add(data); Debug.Log($"Collected localization TextAsset: {assetFileName}"); } } Debug.Log($"Collected {collectedTextAssets.Count} localization TextAssets."); return collectedTextAssets; } } #endif }