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

178 lines
6.3 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
using System;
public partial class AbilityEffectEditorWindow
{
private void DrawEffectCreation()
{
EditorGUILayout.BeginVertical("box");
EditorGUILayout.LabelField("Create New Effect", EditorStyles.boldLabel);
DrawEffectTypeSelection();
if (selectedEffectType != null)
{
DrawEffectBasicFields();
DrawEffectTypeSpecificFields();
EditorGUILayout.Space(10);
if (GUILayout.Button("Create Effect"))
{
CreateEffect();
}
}
EditorGUILayout.EndVertical();
}
private void DrawEffectTypeSelection()
{
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Effect Type", EditorStyles.boldLabel);
string[] typeNames = effectTypes.Keys.ToArray();
int currentIndex = Array.IndexOf(typeNames, selectedEffectType?.Name ?? "");
int newIndex = EditorGUILayout.Popup("Select Type", currentIndex, typeNames);
if (newIndex != currentIndex && newIndex >= 0)
{
selectedEffectType = effectTypes[typeNames[newIndex]];
effectData.typeSpecificData.Clear();
}
}
private void DrawEffectBasicFields()
{
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Basic Settings", EditorStyles.boldLabel);
effectData.name = EditorGUILayout.TextField("Name", effectData.name);
effectData.description = EditorGUILayout.TextArea(effectData.description, GUILayout.Height(60));
EditorGUILayout.Space(5);
EditorGUILayout.LabelField("Target Settings", EditorStyles.boldLabel);
effectData.applyToTargetsHit = EditorGUILayout.Toggle("Apply To Targets Hit", effectData.applyToTargetsHit);
effectData.applyToSelf = EditorGUILayout.Toggle("Apply To Self", effectData.applyToSelf);
EditorGUILayout.Space(5);
EditorGUILayout.LabelField("Duration Settings", EditorStyles.boldLabel);
effectData.duration = EditorGUILayout.FloatField("Duration", effectData.duration);
// Draw tags
EditorGUILayout.Space(5);
EditorGUILayout.LabelField("Tags", EditorStyles.boldLabel);
DrawTagsList(effectData.tags);
}
private void DrawTagsList(List<GameTag> tags)
{
for (int i = 0; i < tags.Count; i++)
{
EditorGUILayout.BeginHorizontal();
tags[i] = (GameTag)EditorGUILayout.ObjectField(tags[i], typeof(GameTag), false);
if (GUILayout.Button("Remove", GUILayout.Width(60)))
{
tags.RemoveAt(i);
break;
}
EditorGUILayout.EndHorizontal();
}
if (GUILayout.Button("Add Tag"))
{
tags.Add(null);
}
}
private void DrawEffectTypeSpecificFields()
{
if (selectedEffectType == null) return;
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Type Specific Settings", EditorStyles.boldLabel);
if (selectedEffectType == typeof(InstantValueEffect))
{
DrawInstantValueEffectFields();
}
else if (selectedEffectType == typeof(DamageOverTimeEffect))
{
DrawDamageOverTimeEffectFields();
}
else if (selectedEffectType == typeof(StatusEffect))
{
DrawStatusEffectFields();
}
}
private void DrawInstantValueEffectFields()
{
float baseValue = effectData.GetOrCreateTypeSpecific<float>("baseValue");
baseValue = EditorGUILayout.FloatField("Base Value", baseValue);
effectData.typeSpecificData["baseValue"] = baseValue;
DamageType damageType = effectData.GetOrCreateTypeSpecific<DamageType>("damageType");
damageType = (DamageType)EditorGUILayout.EnumPopup("Damage Type", damageType);
effectData.typeSpecificData["damageType"] = damageType;
float alliedMultiplier = effectData.GetOrCreateTypeSpecific<float>("alliedMultiplier");
alliedMultiplier = EditorGUILayout.FloatField("Allied Target Multiplier", alliedMultiplier);
effectData.typeSpecificData["alliedMultiplier"] = alliedMultiplier;
float enemyMultiplier = effectData.GetOrCreateTypeSpecific<float>("enemyMultiplier");
enemyMultiplier = EditorGUILayout.FloatField("Enemy Target Multiplier", enemyMultiplier);
effectData.typeSpecificData["enemyMultiplier"] = enemyMultiplier;
}
private void DrawDamageOverTimeEffectFields()
{
float damagePerTick = effectData.GetOrCreateTypeSpecific<float>("damagePerTick");
damagePerTick = EditorGUILayout.FloatField("Damage Per Tick", damagePerTick);
effectData.typeSpecificData["damagePerTick"] = damagePerTick;
float tickRate = effectData.GetOrCreateTypeSpecific<float>("tickRate");
tickRate = EditorGUILayout.FloatField("Tick Rate", tickRate);
effectData.typeSpecificData["tickRate"] = tickRate;
DamageOverTimeType dotType = effectData.GetOrCreateTypeSpecific<DamageOverTimeType>("dotType");
dotType = (DamageOverTimeType)EditorGUILayout.EnumPopup("DoT Type", dotType);
effectData.typeSpecificData["dotType"] = dotType;
}
private void DrawStatusEffectFields()
{
EditorGUILayout.LabelField("Stat Influences", EditorStyles.boldLabel);
DrawStatInfluencesList(effectData.GetOrCreateTypeSpecific<List<StatInfluence>>("statInfluences"));
}
private void DrawStatInfluencesList(List<StatInfluence> influences)
{
for (int i = 0; i < influences.Count; i++)
{
EditorGUILayout.BeginVertical("box");
influences[i].statTag = (GameTag)EditorGUILayout.ObjectField("Stat Tag",
influences[i].statTag, typeof(GameTag), false);
influences[i].percentInfluence = EditorGUILayout.FloatField("Percent Influence",
influences[i].percentInfluence);
if (GUILayout.Button("Remove Influence"))
{
influences.RemoveAt(i);
break;
}
EditorGUILayout.EndVertical();
}
if (GUILayout.Button("Add Stat Influence"))
{
influences.Add(new StatInfluence());
}
}
}