Files
seeding-planets/entities/plants/scripts/plant.gd
2026-02-24 14:42:24 +01:00

170 lines
4.4 KiB
GDScript

extends InspectableEntity
class_name Plant
const PLANT_AREA_RADIUS = 20
const PLANT_INFLUENCE_RADIUS = 100
const HARVESTED_SEED_DISPLACEMENT_FACTOR = 100
const RANDOM_MAX_GROW_INTERVAL = Region.MIN_PASS_DAY_ANIMATION_TIME/2. - 0.1
const PLANT_TYPE_ICON = preload("res://common/icons/seedling.svg")
const PLANT_POINT_ICON = preload("res://common/icons/growth.svg")
const LIFETIME_ICON = preload("res://common/icons/calendar-week.svg")
const SHOVEL_ICON = preload("res://common/icons/shovel.svg")
const GROWING_ICON = preload("res://common/icons/chevrons-up.svg")
const DEATH_ICON = preload("res://common/icons/skull.svg")
const SPRITE_SCENE : PackedScene = preload("res://entities/plants/plant_sprite.tscn")
@export var data : PlantData
@onready var plant_sprite: PlantSprite
@onready var collision_shape: CollisionShape2D
@onready var influence_zone : PlantInfluenceZone
var harvested = false
func _init(
_data : PlantData
):
data = _data
func _ready():
plant_sprite = generate_sprite()
collision_shape = generate_collision_shape()
influence_zone = generate_influence_zone()
plant_sprite.setup_plant_sprite(data)
func pointer_text() -> String:
return data.plant_name
func inspect(is_inspected : bool = true):
plant_sprite.modulate = MODULATE_INSPECTED_COLOR if is_inspected else default_modulate
influence_zone.show_influence = is_inspected
func affect_preview(is_affected : bool = true):
plant_sprite.modulate = MODULATE_AFFECTED_COLOR if is_affected else default_modulate
func generate_sprite() -> PlantSprite:
var sprite_object : PlantSprite = SPRITE_SCENE.instantiate()
add_child(sprite_object)
# sprite_object.generate_mutation_effects(self)
return sprite_object
func generate_collision_shape() -> CollisionShape2D:
var collision = CollisionShape2D.new()
var shape = CircleShape2D.new()
shape.radius = PLANT_AREA_RADIUS
collision.shape = shape
add_child(collision)
return collision
func generate_influence_zone() -> PlantInfluenceZone:
var zone = PlantInfluenceZone.new(PLANT_INFLUENCE_RADIUS)
add_child(zone)
return zone
# Méthode déclenchée par la classe region
func _pass_day():
await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout
var last_state = data.get_state()
data.day += 1
for m in data.mutations:
m._start_day_effect(self)
match data.get_state():
PlantData.State.MATURE:
if last_state != PlantData.State.MATURE:
mature()
PlantData.State.DEAD:
die()
plant_sprite.update_plant_sprite(data, last_state != data.get_state())
func calculate_plant_score(
with_state : PlantData.State = data.get_state()
) -> int:
return data.get_score(with_state)
func harvest():
for i in range(data.get_random_seed_income()):
produce_seed()
if data.get_state() == PlantData.State.MATURE:
for m in data.mutations:
m._start_harvested_effect(self)
harvested = true
plant_sprite.start_harvest_animation()
await plant_sprite.harvest_animation_finished
disappear()
func produce_seed():
region.drop_item(
Seed.generate_from_parent(data),
global_position,
HARVESTED_SEED_DISPLACEMENT_FACTOR,
)
func mature():
for m in data.mutations:
m._start_maturation_effect(self)
func die():
for m in data.mutations:
m._start_dead_effect(self)
for i in range(data.get_random_seed_income()):
produce_seed()
disappear()
func disappear():
data.disappear()
queue_free()
func save() -> EntityData:
return data
func card_info() -> CardInfo:
var info = CardInfo.new(
data.plant_name,
data.archetype.archetype_name
)
info.important_stat_icon = PLANT_POINT_ICON
info.important_stat_text = "%d" % calculate_plant_score()
info.type_icon = PLANT_TYPE_ICON
info.stats.append_array([
CardStatInfo.new(
str(data.day),
LIFETIME_ICON
),
CardStatInfo.new(
str(data.get_growing_time()),
GROWING_ICON
),
CardStatInfo.new(
str(data.get_lifetime()),
DEATH_ICON
),
])
if len(data.mutations) != 0:
for m in data.mutations:
info.sections.append(m.card_section())
return info