using Godot; using System; using System.Globalization; #if TOOLS [Tool] public partial class AdventureResourceInspector : Node { const string LEVEL_ITEM_NAME = "Level"; const string INITIAL_ITEM_NAME = "Initial data"; const string ZOMBIES_ITEM_NAME = "Zombies"; const string EVENTS_ITEM_NAME = "Events"; const string HUGEWAVE_ITEM_NAME = "Is huge wave?"; private PackedScene zombieEditorScene = ResourceLoader.Load("uid://db5ah76l43ng2"); private PackedScene initialEditorScene = ResourceLoader.Load("uid://sqessjn0m4o3"); private Tree tree; private AdventureLevelResource heldResource; private Texture2D deleteTexture = ResourceLoader.Load("res://addons/pvzadventure/icons/delete.png"); [Signal] public delegate void RefreshedEventHandler(); [Export] public EditorsContainer editorContainer; [Export] public AdventureEditor adventureEditor; private TreeItem root; private TreeItem initialData; public override void _Ready() { tree = GetNode("Tree"); } public void Refresh(AdventureLevelResource resource) { heldResource = resource; RefreshTree(); } private void RefreshTree() { EmitSignal(SignalName.Refreshed); tree.Clear(); root = CreateItem(LEVEL_ITEM_NAME); initialData = CreateItem(INITIAL_ITEM_NAME, root); for (int i = 0; i < heldResource.waves.Count; i++) { var wave = CreateItem(string.Format("Wave {0}", i), root); wave.AddButton(0, deleteTexture, tooltipText: "Removes wave. (note that number will not visibly change)"); CreateItem(ZOMBIES_ITEM_NAME, wave); CreateItem(EVENTS_ITEM_NAME, wave); CreateItem(HUGEWAVE_ITEM_NAME, TreeItem.TreeCellMode.Check, true, wave) .SetChecked(0, heldResource.waves[i].isHugeWave); var delay = tree.CreateItem(wave); if (heldResource.waves[i].customWaveDelay > 0) delay.SetText(0, heldResource.waves[i].customWaveDelay.ToString(new CultureInfo("en-US"))); else delay.SetText(0, heldResource.standardWaveDelay.ToString()); 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.IsEditable(0) || selected.GetText(0).Split(" ")[0] == "Wave") return; editorContainer.ClearChildren(); switch (selected.GetText(0)) { case LEVEL_ITEM_NAME: EditorInterface.Singleton.EditResource(adventureEditor.editedResource); tree.DeselectAll(); return; case ZOMBIES_ITEM_NAME: var editor = zombieEditorScene.Instantiate(); editorContainer.AddChild(editor); editor.SetEditedWave(heldResource.waves[GetWaveIndex(selected.GetParent())]); editor.SaveCallback += adventureEditor.Save; return; case EVENTS_ITEM_NAME: break; case INITIAL_ITEM_NAME: var initialEditor = initialEditorScene.Instantiate(); editorContainer.AddChild(initialEditor); initialEditor.SetData(heldResource); initialEditor.SaveCallback += adventureEditor.Save; break; } } public void OnItemEdited() { var selected = tree.GetEdited(); if (selected.GetCellMode(0) == TreeItem.TreeCellMode.Check) { heldResource.waves[GetWaveIndex(selected.GetParent())].isHugeWave = selected.IsChecked(0); } else { 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; } } Callable.From(RefreshTree).CallDeferred(); } public void OnTreeButtonClicked(TreeItem item, int column, int id, int button_index) { heldResource.waves.RemoveAt(GetWaveIndex(item)); adventureEditor.HardReload(); RefreshTree(); } private int GetWaveIndex(TreeItem waveTreeItem) { return int.Parse(waveTreeItem.GetText(0).Split(" ")[1]); } private TreeItem CreateItem(string Name, TreeItem root = null) { if (root == null) { var item = tree.CreateItem(); item.SetText(0, Name); return item; } else { var item = tree.CreateItem(root); item.SetText(0, Name); return item; } } private TreeItem CreateItem(string Name, TreeItem.TreeCellMode cellMode, bool editable, TreeItem root = null) { var item = tree.CreateItem(root); item.SetCellMode(0,cellMode); item.SetEditable(0, editable); item.SetText(0, Name); return item; } } #endif