Forbidden plants

This commit is contained in:
Rendo 2025-07-29 04:41:38 +05:00
commit 3fe903f2b8
9 changed files with 92 additions and 36 deletions

View file

@ -1,10 +1,11 @@
[gd_scene load_steps=4 format=3 uid="uid://dymyownbt688c"] [gd_scene load_steps=5 format=3 uid="uid://dymyownbt688c"]
[ext_resource type="Texture2D" uid="uid://dxyf557m4mq1p" path="res://assets/sprites/gui/EmptyPlantCard.png" id="1_x27jk"] [ext_resource type="Texture2D" uid="uid://dxyf557m4mq1p" path="res://assets/sprites/gui/EmptyPlantCard.png" id="1_x27jk"]
[ext_resource type="Texture2D" uid="uid://cabpf23ndlvx0" path="res://assets/sprites/gui/Selection.tres" id="2_m8071"] [ext_resource type="Texture2D" uid="uid://cabpf23ndlvx0" path="res://assets/sprites/gui/Selection.tres" id="2_m8071"]
[ext_resource type="Texture2D" uid="uid://cjkwy3u0wuax3" path="res://assets/sprites/gui/ForbiddenPacket.tres" id="3_ji8qd"] [ext_resource type="Texture2D" uid="uid://cjkwy3u0wuax3" path="res://assets/sprites/gui/ForbiddenPacket.tres" id="3_ji8qd"]
[ext_resource type="Script" uid="uid://cy5t2lk5g75x7" path="res://addons/pvzadventure/scripts/seedpacket-editor/ForbiddableSeedpacket.cs" id="3_m8071"]
[node name="EditorSeedpacket" type="TextureButton"] [node name="EditorSeedpacket" type="TextureButton" node_paths=PackedStringArray("preview", "forrbidTexture")]
anchors_preset = -1 anchors_preset = -1
anchor_right = 0.137 anchor_right = 0.137
anchor_bottom = 0.28 anchor_bottom = 0.28
@ -13,6 +14,9 @@ mouse_default_cursor_shape = 2
texture_normal = ExtResource("1_x27jk") texture_normal = ExtResource("1_x27jk")
texture_focused = ExtResource("2_m8071") texture_focused = ExtResource("2_m8071")
stretch_mode = 0 stretch_mode = 0
script = ExtResource("3_m8071")
preview = NodePath("PlantPreviewContainer/Preview")
forrbidTexture = NodePath("ForbiddenTexture")
metadata/_edit_use_anchors_ = true metadata/_edit_use_anchors_ = true
[node name="PlantPreviewContainer" type="Control" parent="."] [node name="PlantPreviewContainer" type="Control" parent="."]

View file

@ -112,6 +112,7 @@ layout_mode = 2
visible = false visible = false
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3 size_flags_vertical = 3
alignment = 1
[node name="Label" type="Label" parent="VBoxContainer/ForbiddenTags"] [node name="Label" type="Label" parent="VBoxContainer/ForbiddenTags"]
layout_mode = 2 layout_mode = 2
@ -128,6 +129,7 @@ columns = 9
[node name="ForbiddenPlants" type="VBoxContainer" parent="VBoxContainer"] [node name="ForbiddenPlants" type="VBoxContainer" parent="VBoxContainer"]
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3 size_flags_vertical = 3
alignment = 1
[node name="Label" type="Label" parent="VBoxContainer/ForbiddenPlants"] [node name="Label" type="Label" parent="VBoxContainer/ForbiddenPlants"]
layout_mode = 2 layout_mode = 2
@ -138,6 +140,7 @@ vertical_alignment = 1
[node name="FPlantsContainer" type="GridContainer" parent="VBoxContainer/ForbiddenPlants"] [node name="FPlantsContainer" type="GridContainer" parent="VBoxContainer/ForbiddenPlants"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 3 size_flags_vertical = 3
columns = 9 columns = 9

View file

@ -0,0 +1,28 @@
using Godot;
using Newlon.Resources;
[Tool]
public partial class ForbiddableSeedpacket : TextureButton
{
[Signal] public delegate void SaveCallbackEventHandler();
[Export] private TextureRect preview;
[Export] private TextureRect forrbidTexture;
public PlantResource HeldResource;
public bool forbidden = false;
public override void _Pressed()
{
forbidden = !forbidden;
Update();
}
private void Update()
{
RefreshTexture();
EmitSignal(SignalName.SaveCallback);
}
public void RefreshTexture()
{
preview.Texture = HeldResource.Preview;
forrbidTexture.Visible = forbidden;
}
}

View file

@ -0,0 +1 @@
uid://cy5t2lk5g75x7

View file

@ -1,5 +1,7 @@
using System.Collections.Generic;
using Godot; using Godot;
using Godot.Collections; using Godot.Collections;
using Newlon.Components.GUI;
using Newlon.Resources; using Newlon.Resources;
[Tool] [Tool]
@ -9,15 +11,17 @@ public partial class SeedpacketEditor : BaseEditor
public override void SetEditedData(AdventureLevelResource data) public override void SetEditedData(AdventureLevelResource data)
{ {
base.SetEditedData(data); base.SetEditedData(data);
SetPrepickedPlants(); SetupPrepickedPlants();
SetupForbiddablePlants();
} }
public override void Save() public override void Save()
{ {
CalculatePrepickedPlants(); CalculatePrepickedPlants();
CalculateForbiddenPlants();
base.Save(); base.Save();
} }
private void SetPrepickedPlants() private void SetupPrepickedPlants()
{ {
for (int i = 0; i < editedResource.prepickedPlants.Count; i++) for (int i = 0; i < editedResource.prepickedPlants.Count; i++)
{ {
@ -28,6 +32,21 @@ public partial class SeedpacketEditor : BaseEditor
} }
} }
} }
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() private void CalculatePrepickedPlants()
{ {
Array<string> prepicked = new(); Array<string> prepicked = new();
@ -40,6 +59,20 @@ public partial class SeedpacketEditor : BaseEditor
} }
editedResource.prepickedPlants = prepicked; 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) private PlantResource TryGetPlant(string plantName)
{ {
foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY)) foreach (var file in ResourceLoader.ListDirectory(PLANTS_DIRECTORY))
@ -49,5 +82,20 @@ public partial class SeedpacketEditor : BaseEditor
} }
return null; 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;
}
} }

