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