119 lines
3.0 KiB
Plaintext
119 lines
3.0 KiB
Plaintext
[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"]
|