View file

@ -1,28 +0,0 @@
@tool
extends TextureButton
signal save_callback
var held_data : PlantResource = null
@export var preview : TextureRect
func _can_drop_data(at_position: Vector2, data: Variant) -> bool:
if typeof(data) == TYPE_DICTIONARY:
if data.type == "files":
return load(data.files[0]) is PlantResource
return false
func _drop_data(at_position: Vector2, data: Variant) -> void:
held_data = load(data.files[0]) as PlantResource
update()
func update():
if held_data:
preview.texture = held_data.Preview
else:
preview.texture = null
save_callback.emit()
func _pressed() -> void:
held_data = null
update()

View file

@ -1 +0,0 @@
uid://donugf6vnchij

View file

@ -281,9 +281,9 @@ wavePercentage = 0.5
standardWaveDelay = 30.0 standardWaveDelay = 30.0
initialWaveDelay = 20.0 initialWaveDelay = 20.0
reward = ExtResource("1_eqa0o") reward = ExtResource("1_eqa0o")
forbiddenPlants = Array[String](["aloe", "spikeweed", "peashooter", "wallnut"]) forbiddenPlants = Array[String]([])
forbiddenTags = Array[String]([]) forbiddenTags = Array[String]([])
prepickedPlants = Array[String](["snipach", "potatomine", "sunflower", "garlic", "cucumber"]) prepickedPlants = Array[String]([])
waves = Array[ExtResource("4_kc7t2")]([SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")]) waves = Array[ExtResource("4_kc7t2")]([SubResource("Resource_c21si"), SubResource("Resource_icaa5"), SubResource("Resource_kc7t2"), SubResource("Resource_66y5q"), SubResource("Resource_tuvrx"), SubResource("Resource_t4nit"), SubResource("Resource_qx8xe"), SubResource("Resource_hyvhe"), SubResource("Resource_8syff"), SubResource("Resource_jfmww"), SubResource("Resource_vrqir"), SubResource("Resource_2seob"), SubResource("Resource_geil0"), SubResource("Resource_lxb1x"), SubResource("Resource_o5y12"), SubResource("Resource_diw66"), SubResource("Resource_pwwqn")])
initialScenes = Array[PackedScene]([null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]) initialScenes = Array[PackedScene]([null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null])
metadata/_custom_type_script = "uid://bximdujbkj2n4" metadata/_custom_type_script = "uid://bximdujbkj2n4"

View file

@ -10,6 +10,7 @@ public class PrepickedDummyHandler : SeedpacketHandler
LevelGUIElements.Instance.SeedpacketsHotbar.AddChild(hotbarSeedpacket); LevelGUIElements.Instance.SeedpacketsHotbar.AddChild(hotbarSeedpacket);
hotbarSeedpacket.SetResource(_owner.GetResource()); hotbarSeedpacket.SetResource(_owner.GetResource());
hotbarSeedpacket.SetHandler(new PrepickedHandler(_owner)); hotbarSeedpacket.SetHandler(new PrepickedHandler(hotbarSeedpacket));
hotbarSeedpacket.disablePacket = true;
} }
} }