using Godot; using System; using System.Globalization; [Tool] public partial class AdventureResourceInspector : Node { const int ORDERED = 0; const int EVENTS = 1; private PackedScene zombieEditorScene = ResourceLoader.Load("uid://db5ah76l43ng2"); private Tree tree; private AdventureLevelResource heldResource; private TreeItem root; private Texture2D deleteTexture = ResourceLoader.Load("res://addons/pvzadventure/icons/delete.png"); [Signal] public delegate void RefreshedEventHandler(); [Export] public Control editorContainer; public override void _Ready() { tree = GetNode("Tree"); } public void Refresh(AdventureLevelResource resource) { heldResource = resource; RefreshTree(); } private void RefreshTree() { tree.Clear(); root = tree.CreateItem(); root.DisableFolding = true; root.SetText(0, "Level"); EmitSignal(SignalName.Refreshed); var initial = tree.CreateItem(root); initial.SetText(0, "Initial data"); for (int i = 0; i < heldResource.waves.Count; i++) { var item = tree.CreateItem(root); item.DisableFolding = true; item.SetText(0, string.Format("Wave {0}", i)); item.AddButton(0, deleteTexture, tooltipText: "Removes wave. (note that number will not visibly change)"); var order = tree.CreateItem(item); order.SetText(0, "Zombies"); var spawns = tree.CreateItem(item); spawns.SetText(0, "Events"); var delay = tree.CreateItem(item); if (heldResource.waves[i].customWaveDelay > 0) delay.SetText(0, heldResource.waves[i].customWaveDelay.ToString(new CultureInfo("en-US"))); else delay.SetText(0, "Delay"); delay.SetEditable(0, true); } } public void OnNewButtonPressed() { var wave = new WaveData(); heldResource.waves.Add(wave); RefreshTree(); } public void OnItemSelected() { var selected = tree.GetSelected(); if ((selected.GetParent() == root && selected.GetIndex() != 0) || selected.IsEditable(0)) return; foreach (var child in editorContainer.GetChildren()) { child.QueueFree(); } if (selected == root) { GD.Print("level pressed"); return; } var index = selected.GetIndex(); if (index == 0 && selected.GetParent() == root) { GD.Print("Initial data selected"); return; } if (index == ORDERED) { var editor = zombieEditorScene.Instantiate(); editorContainer.AddChild(editor); editor.SetEditedWave(heldResource.waves[GetWaveIndex(selected.GetParent())]); return; } else if (index == EVENTS) { GD.Print("Events pressed"); return; } } public void OnItemEdited() { var selected = tree.GetEdited(); if (float.TryParse(selected.GetText(0), new CultureInfo("en-US"), out float result)) { heldResource.waves[GetWaveIndex(selected.GetParent())].customWaveDelay = result; } else { selected.SetText(0, "Delay"); heldResource.waves[GetWaveIndex(selected.GetParent())].customWaveDelay = 0; } } public void OnTreeButtonClicked(TreeItem item, int column, int id, int button_index) { heldResource.waves.RemoveAt(GetWaveIndex(item)); RefreshTree(); } private int GetWaveIndex(TreeItem waveTreeItem) { return int.Parse(waveTreeItem.GetText(0).Split(" ")[1]); } }