[gd_scene load_steps=3 format=3 uid="uid://x4kv2y5f52cm"] [sub_resource type="GDScript" id="GDScript_x3g5o"] script/source = "class_name Plant extends Node2D enum PlantState { SAPLING, GROWN, DEAD} signal grown signal died @onready var growing_timer: Timer = $Growing @onready var sprite_node: AnimatedSprite2D = $AnimatedSprite2D @onready var need_checker: Timer = $NeedChecker const NEEDCHECKPERIOD := 1.0 var parameter: PlantType var state := PlantState.SAPLING var can_grow := true func init(plant_parameter: PlantType): parameter = plant_parameter sprite_node.sprite_frames = parameter.sprite_frames need_checker.start(NEEDCHECKPERIOD) func _on_need_checker_timeout() -> void: can_grow = check_terrain_viability() growing_timer.paused = not can_grow func check_terrain_viability() -> bool: var water := GameTerrain.get_stat(position, GameTerrain.Stats.WATER) if water < parameter.water_need[0] or water > parameter.water_need[1]: return false var fertility := GameTerrain.get_stat(position, GameTerrain.Stats.FERTILITY) if fertility < parameter.fertility_need[0] or fertility > parameter.fertility_need[1]: return false var presence := GameTerrain.get_stat(position, GameTerrain.Stats.PRESENCE) presence += GameTerrain.LEVELS_NUMBER / 2 if presence < parameter.presence_need[0] or parameter.presence_need[1]: return false return true func _on_growing_timeout() -> void: match state: PlantState.SAPLING: grow() PlantState.GROWN: die() PlantState.DEAD: push_error(\"Already dead\") func plant(new_position: Vector2): position = new_position state = PlantState.SAPLING growing_timer.start(parameter.growing_time) sprite_node.play(\"SAPLING\") func grow(): if state != PlantState.SAPLING: push_error(\"Tried to grow \" + parameter.type + \", but was not at sapling state\") return state = PlantState.GROWN growing_timer.start(parameter.dying_time) GameTerrain.modify_zone(position, parameter.distance_prod, GameTerrain.Stats.WATER, parameter.water_prod) GameTerrain.modify_zone(position, parameter.distance_prod, GameTerrain.Stats.FERTILITY, parameter.fertility_prod) GameTerrain.modify_zone(position, parameter.distance_prod, GameTerrain.Stats.PRESENCE, parameter.presence_prod) grown.emit() sprite_node.play(\"GROWN\") func die(): state = PlantState.DEAD died.emit() sprite_node.play(\"DEAD\") " [sub_resource type="SpriteFrames" id="SpriteFrames_667un"] animations = [{ "frames": [], "loop": true, "name": &"SEED", "speed": 5.0 }] [node name="Plant" type="Node2D"] script = SubResource("GDScript_x3g5o") [node name="Growing" type="Timer" parent="."] one_shot = true [node name="NeedChecker" type="Timer" parent="."] [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."] scale = Vector2(0.2, 0.2) sprite_frames = SubResource("SpriteFrames_667un") animation = &"SEED" [connection signal="timeout" from="Growing" to="." method="_on_growing_timeout"] [connection signal="timeout" from="NeedChecker" to="." method="_on_need_checker_timeout"]