new mutations + plant part data structure simplified

This commit is contained in:
Altaezio
2026-06-26 19:10:30 +02:00
parent 39630ce2ca
commit 94dc231c01
216 changed files with 4268 additions and 5183 deletions

View File

@@ -0,0 +1,4 @@
extends Resource
class_name PartGroup
@export var parts: Array[PlantPart]

View File

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

View File

@@ -1,5 +0,0 @@
extends Resource
class_name PartMutationAssociation
@export var parts: Array[PlantPart]
@export var part_amount: int = 1

View File

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

View File

@@ -3,6 +3,7 @@ extends Sprite2D
class_name PlantPartBuilder
@export var part_name: String
@export var part_index: int
@export_tool_button("Load resource") var load_resource_button = load_resource
@@ -12,11 +13,15 @@ class_name PlantPartBuilder
@export_tool_button("Save as resource") var save_as_resource_button = save_as_resource
func load_resource():
var destination := "res://entities/plants/resources/plant_parts/" + part_name + ".tres"
print("Loading: ", part_name, " at: ", destination)
var plant_part: PlantPart = ResourceLoader.load(destination) as PlantPart
print("Loading: ", part_name, " n°: ", part_index, " at: ", destination)
var part_group: PartGroup = ResourceLoader.load(destination) as PartGroup
if part_group.parts.size() <= part_index:
printerr("No part at ", part_index)
return
var plant_part := part_group.parts[part_index]
if plant_part:
texture = plant_part.texture
type = plant_part.type
@@ -34,7 +39,7 @@ func load_resource():
new_child.position = plant_part.attaches[i].position
new_child.attach_types = plant_part.attaches[i].attach_types
attaches.add_child(new_child)
new_child.set_owner(self )
new_child.set_owner(self)
elif i >= plant_part.attaches.size():
attaches_children[i].free()
else:
@@ -42,16 +47,23 @@ func load_resource():
func save_as_resource():
var destination := "res://entities/plants/resources/plant_parts/" + part_name + ".tres"
print("Saving: ", part_name, " at: ", destination)
print("Saving: ", part_name, " n°: ", part_index, " at: ", destination)
var part_group: PartGroup = ResourceLoader.load(destination) as PartGroup
if not part_group:
part_group = PartGroup.new()
if part_group.parts.size() <= part_index:
part_group.parts.resize(part_index + 1)
var attaches_vec2: Array[PlantAttach]
for attach in attaches.get_children():
attaches_vec2.append(PlantAttachBuilder.to_plant_attach(attach))
var plant_part = PlantPart.new()
plant_part.init(texture, type, PlantAttachBuilder.to_plant_attach(root), attaches_vec2)
plant_part.resource_name = part_name
var err := ResourceSaver.save(plant_part, destination, ResourceSaver.FLAG_REPLACE_SUBRESOURCE_PATHS)
var plantPart := PlantPart.new()
plantPart.init(texture, type, PlantAttachBuilder.to_plant_attach(root), attaches_vec2)
plantPart.resource_name = part_name
part_group.parts[part_index] = plantPart.duplicate_deep()
var err := ResourceSaver.save(part_group, destination, ResourceSaver.FLAG_REPLACE_SUBRESOURCE_PATHS)
if err != OK:
printerr("Error saving resource: ", error_string(err))
else:
plant_part.take_over_path(destination)
part_group.take_over_path(destination)

View File

@@ -20,12 +20,11 @@ const PLACEHOLDER_GROWING_TEXTURE: Texture = preload("res://entities/plants/asse
enum OriginType {BRANCH_ORIGIN, MUTATION_ORIGIN, BASE_LEAF_ORIGIN}
# @export var parts_archetype_associations: Dictionary[PlantArchetype, PartArchetypeAssociation] TODO:: have the archetypes
@export var bases: Array[PlantPart]
@export var baby_bases: Array[PlantPart]
@export var branches: Array[PlantPart]
@export var n_branches: int = 2
@export var base_leaves: Array[PlantPart]
@export var parts_mutation_associations: Dictionary[String, PartMutationAssociation] # Array[PlantPart]
@export var all_bases: PartGroup
@export var baby_bases_start_ind: int
@export var branches: PartGroup
@export var base_leaves: PartGroup
@export var part_group: Dictionary[String, PartGroup]
@export var chance_to_have_part := 0.75;
@@ -45,6 +44,18 @@ var rng := RandomNumberGenerator.new()
var image: Image = Image.create_empty(IMAGE_WIDTH, IMAGE_HEIGHT, false, Image.FORMAT_RGBA8)
var image_center: Vector2i = Vector2(0.5, 1) * Vector2(image.get_size())
var bases: Array[PlantPart]
var baby_bases: Array[PlantPart]
func _ready() -> void:
bases.resize(baby_bases_start_ind)
baby_bases.resize(all_bases.parts.size() - baby_bases_start_ind)
for i in range(all_bases.parts.size()):
if i < baby_bases_start_ind:
bases[i] = all_bases.parts[i]
else:
baby_bases[i - baby_bases_start_ind] = all_bases.parts[i]
func random_ind(array: Array) -> int:
return rng.randi_range(0, array.size() - 1)
@@ -126,13 +137,13 @@ func build_plant_texture(plant_data: PlantData) -> Texture:
var weight_per_origin_type: Array[int] = origin_weights_base.values().duplicate()
var parts_to_place: Dictionary[OriginType, Array] # BRANCH_ORIGIN : Array[PlantPart], MUTATION_ORIGIN : Array[Array[PlantPart]], BASE_LEAF_ORIGIN : Array[PlantPart]
parts_to_place[OriginType.BRANCH_ORIGIN] = branches.duplicate()
parts_to_place[OriginType.BRANCH_ORIGIN] = branches.parts.duplicate()
parts_to_place[OriginType.MUTATION_ORIGIN] = []
parts_to_place[OriginType.BASE_LEAF_ORIGIN] = base_leaves.duplicate()
parts_to_place[OriginType.BASE_LEAF_ORIGIN] = base_leaves.parts.duplicate()
var mutation_weights: Array[int] = []
for mutation in plant_data.mutations:
if mutation.id in parts_mutation_associations:
var mutation_parts := parts_mutation_associations[mutation.id].parts
if mutation.id in part_group:
var mutation_parts := part_group[mutation.id].parts.duplicate()
parts_to_place[OriginType.MUTATION_ORIGIN].append(mutation_parts)
var mutation_weight := get_mutation_weight(mutation.level)
mutation_weights.append(mutation_weight)