using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.VisualScripting; #if UNITY_EDITOR using UnityEditor; #endif [CreateAssetMenu(fileName = "New Apparel", menuName = "Config/Items/New Apparel")] public class ApparelSO : ItemSO { public enum Type { Armored, Leather, Magic, Plated, Enhancement, Accessory } public enum Location { Head, Chest, Leggings, Neck, RingLocOne, RingLocTwo, Relic } public enum ApparelEffect { Defense, Resistances, HealthRegen, ManaRegen, DamageModifier, ToHitModifier, GiveSpell, GiveAbility, Stats, MoreMana, MoreHealth, Other } public Location ApparelLocation = Location.Head; public Type ApparelType = Type.Armored; public List<ApparelEffect> ApparelEffects; public int Defense; public List<SpellSO.Element> ApparelElementResistances; public List<WeaponSO.Type> ApparelTypeResistances; [Range(0,100)][Tooltip("Percentage is in INT amount (0-100)")] public int HealthRegeneration; [Range(0,100)][Tooltip("Percentage is in INT amount (0-100)")] public int ManaRegeneration; public int Damage; public int ToHit; public List<SpellSO> Spells; public List<AbilitySO> Abilities; [Tooltip("0 - STR | 1 - INT | 2 - CON | 3 - DEX | 4 - CHA | 5 - WIS | 6 - LCK")] public List<Vector2Int> StatMods; public int ExtraMana; public int ExtraHealth; public int FlagValue; public bool RequiresWeatherType; public List<ClimateManager.Weather> RequiredWeather; public bool AddSpells; public List<SpellSO> SpellsToAdd; public bool AddAbilities; public List<AbilitySO> AbilitiesToAdd; } #if UNITY_EDITOR [CustomEditor(typeof(ApparelSO))] public class ApparelSOEditor : ItemSOEditor { private ApparelSO container; private void OnEnable() { container = target as ApparelSO; } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.LabelField("General Properties", EditorStyles.boldLabel); container.ID = EditorGUILayout.IntField("ID", container.ID); EditorGUILayout.PropertyField(serializedObject.FindProperty("Name")); EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelLocation")); EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelType")); EditorGUILayout.PropertyField(serializedObject.FindProperty("Description")); EditorGUILayout.PropertyField(serializedObject.FindProperty("HelperEffects")); EditorGUILayout.PropertyField(serializedObject.FindProperty("Item_Sprite")); EditorGUILayout.Space(10); EditorGUILayout.LabelField("Shop Properties", EditorStyles.boldLabel); container.Value = EditorGUILayout.IntField("Value", container.Value); container.Cost = EditorGUILayout.IntField("Cost", container.Cost); EditorGUILayout.Space(5); EditorGUILayout.PropertyField(serializedObject.FindProperty("Item_Rarity")); EditorGUILayout.PropertyField(serializedObject.FindProperty("CantBeSold")); EditorGUILayout.Space(10); EditorGUILayout.LabelField("Apparel Properties", EditorStyles.boldLabel); EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelEffects")); foreach (ApparelSO.ApparelEffect effect in container.ApparelEffects) { switch (effect) { case ApparelSO.ApparelEffect.Defense: container.Defense = EditorGUILayout.IntField("Defense", container.Defense); container.Defense = Mathf.Clamp(container.Defense, 0, int.MaxValue); break; case ApparelSO.ApparelEffect.Resistances: EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelElementResistances")); EditorGUILayout.PropertyField(serializedObject.FindProperty("ApparelTypeResistances")); break; case ApparelSO.ApparelEffect.HealthRegen: EditorGUILayout.PropertyField(serializedObject.FindProperty("HealthRegeneration")); break; case ApparelSO.ApparelEffect.ManaRegen: EditorGUILayout.PropertyField(serializedObject.FindProperty("ManaRegeneration")); break; case ApparelSO.ApparelEffect.DamageModifier: EditorGUILayout.PropertyField(serializedObject.FindProperty("Damage")); break; case ApparelSO.ApparelEffect.ToHitModifier: EditorGUILayout.PropertyField(serializedObject.FindProperty("ToHit")); break; case ApparelSO.ApparelEffect.GiveSpell: EditorGUILayout.PropertyField(serializedObject.FindPropertyOrFail("Spells")); break; case ApparelSO.ApparelEffect.GiveAbility: EditorGUILayout.PropertyField(serializedObject.FindPropertyOrFail("Abilities")); break; case ApparelSO.ApparelEffect.Stats: EditorGUILayout.PropertyField(serializedObject.FindProperty("StatMods")); break; case ApparelSO.ApparelEffect.MoreMana: EditorGUILayout.PropertyField(serializedObject.FindProperty("ExtraMana")); break; case ApparelSO.ApparelEffect.MoreHealth: EditorGUILayout.PropertyField(serializedObject.FindProperty("ExtraHealth")); break; case ApparelSO.ApparelEffect.Other: EditorGUILayout.PropertyField(serializedObject.FindProperty("FlagValue")); break; } } EditorGUILayout.Space(15); EditorGUILayout.PropertyField(serializedObject.FindProperty("RequiresWeatherType")); if (container.RequiresWeatherType) EditorGUILayout.PropertyField(serializedObject.FindProperty("RequiredWeather")); EditorGUILayout.Space(10); EditorGUILayout.LabelField("Requirement Properties", EditorStyles.boldLabel); EditorGUILayout.PropertyField(serializedObject.FindProperty("Has_Requirement")); if (container.Has_Requirement) { EditorGUILayout.PropertyField(serializedObject.FindProperty("Requirements")); if (container.Requirements.Contains(ItemSO.PossReqs.Stats)) { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Stats Requirements", EditorStyles.boldLabel); container.Number_Of_Stat_Reqs = EditorGUILayout.IntField("Number of Stat Requirements", container.Number_Of_Stat_Reqs); container.Number_Of_Stat_Reqs = Mathf.Clamp(container.Number_Of_Stat_Reqs, 0, MaxPrimeStatReqs); if (container.Stats_List.Count < container.Number_Of_Stat_Reqs) { for (int i = 0; i < container.Number_Of_Stat_Reqs; i++) container.Stats_List.Add(new Vector3Int(0, 0, 0)); } else if (container.Stats_List.Count > container.Number_Of_Stat_Reqs) container.Stats_List.Remove(container.Stats_List[^1]); EditorGUILayout.PropertyField(serializedObject.FindProperty("Stats_List")); } if (container.Requirements.Contains(ItemSO.PossReqs.Sec_Stats)) { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Sec Stats Requirements", EditorStyles.boldLabel); container.Number_Of_Sec_Stat_Reqs = EditorGUILayout.IntField("Number of Secondary Stat Requirements", container.Number_Of_Sec_Stat_Reqs); container.Number_Of_Sec_Stat_Reqs = Mathf.Clamp(container.Number_Of_Sec_Stat_Reqs, 0, MaxSecondaryStatReqs); if (container.Sec_Stats_List.Count < container.Number_Of_Sec_Stat_Reqs) { for (int i = 0; i < container.Number_Of_Sec_Stat_Reqs; i++) container.Sec_Stats_List.Add(new Vector3Int(0, 0, 0)); } else if (container.Sec_Stats_List.Count > container.Number_Of_Sec_Stat_Reqs) container.Sec_Stats_List.Remove(container.Sec_Stats_List[^1]); EditorGUILayout.PropertyField(serializedObject.FindProperty("Sec_Stats_List")); } if (container.Requirements.Contains(ItemSO.PossReqs.Item)) { EditorGUILayout.Space(10); EditorGUILayout.LabelField("Item Requirements", EditorStyles.boldLabel); container.Number_Of_Items = EditorGUILayout.IntField("Number of Items", container.Number_Of_Items); container.Number_Of_Items = Mathf.Clamp(container.Number_Of_Items, 0, MaxItemRequirement); if (container.Item_List.Count < container.Number_Of_Items) { for (int i = 0; i < container.Number_Of_Items; i++) container.Item_List.Add(""); } else if (container.Item_List.Count > container.Number_Of_Items && container.Number_Of_Items > 0) container.Item_List.Remove(container.Item_List[^1]); EditorGUILayout.PropertyField(serializedObject.FindProperty("Item_List")); } EditorGUILayout.Space(10); EditorGUILayout.PropertyField(serializedObject.FindProperty("AddSpells")); if (container.AddSpells) EditorGUILayout.PropertyField(serializedObject.FindProperty("SpellsToAdd")); EditorGUILayout.PropertyField(serializedObject.FindProperty("AddAbilities")); if (container.AddAbilities) EditorGUILayout.PropertyField(serializedObject.FindProperty("AbilitiesToAdd")); } serializedObject.ApplyModifiedProperties(); } } #endif