98 lines
4.4 KiB
GDScript
98 lines
4.4 KiB
GDScript
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 |