extends Resource class_name TextureBuilder const PLACEHOLDER_SEED_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/seed.png") const PLACEHOLDER_MATURE_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/mature.png") const PLACEHOLDER_GROWING_TEXTURE: Texture = preload("res://entities/plants/assets/sprites/default/growing.png") func build_seed_texture(_random_seed: int) -> Texture: return PLACEHOLDER_SEED_TEXTURE func build_plant_texture(plant_data: PlantData) -> Texture: match plant_data.get_state(): PlantData.State.MATURE: var mature_texture: Texture = PLACEHOLDER_MATURE_TEXTURE var mature_image: Image var base_part: PlantPart = plant_data.archetype.bases.pick_random(); mature_image = base_part.texture.get_image() var branch_parts: Array[PlantPart] = plant_data.archetype.branches var parts_to_place: Array[PlantPart]; for m in plant_data.mutations: var mutation := m; var mutation_possible_parts := mutation.possible_parts; for p in mutation.part_amount: parts_to_place.append(mutation_possible_parts.pick_random()) var available_base_attaches: Array[Vector2] = base_part.attaches.duplicate(); var available_base_bottom_attach: Array[Vector2] = base_part.bottom_attaches.duplicate(); var branch_attaches: Array[Vector2]; var branch_attach_parent: Array[PlantPart]; assert(branch_parts.size() <= base_part.attaches.size()); for branch in branch_parts: if available_base_attaches.size() == 0: break var ind: int = randi_range(0, available_base_attaches.size() - 1); var attach: Vector2 = available_base_attaches.pop_at(ind); var branch_image: Image = branch.texture.get_image() mature_image.blend_rect(branch_image, Rect2i(Vector2.ZERO, branch.texture.get_size()), attach) for branch_attach in branch.attaches: branch_attaches.append(branch_attach); branch_attach_parent.append(branch); assert(parts_to_place.size() <= branch_attaches.size() + base_part.attaches.size() - branch_parts.size()); for part: PlantPart in parts_to_place: var attach: Vector2; var parent_part: PlantPart; var chosen_attach_type: int = 0; var attachables: Array[int]; if part.base_attachable && available_base_attaches.size() > 0: attachables.append(1); if part.bottom_attachable && available_base_bottom_attach.size() > 0: attachables.append(2); if part.branch_attachable && branch_attaches.size() > 0: attachables.append(3); # assert(attachables.size() > 0); if attachables.size() == 0: continue chosen_attach_type = attachables.pick_random(); if chosen_attach_type == 1: # base attach var ind := randi_range(0, available_base_attaches.size() - 1); attach = available_base_attaches.pop_at(ind); parent_part = base_part; elif chosen_attach_type == 2: # bottom var ind := randi_range(0, available_base_bottom_attach.size() - 1); attach = available_base_bottom_attach.pop_at(ind); parent_part = base_part; elif chosen_attach_type == 3: # branch var ind := randi_range(0, branch_attaches.size() - 1); attach = branch_attaches.pop_at(ind); parent_part = branch_attach_parent.pop_at(ind); var part_image: Image = part.texture.get_image() mature_image.blend_rect(part_image, Rect2i(Vector2.ZERO, part.texture.get_size()), attach) if plant_data.random_seed % 2 == 0: mature_image.flip_x() mature_texture = ImageTexture.create_from_image(mature_image) return mature_texture PlantData.State.GROWING: return PLACEHOLDER_GROWING_TEXTURE _: return null