66 lines
1.6 KiB
GDScript
66 lines
1.6 KiB
GDScript
extends Node2D
|
|
class_name Plant
|
|
|
|
const PLANT_AREA_WIDTH = 10
|
|
const PLANT_SPRITE_SCALE = 0.15
|
|
|
|
enum State {PLANTED, GROWING, MATURE}
|
|
|
|
var plant_type : PlantType
|
|
var planet : Planet
|
|
|
|
var state : State = State.PLANTED : set = change_state
|
|
var day : int = 0
|
|
|
|
@onready var plant_sprite : Sprite2D = generate_sprite()
|
|
@onready var plant_area : Area2D = generate_area()
|
|
|
|
func _init(_plant_type, _planet):
|
|
plant_type = _plant_type
|
|
planet = _planet
|
|
|
|
func generate_sprite() -> Sprite2D:
|
|
var sprite = Sprite2D.new()
|
|
|
|
add_child(sprite)
|
|
sprite.texture = get_state_texture(state)
|
|
sprite.scale = Vector2.ONE * PLANT_SPRITE_SCALE
|
|
sprite.offset
|
|
|
|
return sprite
|
|
|
|
func generate_area() -> Area2D:
|
|
var area = Area2D.new()
|
|
var collision = CollisionShape2D.new()
|
|
var collision_shape = CircleShape2D.new()
|
|
collision_shape.radius = PLANT_AREA_WIDTH
|
|
|
|
collision.shape = collision_shape
|
|
area.add_child(collision)
|
|
add_child(area)
|
|
|
|
return area
|
|
|
|
func pass_day():
|
|
day += 1
|
|
if day > plant_type.growing_time:
|
|
change_state(State.MATURE)
|
|
else:
|
|
change_state(State.GROWING)
|
|
|
|
func change_state(_state : State):
|
|
state = _state
|
|
plant_sprite.texture = get_state_texture(state)
|
|
|
|
if state == State.MATURE and plant_type.mature_effect:
|
|
plant_type.mature_effect.effect(self)
|
|
|
|
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 |