using System.Collections.Generic; using Godot; using Godot.Collections; using Newlon.Components.GUI; using Newlon.Resources; [Tool] public partial class SeedpacketEditor : BaseEditor { private const string PLANTS_DIRECTORY = "res://assets/plants/"; public override void SetEditedData(AdventureLevelResource data) { base.SetEditedData(data); SetupPrepickedPlants(); SetupForbiddablePlants(); } public override void Save() { CalculatePrepickedPlants(); CalculateForbiddenPlants(); base.Save(); } private void SetupPrepickedPlants() { for (int i = 0; i < editedResource.prepickedPlants.Count; i++) { if (GetNode("%PrepickedContainer").GetChild(i).GetNode("Seedpacket") is DnDSeedpacket packet) { packet.HeldResource = TryGetPlant(editedResource.prepickedPlants[i]); packet.RefreshTexture(); } } } private void SetupForbiddablePlants() { var plants = GetPlants(); var packed = ResourceLoader.Load("uid://dymyownbt688c"); for (int i = 0; i < plants.Count; i++) { var seedpacket = packed.Instantiate(); seedpacket.HeldResource = plants[i]; seedpacket.forbidden = editedResource.forbiddenPlants.Contains(plants[i].GetInternalID()); seedpacket.RefreshTexture(); seedpacket.SaveCallback += Save; GetNode("%FPlantsContainer").AddChild(seedpacket); } } private void CalculatePrepickedPlants() { Array prepicked = new(); foreach (var child in GetNode("%PrepickedContainer").GetChildren()) { if (child.GetNode("Seedpacket") is DnDSeedpacket packet && packet.HeldResource != null) { prepicked.Add(packet.HeldResource.GetInternalID()); } } editedResource.prepickedPlants = prepicked; } private void CalculateForbiddenPlants() { Array forbidden = new(); foreach (var child in GetNode("%FPlantsContainer").GetChildren()) { if (child is ForbiddableSeedpacket packet && packet.forbidden) { forbidden.Add(packet.HeldResource.GetInternalID()); } } editedResource.forbiddenPlants = forbidden; } private PlantResource TryGetPlant(string plantName) { foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY)) { if (plantName != file.TrimSuffix(".tres").ToLower()) continue; return ResourceLoader.Load(PLANTS_DIRECTORY + file); } return null; } private List GetPlants() { var result = new List(); foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY)) { result.Add(ResourceLoader.Load(PLANTS_DIRECTORY + file)); } result.Sort((a, b) => { return a.Order - b.Order; }); return result; } }