using RTGLite; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using UnityEngine; namespace EnglewoodLAB.UI { public class OptionManager : MonoBehaviour, ISingle { [DllImport("kernel32", CharSet = CharSet.Unicode)] static extern long WritePrivateProfileString(string Section, string Key, string Value, string FilePath); [DllImport("kernel32", CharSet = CharSet.Unicode)] static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath); private string filePath; public Dictionary optionBases = new(); public Action onCompletedLoadOption; public void LoadOption() { #if UNITY_EDITOR filePath = "./Option.ini"; #else filePath = "./Option.ini"; #endif var allBehaviours = Core.singleTable.Values; var optionables = allBehaviours.Where(mo=>mo is IOptionable).ToList(); var defaultOptionBases = optionables.Select(mo => new OptionBase(mo)).ToList(); if (!File.Exists(filePath)) { //Create StringBuilder sb = new StringBuilder(); using (var fs = File.Create(filePath)) { foreach (var optionBase in defaultOptionBases) { var section = optionBase.section; sb.AppendLine($"[{section}]"); foreach (var option in optionBase.options) { sb.AppendLine($"{option.Key}={option.Value}"); } sb.AppendLine(); } var bytes = Encoding.UTF8.GetBytes(sb.ToString()); fs.Write(bytes, 0, bytes.Length); fs.Flush(); } } foreach (var defaultOption in defaultOptionBases) { var section = defaultOption.section; Dictionary temp = new Dictionary(); foreach (var option in defaultOption.options) { var key = option.Key; var newValue = StringDataReadIni(filePath, section, key); if (newValue == "") { WritePrivateProfileString(section, key, option.Value, filePath); newValue = option.Value; } temp.Add(key, newValue); } defaultOption.options = temp; defaultOption.SetValue(defaultOption.target); optionBases.Add(defaultOption.target, defaultOption); } onCompletedLoadOption?.Invoke(); } public string StringDataReadIni(string filePath, string section, string key) { StringBuilder buffer = new StringBuilder(1024); GetPrivateProfileString(section, key, "", buffer, 1024, filePath); return buffer.ToString(); } public Dictionary GetOption(MonoBehaviour mb) { var defaultOption = optionBases[mb]; return defaultOption.options; } public void SetOptionValue(MonoBehaviour mb, Dictionary optionData) { Dictionary temp = new Dictionary(); var defaultOption = optionBases[mb]; var section = defaultOption.section; temp.Clear(); foreach(var key in defaultOption.options.Keys) { temp.Add(key, defaultOption.options[key]); } foreach (var option in optionData) { var key = option.Key; if (temp.ContainsKey(key)) { WritePrivateProfileString(section, key, optionData[key], filePath); temp[key] = optionData[key]; } } defaultOption.options = temp; defaultOption.SetValue(defaultOption.target); } } }