// Assets/_Project/Scripts/Editor/Gameplay/RunDefinitionEditor.cs using UnityEditor; using UnityEngine; using TD.Gameplay.Waves; namespace TD.Editor.Gameplay { /// /// Inspector for . Draws the normal fields, then a live /// validation panel reporting whether the authored pools can actually produce a run. /// /// /// The check that matters here is the distinct-enemy-type one: because enemy upgrades are /// keyed to a wave slot, a phase must be able to fill its cycle with waves that use different /// enemies. A pool can look healthy (plenty of entries) and still fail that. Reporting it in /// the inspector turns a startup error into something a designer sees while authoring. /// [CustomEditor(typeof(RunDefinition))] public class RunDefinitionEditor : UnityEditor.Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); var run = (RunDefinition)target; EditorGUILayout.Space(); EditorGUILayout.LabelField("Validation", EditorStyles.boldLabel); bool ok = run.Validate(out string report); EditorGUILayout.HelpBox(report, ok ? MessageType.Info : MessageType.Error); // Per-phase capacity readout — the fastest way to see how much headroom a pool has // before the distinct-type requirement starts biting. if (run.Phases != null) { EditorGUILayout.Space(); EditorGUILayout.LabelField("Phase capacity", EditorStyles.boldLabel); for (int i = 0; i < run.Phases.Length; i++) { var phase = run.Phases[i]; if (phase == null) { EditorGUILayout.LabelField($"Phase {i + 1}", "— empty —"); continue; } int distinct = phase.CountDistinctEnemyTypes(); string value = $"{distinct} distinct enemy type(s) / {run.WavesPerCycle} needed"; var style = new GUIStyle(EditorStyles.label) { normal = { textColor = distinct >= run.WavesPerCycle ? EditorStyles.label.normal.textColor : new Color(0.9f, 0.4f, 0.3f) } }; EditorGUILayout.LabelField(phase.Label, value, style); } } EditorGUILayout.Space(); if (GUILayout.Button("Rebuild Wave Index")) { run.RebuildIndex(); Debug.Log($"[RunDefinition] Rebuilt wave index: {run.WaveCount} distinct wave(s)."); } } } }