LD54/src/Plant.gd

151 lines
4.9 KiB
GDScript3

extends Node2D
const FadingText = preload("res://src/ui/FadingText.tscn")
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
enum STAGE {SEED, SPROUT, GROWTH, FRUIT, RIPE}
const default_sprites = [
preload("res://assets/seeds.png"),
preload("res://assets/sprouts.png"),
preload("res://assets/plant.png"),
preload("res://assets/plant.png"),
preload("res://assets/plant.png"),
preload("res://assets/plant.png")
]
var sprites = []
var icon = preload("res://assets/hex.png")
var icon_tooltip = "Plaaaant me"
var description = "A plant"
# run time
var growth = 0
var height = 0
# per-type stats
# each stat contributes to growth during each section of the day
# there are 4 sections to the day, and 4 growing periods
var light_range = [15, 85] # below x too shady, above y too sunny
var growth_mod_by_light = [2, 10, -1] # shady, ok, sunny
var rockiness_range = [5, 50]
var growth_mod_by_rockiness = [-1, 10, -5]
var nutrient_range = [10, 100]
var growth_mod_by_nutrition = [0, 10, 15]
var soil_health_range = [25, 75]
var growth_mod_by_soil_health = [0, 5, 10]
var base_score = 100
var score_mod_by_growth = [0.0, 0.0, 0.0, 0.1, 1.2, 1.5]
var growth_thresholds = [100, 175, 250, 300, 400] # for each stage above
var heights = [0, 0, 1, 1, 1, 1]
var plantable = true
var survives_winter = false
var season_rockiness_mod = 0
var season_nutrient_mod = -10
var season_health_mod = -5
var harvest_nutrient_mod = 5
var harvest_health_mod = 5
var harvest_rockiness_mod = 5
# @TODO adjacency effects
static func find_by_range_area(value, ranges, mods):
var v = 0
for x in ranges:
if value > x:
v += 1
continue
break
if v >= mods.size():
v = mods.size()-1
return mods[v]
# Called when the node enters the scene tree for the first time.
func _ready():
get_node("Sprite").set_texture(self.sprites[self.get_stage()])
func get_description():
var s = "%s\n\n" % self.description
s += "Base score: %d\nScore mods by growth stage: %s\n\n" % [self.base_score, self.score_mod_by_growth]
s += "At the end of each season\n\tRockiness: %d\n\tSoil health: %d\n\tSoil nutrients: %d\n\n" %[self.season_rockiness_mod, self.season_health_mod, self.season_nutrient_mod]
s += "When harvested:\n\tRockiness: %d\n\tSoil health: %d\n\tSoil nutrients: %d\n" %[self.harvest_rockiness_mod, self.harvest_health_mod, self.harvest_nutrient_mod]
return s
func _init():
self.sprites.resize(self.default_sprites.size())
for x in range(self.default_sprites.size()):
if self.sprites[x] == null:
self.sprites[x] = self.default_sprites[x]
func query_details():
var stage = self.get_stage()
var next = "N/A"
if stage < self.growth_thresholds.size():
next = str(self.growth_thresholds[stage])
var s = "Growth: %d\nHeight: %d\nNext stage at: %s\n\n" % [self.growth, self.height, next]
return s
func get_stage():
var stage = 0
for x in self.growth_thresholds:
if self.growth >= x:
stage += 1
else:
break
return stage
func get_icon_tooltip():
return self.icon_tooltip
func apply_light(light, soil):
var growth_light = self.find_by_range_area(light, self.light_range, self.growth_mod_by_light)
var growth_rockiness = self.find_by_range_area(soil.rockiness, self.rockiness_range, self.growth_mod_by_rockiness)
var growth_health = self.find_by_range_area(soil.misc_health, self.soil_health_range, self.growth_mod_by_soil_health)
var growth_nutrients = self.find_by_range_area(soil.nutrients, self.nutrient_range, self.growth_mod_by_nutrition)
var growth = growth_light + growth_rockiness + growth_health + growth_nutrients
#print("Grew %d = %d + %d + %d + %d" %[growth, growth_light, growth_rockiness, growth_health, growth_nutrients])
self.grow(growth)
func grow(value):
var index = self.get_stage()
if index >= self.heights.size():
index = self.heights.size() - 1
self.growth += value
self.height = self.heights[index]
get_node("Height").set_text(str(self.height))
get_node("Sprite").set_texture(self.sprites[index])
var t = FadingText.instance()
t.set_position(Vector2(32, -24))
t.move_towards = Vector2(50, -60)
t.set_text("%+d🌱🌱" % value)
t.set_modulate(Color(0.1, 0.85, 0.1))
t.set_scale(Vector2(1.5, 1.5))
add_child(t)
func get_score():
var mod = self.find_by_range_area(self.growth, self.growth_thresholds, self.score_mod_by_growth)
var score = int(round(float(self.base_score) * mod))
return score
func use_nutrients_and_run_plant_effects(soil, old_season, new_season, grid):
print("plant use nitrients ", self)
soil.update_stat("rockiness", self.season_rockiness_mod)
soil.update_stat("nutrients", self.season_nutrient_mod)
soil.update_stat("health", self.season_health_mod)
func end_of_year(soil, grid):
soil.update_stat("nutrients", self.harvest_nutrient_mod)
soil.update_stat("health", self.harvest_health_mod)
if not self.survives_winter:
soil.update_stat("rockiness", self.harvest_rockiness_mod)
self.queue_free()
soil.stored = null
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass