178 lines
6.3 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|