ajout du déblocage/évolutions des plantes (#89) et fix divers

This commit is contained in:
2025-11-07 13:26:04 +01:00
parent 11ae967845
commit ed675ed532
54 changed files with 901 additions and 483 deletions

View File

@@ -15,10 +15,6 @@ const LIFETIME_ICON = preload("res://common/icons/calendar-week.svg")
const SHOVEL_ICON = preload("res://common/icons/shovel.svg")
const GROWING_ICON = preload("res://common/icons/chevrons-up.svg")
const HARVEST_EFFECT_ICON = preload("res://common/icons/shovel.svg")
const MATURE_EFFECT_ICON = preload("res://common/icons/chevrons-up.svg")
const CYCLIC_EFFECT_ICON = preload("res://common/icons/rotate-rectangle.svg")
const SPRITE_SCENE : PackedScene = preload("res://entities/plants/plant_sprite.tscn")
enum State {PLANTED, GROWING, MATURE}
@@ -32,9 +28,6 @@ var state: State = State.PLANTED
@onready var collision_shape: CollisionShape2D
@onready var influence_zone : PlantInfluenceZone
var harvest_effects = []
var mature_effects = []
var cyclic_effects = []
var plant_score = 0
var plant_mutations : Array[PlantMutation] = []
@@ -44,9 +37,6 @@ func _init(
_day = 0,
):
plant_type = _plant_type
harvest_effects = plant_type.default_harvest_effects.duplicate_deep()
mature_effects = plant_type.default_mature_effects.duplicate_deep()
cyclic_effects = plant_type.default_cyclic_effects.duplicate_deep()
day = _day
@@ -96,8 +86,8 @@ func generate_influence_zone() -> PlantInfluenceZone:
func _pass_day():
await get_tree().create_timer(randf_range(0., RANDOM_MAX_GROW_INTERVAL)).timeout
if state == State.MATURE and len(cyclic_effects):
for effect in cyclic_effects:
if state == State.MATURE and len(plant_type.cyclic_effects):
for effect in plant_type.cyclic_effects:
effect.effect(self)
var old_state = state
@@ -106,9 +96,9 @@ func _pass_day():
update_plant()
if old_state != state and state == State.MATURE:
for effect in mature_effects:
for effect in plant_type.mature_effects:
if effect : effect.effect(self)
for effect in cyclic_effects:
for effect in plant_type.cyclic_effects:
if effect : effect.effect(self)
func update_plant(with_animation : bool = true):
@@ -137,7 +127,7 @@ func calculate_grow_time() -> int:
for m in plant_mutations:
mutated_grow_time = m.mutate_grow_time(self, mutated_grow_time)
return mutated_grow_time
return max(1, mutated_grow_time)
func change_state(_state: State, with_animation : bool = true):
if state != _state:
@@ -148,7 +138,7 @@ func change_state(_state: State, with_animation : bool = true):
func harvest():
if state == State.MATURE:
for effect in harvest_effects:
for effect in plant_type.harvest_effects:
if effect : effect.effect(self)
plant_sprite.start_harvest_animation()
@@ -203,39 +193,10 @@ func card_info() -> CardInfo:
for m in plant_mutations:
info.sections.append(m.card_section())
info.sections.append_array(card_effect_sections())
info.sections.append_array(PlantEffect.card_effect_sections(
plant_type.mature_effects,
plant_type.harvest_effects,
plant_type.cyclic_effects,
))
return info
func card_effect_sections() -> Array[CardSectionInfo]:
var sections : Array[CardSectionInfo] = []
var effects_category = [
mature_effects,
harvest_effects,
cyclic_effects
]
var effects_category_labels : Array[String] = [
"On mature",
"When harvested",
"Each day when mature",
]
var effects_category_icon : Array[Texture] = [
MATURE_EFFECT_ICON,
HARVEST_EFFECT_ICON,
CYCLIC_EFFECT_ICON,
]
for i in range(len(effects_category)):
var effects = effects_category[i]
if len(effects):
var section = CardSectionInfo.new(
effects_category_labels[i]
)
section.title_icon = effects_category_icon[i]
var effects_text : Array = effects.map(
func (e : PlantEffect): return "[b]%s[/b] %s" % [e.get_styled_effect_name() , e.get_effect_description()]
)
section.text = "\n".join(effects_text)
sections.append(section)
return sections
return info

View File

@@ -2,6 +2,10 @@
extends Resource
class_name PlantEffect
const HARVEST_EFFECT_ICON = preload("res://common/icons/shovel.svg")
const MATURE_EFFECT_ICON = preload("res://common/icons/chevrons-up.svg")
const CYCLIC_EFFECT_ICON = preload("res://common/icons/rotate-rectangle.svg")
@export var level : int
func _init(_level : int = 1):
@@ -15,7 +19,7 @@ func get_effect_description() -> String:
printerr("Classe abstraite PlantEffect appelée")
return ""
func effect(plant):
func effect(_plant):
printerr("Classe abstraite PlantEffect appelée")
func get_styled_effect_name():
@@ -31,4 +35,42 @@ func get_styled_effect_name():
if level == 1:
return levels_bbcode[0] % get_effect_name()
else :
return levels_bbcode[min(level - 1, len(levels_bbcode) - 1)] % [get_effect_name(), level]
return levels_bbcode[min(level - 1, len(levels_bbcode) - 1)] % [get_effect_name(), level]
static func card_effect_sections(
mature_effects : Array[PlantEffect],
harvest_effects : Array[PlantEffect],
cyclic_effects : Array[PlantEffect]
) -> Array[CardSectionInfo]:
var sections : Array[CardSectionInfo] = []
var effects_category = [
mature_effects,
harvest_effects,
cyclic_effects
]
var effects_category_labels : Array[String] = [
"On mature",
"When harvested",
"Each day when mature",
]
var effects_category_icon : Array[Texture] = [
MATURE_EFFECT_ICON,
HARVEST_EFFECT_ICON,
CYCLIC_EFFECT_ICON,
]
for i in range(len(effects_category)):
var effects = effects_category[i]
if len(effects) > 0:
var section = CardSectionInfo.new(
effects_category_labels[i]
)
section.title_icon = effects_category_icon[i]
var effects_text : Array = effects.map(
func (e : PlantEffect): return "[b]%s[/b] %s" % [e.get_styled_effect_name() , e.get_effect_description()]
)
section.text = "\n".join(effects_text)
sections.append(section)
return sections

View File

@@ -1,13 +1,6 @@
extends Resource
class_name PlantMutation
const BASE_RARITY_CHANCE : Array[float] = [
0.75,
0.9,
1,
1,
]
@export var level : int = 1
func _init(_level : int = 1):
@@ -78,21 +71,15 @@ static func get_rarity_color(rarity : int) -> Color:
return rarity_colors[min(rarity, len(rarity_colors) - 1)]
static func random_rarity() -> int:
var random_float = randf()
for i in range(len(BASE_RARITY_CHANCE) - 1):
if random_float < BASE_RARITY_CHANCE[i]:
return i
return len(BASE_RARITY_CHANCE) - 1
static func random_mutation(rarity = PlantMutation.random_rarity()) -> PlantMutation:
static func random_mutation(except_mutations : Array[PlantMutation] = []) -> PlantMutation:
var all_mutations = GameInfo.game_data.unlocked_plant_mutations.duplicate_deep()
all_mutations.shuffle()
for new_mutation in all_mutations:
var level_for_rarity = new_mutation.get_level_for_rarity(rarity)
if level_for_rarity >= 1:
new_mutation.level = level_for_rarity
return new_mutation
return null
all_mutations = all_mutations.filter(
func (f1 : PlantMutation):
return except_mutations.find_custom(
func (f2 : PlantMutation): return f2.get_mutation_name() == f1.get_mutation_name()
) == -1
)
if len(all_mutations):
return all_mutations.pick_random()
else :
return null

View File

@@ -11,6 +11,118 @@ class_name PlantType
@export var growing_texture : Texture
@export var mature_texture : Texture
@export var default_harvest_effects : Array[PlantEffect] = []
@export var default_mature_effects : Array[PlantEffect] = []
@export var default_cyclic_effects : Array[PlantEffect] = []
@export var harvest_effects : Array[PlantEffect] = []
@export var mature_effects : Array[PlantEffect] = []
@export var cyclic_effects : Array[PlantEffect] = []
func card_info() -> CardInfo:
var info = CardInfo.new(
name
)
info.important_stat_icon = Plant.PLANT_POINT_ICON
info.important_stat_text = "%d" % default_plant_score
info.texture = mature_texture
info.type_icon = Plant.PLANT_TYPE_ICON
info.stats.append(CardStatInfo.new(
"Grow in [b]%d[/b]" % default_growing_time,
Plant.GROWING_ICON
))
info.stats.append(CardStatInfo.new(
"[b]%d[/b] score when mature" % default_plant_score,
Plant.PLANT_POINT_ICON
))
info.sections.append_array(PlantEffect.card_effect_sections(
mature_effects,
harvest_effects,
cyclic_effects,
))
return info
func get_available_evolution() -> Array[Evolution]:
var evolutions : Array[Evolution] = [
ScoreEvolution.new(self)
]
if len(mature_effects) > 0:
evolutions.append(MatureEffectEvolution.new(self))
if len(harvest_effects) > 0:
evolutions.append(HarvestEffectEvolution.new(self))
if len(cyclic_effects) > 0:
evolutions.append(CyclicEffectEvolution.new(self))
return evolutions
class Evolution:
var level : int
var plant_type : PlantType
func _init(_type : PlantType, _l : int = 1):
plant_type = _type
level = _l
func get_title():
return ""
func get_description():
return ""
func evolve(_pt : PlantType = plant_type):
pass
class ScoreEvolution extends Evolution:
func get_title():
return "%s score evolution" % plant_type.name
func get_description():
return "Add [b]%s[/b] to the default score of the plant" % level
func evolve(pt : PlantType = plant_type):
pt.default_plant_score += level
class MatureEffectEvolution extends Evolution:
var effect_index : int
func _init(_type : PlantType, _l : int = 1):
plant_type = _type
level = _l
pick_effect()
func pick_effect():
effect_index = randi() % len(plant_type.mature_effects)
func get_effect(pt : PlantType = plant_type) -> PlantEffect:
return pt.mature_effects[effect_index]
func get_title():
return "%s %s evolution" % [plant_type.name, get_effect().get_effect_name()]
func get_description():
return "Upgrade the level of %s of %d" % [get_effect().get_effect_name(), level]
func evolve(pt : PlantType = plant_type):
get_effect(pt).level += level
class HarvestEffectEvolution extends MatureEffectEvolution:
func pick_effect():
effect_index = randi() % len(plant_type.harvest_effects)
func get_effect(pt : PlantType = plant_type) -> PlantEffect:
return pt.harvest_effects[effect_index]
class CyclicEffectEvolution extends MatureEffectEvolution:
func pick_effect():
effect_index = randi() % len(plant_type.harvest_effects)
func get_effect(pt : PlantType = plant_type) -> PlantEffect:
return pt.harvest_effects[effect_index]