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 func _init( _data : PlantData ): data = _data func _ready(): plant_sprite = generate_sprite() collision_shape = generate_collision_shape() influence_zone = generate_influence_zone() plant_sprite.update_plant_sprite(data, false) 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) 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) disappear() func disappear(): data.disappear() queue_free() func save() -> EntityData: return data func card_info() -> CardInfo: var info = CardInfo.new( pointer_text() ) var state = data.get_state() info.important_stat_icon = PLANT_POINT_ICON info.important_stat_text = "%d" % calculate_plant_score() info.texture = null #TODO info.type_icon = PLANT_TYPE_ICON var state_text = tr("MATURE") if state != PlantData.State.MATURE: state_text = tr("GROWING") info.stats.append(CardStatInfo.new( tr("DAY_%d") % data.day, LIFETIME_ICON )) info.stats.append(CardStatInfo.new( state_text, PLANT_TYPE_ICON )) if state != PlantData.State.MATURE: info.stats.append(CardStatInfo.new( tr("MATURE_ON_DAY_%d") % data.get_growing_time(), GROWING_ICON )) info.stats.append(CardStatInfo.new( tr("%d_SCORE_WHEN_MATURE") % data.get_score(PlantData.State.MATURE), PLANT_POINT_ICON )) info.stats.append(CardStatInfo.new( tr("DIE_ON_DAY_%d") % (data.get_lifetime()), DEATH_ICON )) if len(data.mutations) != 0: var rarest : int = data.mutations.map( func(m : PlantMutation) : return m.get_rarity() ).max() info.bg_color = PlantMutation.get_rarity_color(rarest) for m in data.mutations: info.sections.append(m.card_section()) return info