newlon/addons/pvzadventure/scripts/seedpacket-editor/SeedpacketEditor.cs
2025-07-29 04:41:38 +05:00

101 lines
3.1 KiB
C#

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<PackedScene>("uid://dymyownbt688c");
for (int i = 0; i < plants.Count; i++)
{
var seedpacket = packed.Instantiate<ForbiddableSeedpacket>();
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<string> 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<string> 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<PlantResource>(PLANTS_DIRECTORY + file);
}
return null;
}
private List<PlantResource> GetPlants()
{
var result = new List<PlantResource>();
foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY))
{
result.Add(ResourceLoader.Load<PlantResource>(PLANTS_DIRECTORY + file));
}
result.Sort((a, b) =>
{
return a.Order - b.Order;
});
return result;
}
}