// **************************************************************************************** // PresetPrepare Plugin by dynms1337 // Licensed under CC BY // **************************************************************************************** using System; using UnityEngine; using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using SimpleJSON; using System.Linq; using System.Globalization; using MacGruber; using UnityEngine.Events; using JetBrains.Annotations; namespace dynms1337 { [Serializable] public class CharacterProfile { public string name; public string appearancePath; // NEW: Store the original appearance path to preserve subdirectory info public Dictionary morphs = new Dictionary(); // k,v : name,value public float scale = 1f; public float weight = 0f; //public JSONClass skinJSON; // --- constructer --- protected CharacterProfile() { } public static CharacterProfile createAdditionalCharacter(CharacterFusioner plugin, string appearancePath) { var ret = new CharacterProfile(); ret.name = dUtil.path2filename(appearancePath); ret.appearancePath = appearancePath; // NEW: Store the full appearance path var json = dUtil.readFile(appearancePath); // morph foreach (var j in dUtil.parseVapArray(json, "morphs", appearancePath).Childs) ret.morphs[j["name"]] = j["value"].AsFloat; // rescaleObject ret.scale = dUtil.parseVapDictionary(json, "rescaleObject", appearancePath)["scale"].AsFloat; //var jc = plugin.save_presetCache("SkinPresets", appearancePath); // ret.skinJSON = jc; return ret; } public static CharacterProfile createBaseCharacter(CharacterFusioner plugin, string appearancePath = null) { var ret = new CharacterProfile(); if (appearancePath == null) // BaseCharacter from current value { var _morphs = new Dictionary(); plugin.getActiveMorphs().ForEach(m => _morphs[m.displayName] = m.morphValue); // create dictionary without displayName duplicate error. ret.name = "Base_CFusionerCache"; ret.appearancePath = dUtil.create_appearancePresetPath(ret.name); // NEW: Set the appearance path ret.morphs = _morphs; ret.scale = plugin.person.GetStorableByID("rescaleObject").GetFloatJSONParam("scale").val; plugin.saveCurrentPreset("AppearancePresets", ret.name); // save appearance presets cache. (For chooser loader (skin, clothing,...) } else // BaseCharacter from appearance presets { ret = createAdditionalCharacter(plugin, appearancePath); } ret.weight = 1f; return ret; } // --- JSON --- public JSONNode getJSON() { var jn = JSONNode.Parse(JsonUtility.ToJson(this)); var ary = new JSONArray(); foreach (var kvp in morphs) ary.Add(new JSONClass() { { "name", kvp.Key }, { "value", kvp.Value.ToString() } }); jn["morphs"] = ary; return jn; } internal static CharacterProfile restoreJSON(CharacterFusioner plugin, JSONClass json) { CharacterProfile ret = JsonUtility.FromJson(json.ToString()); ret.morphs = new Dictionary(); // need initialization. foreach (JSONClass j in (JSONArray)json["morphs"]) ret.morphs[j["name"]] = j["value"].AsFloat; // NEW: If appearancePath is missing (old save format), construct it from name if (string.IsNullOrEmpty(ret.appearancePath)) { ret.appearancePath = dUtil.create_appearancePresetPath(ret.name); } //plugin.saveJSON_asPresetCache("SkinPresets", ret.skinJSON, ret.name); return ret; } } }