151 lines
4.9 KiB
GDScript3
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
|