extends Area2D class_name PlantSprite const PLANTED_SEED_CROP_WIDTH = 50 const PLANTED_SEED_POS_Y = 0 const PARTICLES_SCENE: PackedScene = preload("res://common/vfx/particles/effect_particles.tscn") const ABOUT_TO_DYE_COLOR := Color("#fca67e") const ABOUT_TO_DYE_PERIOD := 1.0 signal harvest_animation_finished var last_updated_on_state: PlantData.State = PlantData.State.MATURE var stored_seed_image: Texture = null var display_lifetime_sprite: bool = false: set = set_display_lifetime_sprite var sprite_modulate: Color = Color.WHITE: set = set_sprite_modulate var about_to_dye_tween: Tween var target_modulate_color := Color.WHITE func setup_plant_sprite(plant_data: PlantData): set_display_lifetime_sprite() %PlantedSeed.texture = PlantTextureBuilder.build_seed_texture(plant_data.plant_name.hash()) update_plant_sprite(plant_data, true) func update_plant_sprite(plant_data: PlantData, with_animation = false): if with_animation: %AnimationPlayer.play("bump") await %AnimationPlayer.animation_finished %Sprite.flip_h = true if plant_data.random_seed % 2 == 0 else false %Sprite.texture = PlantTextureBuilder.build_plant_texture(plant_data) %PlantedSeed.visible = plant_data.get_state() == PlantData.State.PLANTED %LifetimeProgressBar.value = 100 * (float(plant_data.day) / plant_data.get_lifetime()) # %PlantedSeed.region_rect = Rect2( # 0, # PLANTED_SEED_POS_Y, # %PlantedSeed.texture.get_width(), # %PlantedSeed.texture.texture.get_height() - PLANTED_SEED_CROP_WIDTH + -1 * PLANTED_SEED_POS_Y, # ) func generate_mutation_effects(plant: Plant): for m in plant.data.mutations: var particles_emitter: EffectParticles = PARTICLES_SCENE.instantiate() as EffectParticles particles_emitter.setup_particles( EffectParticles.Parameters.new( m.get_icon(), PlantMutation.get_rarity_color(m.get_rarity()) ) ) add_child(particles_emitter) func start_harvest_animation(): $AnimationPlayer.play("harvest") await $AnimationPlayer.animation_finished harvest_animation_finished.emit() func set_display_lifetime_sprite(d := display_lifetime_sprite): display_lifetime_sprite = d # if is_node_ready(): # %LifeTimeSprite.visible = d func set_sprite_modulate(c := sprite_modulate): sprite_modulate = c if is_node_ready(): %Sprite.modulate = c func affect_preview(is_affected: bool = true): set_modulate_color(InspectableEntity.MODULATE_AFFECTED_COLOR if is_affected else Color.WHITE, true) func _on_body_entered(body: Node2D) -> void: if body is Player && $AnimationPlayer.current_animation != "player_move": $AnimationPlayer.play("player_move"); func play_bump_animation(): %AnimationPlayer.play("bump") await %AnimationPlayer.animation_finished func set_modulate_color(color: Color, pause_about_to_dye: bool): target_modulate_color = color if about_to_dye_tween: if pause_about_to_dye and about_to_dye_tween.is_running(): about_to_dye_tween.pause() modulate = target_modulate_color elif not pause_about_to_dye and not about_to_dye_tween.is_running(): about_to_dye_tween.play() elif is_node_ready(): %Sprite.modulate = target_modulate_color func apply_about_to_dye_effect(): if not about_to_dye_tween: about_to_dye_tween = create_tween() about_to_dye_tween.tween_property(%Sprite, "modulate:r", ABOUT_TO_DYE_COLOR.r, ABOUT_TO_DYE_PERIOD).from(target_modulate_color.r) about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:g", ABOUT_TO_DYE_COLOR.g, ABOUT_TO_DYE_PERIOD).from(target_modulate_color.g) about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:b", ABOUT_TO_DYE_COLOR.b, ABOUT_TO_DYE_PERIOD).from(target_modulate_color.b) about_to_dye_tween.tween_property(%Sprite, "modulate:r", target_modulate_color.r, ABOUT_TO_DYE_PERIOD).from(ABOUT_TO_DYE_COLOR.r) about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:g", target_modulate_color.g, ABOUT_TO_DYE_PERIOD).from(ABOUT_TO_DYE_COLOR.g) about_to_dye_tween.parallel().tween_property(%Sprite, "modulate:b", target_modulate_color.b, ABOUT_TO_DYE_PERIOD).from(ABOUT_TO_DYE_COLOR.b) about_to_dye_tween.set_loops()