101 lines
3.1 KiB
C#
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;
|
|
}
|
|
|
|
}
|