RiftMayhem/Assets/Scripts/Editor/effect-editor-existing.cs

144 lines
4.8 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
using System;
public partial class AbilityEffectEditorWindow
{
private void DrawExistingEffects()
{
EditorGUILayout.LabelField("Existing Effects", EditorStyles.boldLabel);
var effects = GetAllEffects();
foreach (var effect in effects)
{
if (string.IsNullOrEmpty(searchQuery) || effect.name.ToLower().Contains(searchQuery.ToLower()))
{
EditorGUILayout.BeginVertical("box");
DrawEffectItem(effect);
EditorGUILayout.EndVertical();
}
}
}
private void DrawEffectItem(BaseEffect effect)
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.BeginVertical();
EditorGUILayout.LabelField(effect.name, EditorStyles.boldLabel);
EditorGUILayout.LabelField($"Type: {effect.GetType().Name}");
EditorGUILayout.EndVertical();
if (GUILayout.Button("Clone", GUILayout.Width(50)))
{
CloneEffect(effect);
}
if (GUILayout.Button("Edit", GUILayout.Width(50)))
{
Selection.activeObject = effect;
EditorUtility.FocusProjectWindow();
}
EditorGUILayout.EndHorizontal();
}
private void CreateEffect()
{
if (selectedEffectType == null)
{
EditorUtility.DisplayDialog("Error", "Please select an effect type!", "OK");
return;
}
if (string.IsNullOrEmpty(effectData.name))
{
EditorUtility.DisplayDialog("Error", "Effect name cannot be empty!", "OK");
return;
}
BaseEffect effect = (BaseEffect)CreateInstance(selectedEffectType);
effect.name = effectData.name;
effect.tags = new List<GameTag>(effectData.tags);
// Apply type-specific data
ApplyEffectTypeSpecificData(effect);
string path = EditorUtility.SaveFilePanelInProject(
"Save Effect",
effectData.name,
"asset",
"Save effect asset"
);
if (!string.IsNullOrEmpty(path))
{
AssetDatabase.CreateAsset(effect, path);
AssetDatabase.SaveAssets();
EditorUtility.FocusProjectWindow();
Selection.activeObject = effect;
effectData = new EffectCreationData();
selectedEffectType = null;
}
}
private void CloneEffect(BaseEffect sourceEffect)
{
string newName = $"{sourceEffect.name}_Clone";
string path = EditorUtility.SaveFilePanelInProject(
"Save Cloned Effect",
newName,
"asset",
"Save cloned effect asset"
);
if (string.IsNullOrEmpty(path)) return;
BaseEffect newEffect = (BaseEffect)CreateInstance(sourceEffect.GetType());
EditorUtility.CopySerialized(sourceEffect, newEffect);
newEffect.name = newName;
AssetDatabase.CreateAsset(newEffect, path);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.FocusProjectWindow();
Selection.activeObject = newEffect;
}
private void ApplyEffectTypeSpecificData(BaseEffect effect)
{
if (effect is InstantValueEffect instantEffect)
{
instantEffect.baseValue = effectData.GetOrCreateTypeSpecific<float>("baseValue");
instantEffect.damageType = effectData.GetOrCreateTypeSpecific<DamageType>("damageType");
instantEffect.AlliedTargetMultiplier = effectData.GetOrCreateTypeSpecific<float>("alliedMultiplier");
instantEffect.EnemyTargetMultiplier = effectData.GetOrCreateTypeSpecific<float>("enemyMultiplier");
}
else if (effect is DamageOverTimeEffect dotEffect)
{
dotEffect.baseDamagePerTick = effectData.GetOrCreateTypeSpecific<float>("damagePerTick");
dotEffect.tickRate = effectData.GetOrCreateTypeSpecific<float>("tickRate");
dotEffect.damageType = effectData.GetOrCreateTypeSpecific<DamageOverTimeType>("dotType");
}
else if (effect is StatusEffect statusEffect)
{
statusEffect.duration = effectData.duration;
statusEffect.applyToTargetsHit = effectData.applyToTargetsHit;
statusEffect.applyToSelf = effectData.applyToSelf;
List<StatInfluence> influences = effectData.GetOrCreateTypeSpecific<List<StatInfluence>>("statInfluences");
statusEffect.influencingStats = new List<StatInfluence>(influences);
}
}
private BaseEffect[] GetAllEffects()
{
return AssetDatabase.FindAssets("t:BaseEffect")
.Select(guid => AssetDatabase.LoadAssetAtPath<BaseEffect>(AssetDatabase.GUIDToAssetPath(guid)))
.ToArray();
}
}