extends Area2D class_name Plant const PLANT_AREA_WIDTH = 10 const PLANT_SPRITE_SCALE = 0.15 const HARVESTED_SEED_POSITION_RANGE = 100 const RANDOM_MAX_GROW_INTERVAL = 0.4 const SPRITE_SCENE : PackedScene = preload("res://entities/plants/plant_sprite.tscn") enum State {PLANTED, GROWING, MATURE} @export var plant_type: PlantType @export var planet: Planet var state: State = State.PLANTED: set = change_state @export var day: int = 0 : set = set_day @onready var plant_sprite: PlantSprite = generate_sprite() @onready var collision_shape: CollisionShape2D = generate_collision_shape() func _init(_plant_type = null, _planet = null): plant_type = _plant_type planet = _planet func generate_sprite() -> PlantSprite: var spriteObject : PlantSprite = SPRITE_SCENE.instantiate() add_child(spriteObject) spriteObject.apply_texture_to_sprite( get_state_texture(state), false ) return spriteObject func generate_collision_shape() -> CollisionShape2D: var collision = CollisionShape2D.new() var shape = CircleShape2D.new() shape.radius = PLANT_AREA_WIDTH collision.shape = shape add_child(collision) return collision func pass_day(): await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout day += 1 func set_day(d): day = d if day == 0: change_state(State.PLANTED) if day > plant_type.growing_time: change_state(State.MATURE) else: change_state(State.GROWING) func change_state(_state: State): state = _state if state == State.MATURE and plant_type.mature_effect: plant_type.mature_effect.effect(self) plant_sprite.apply_texture_to_sprite( get_state_texture(state) ) func get_state_texture(s: State) -> Texture2D: match s: State.PLANTED: return plant_type.planted_texture State.GROWING: return plant_type.growing_texture State.MATURE: return plant_type.mature_texture return null func harvest(): if state == State.MATURE: var seed_number = plant_type.harvest_number.pick_random() for i in range(seed_number): var seed_plant_type : PlantType = plant_type if len(plant_type.harvest_types_path): seed_plant_type = load(plant_type.harvest_types_path.pick_random()) var item_object = planet.drop_item( Seed.new(seed_plant_type), global_position ) var tween : Tween = get_tree().create_tween() tween.tween_property( item_object, "position", Vector2( item_object.position.x + randi()%HARVESTED_SEED_POSITION_RANGE, item_object.position.y + randi()%HARVESTED_SEED_POSITION_RANGE ), 0.2 ) plant_sprite.start_harvest_animation() await plant_sprite.harvest_animation_finished queue_free()