diff --git a/addons/godotsteam/win64/~libgodotsteam.windows.template_debug.x86_64.dll b/addons/godotsteam/win64/~libgodotsteam.windows.template_debug.x86_64.dll new file mode 100644 index 0000000..0812259 Binary files /dev/null and b/addons/godotsteam/win64/~libgodotsteam.windows.template_debug.x86_64.dll differ diff --git a/common/game_data/scripts/progression_data.gd b/common/game_data/scripts/progression_data.gd index 45db3bb..0451124 100644 --- a/common/game_data/scripts/progression_data.gd +++ b/common/game_data/scripts/progression_data.gd @@ -38,6 +38,11 @@ func get_all_mutations() -> Array[PlantMutation]: GenerousMutation.new(), ProtectiveMutation.new(), PureMutation.new(), + CleaningMutation.new(), + ErmitMutation.new(), + TropicalMutation.new(), + RhizomeMutation.new(), + SpontaneousMutation.new() ] func get_all_artifacts() -> Array[Artefact]: diff --git a/common/icons/bug.svg b/common/icons/bug.svg new file mode 100644 index 0000000..0ca8fd3 --- /dev/null +++ b/common/icons/bug.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/common/icons/bug.svg.import b/common/icons/bug.svg.import new file mode 100644 index 0000000..996f628 --- /dev/null +++ b/common/icons/bug.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ceoxyc8lxuqet" +path="res://.godot/imported/bug.svg-30d611f322c5908f7609c3e1222553c7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://common/icons/bug.svg" +dest_files=["res://.godot/imported/bug.svg-30d611f322c5908f7609c3e1222553c7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/common/icons/christmas-tree.svg b/common/icons/christmas-tree.svg new file mode 100644 index 0000000..52140a9 --- /dev/null +++ b/common/icons/christmas-tree.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/common/icons/christmas-tree.svg.import b/common/icons/christmas-tree.svg.import new file mode 100644 index 0000000..916745e --- /dev/null +++ b/common/icons/christmas-tree.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dofqju0k1nguf" +path="res://.godot/imported/christmas-tree.svg-2d675a899996dc14dfea64e4ba2ac385.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://common/icons/christmas-tree.svg" +dest_files=["res://.godot/imported/christmas-tree.svg-2d675a899996dc14dfea64e4ba2ac385.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/common/icons/cloud-rain.svg b/common/icons/cloud-rain.svg index 0ee9f28..9ed1f69 100644 --- a/common/icons/cloud-rain.svg +++ b/common/icons/cloud-rain.svg @@ -1 +1,31 @@ - \ No newline at end of file + + + + + + + diff --git a/common/icons/leaf.svg b/common/icons/leaf.svg new file mode 100644 index 0000000..319c9cf --- /dev/null +++ b/common/icons/leaf.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/common/icons/leaf.svg.import b/common/icons/leaf.svg.import new file mode 100644 index 0000000..8c8f86f --- /dev/null +++ b/common/icons/leaf.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://koow6s66cvqk" +path="res://.godot/imported/leaf.svg-64997ac177eb77fe732afcb627c1b7f7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://common/icons/leaf.svg" +dest_files=["res://.godot/imported/leaf.svg-64997ac177eb77fe732afcb627c1b7f7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/common/icons/sparkles.svg b/common/icons/sparkles.svg new file mode 100644 index 0000000..60c379d --- /dev/null +++ b/common/icons/sparkles.svg @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/common/icons/sparkles.svg.import b/common/icons/sparkles.svg.import new file mode 100644 index 0000000..d4e351e --- /dev/null +++ b/common/icons/sparkles.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djq2l8aun82ou" +path="res://.godot/imported/sparkles.svg-916e1088ab60f75f5f1370971c1faf2d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://common/icons/sparkles.svg" +dest_files=["res://.godot/imported/sparkles.svg-916e1088ab60f75f5f1370971c1faf2d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/entities/plants/scripts/plant.gd b/entities/plants/scripts/plant.gd index 4d11334..a007366 100644 --- a/entities/plants/scripts/plant.gd +++ b/entities/plants/scripts/plant.gd @@ -125,7 +125,8 @@ func calculate_plant_score( func harvest(): var do_produce_seeds := true for m in data.mutations: - do_produce_seeds = do_produce_seeds && m.produce_seeds() + if m.nullify_seed_production(): + do_produce_seeds = false if do_produce_seeds: for i in range(data.get_seed_number()): @@ -156,13 +157,14 @@ func mature(): func die(): for m in data.mutations: m._start_dead_effect(self) - + var do_produce_seeds := true for m in data.mutations: - do_produce_seeds = do_produce_seeds && m.produce_seeds_on_maturation() + if m.nullify_seed_production(): + do_produce_seeds = false if do_produce_seeds: - for i in range(data.get_seed_number()): + for i in range(data.get_seed_number(data.get_state())): await produce_seed() AudioManager.play_sfx("Harvest") diff --git a/entities/plants/scripts/plant_data.gd b/entities/plants/scripts/plant_data.gd index c20e4fa..bd9a847 100644 --- a/entities/plants/scripts/plant_data.gd +++ b/entities/plants/scripts/plant_data.gd @@ -70,6 +70,10 @@ func get_growing_time() -> int: return max(1,growing_time) func get_score(state: State = get_state()) -> int: + for m in mutations: + if m.nullify_score(self): + return 0 + var score = get_plant_info().get_base_score() if state == State.MATURE else 0 var mult := 1. diff --git a/entities/plants/scripts/plant_mutation.gd b/entities/plants/scripts/plant_mutation.gd index c71ebf6..817d944 100644 --- a/entities/plants/scripts/plant_mutation.gd +++ b/entities/plants/scripts/plant_mutation.gd @@ -28,8 +28,8 @@ func get_mutation_name() -> String: func mutate_plant_data(_plant_data: PlantData): pass -func has_score(_plant_data: PlantData) -> bool: - return true +func nullify_score(_plant_data: PlantData) -> bool: + return false func mutate_score(_plant_data: PlantData, score: int) -> int: return score @@ -43,8 +43,8 @@ func mutate_lifetime(_plant_data: PlantData, lifetime: int) -> int: func mutate_growing_time(_plant_data: PlantData, growing_time: int) -> int: return growing_time -func produce_seeds() -> bool: - return true +func nullify_seed_production() -> bool: + return false func mutate_seed_number(_plant_data: PlantData, seed_number: int) -> int: return seed_number @@ -82,6 +82,9 @@ func get_level_for_rarity(rarity: int) -> int: func get_rarity() -> int: return get_base_rarity() + level - 1 +func is_max_level() -> bool: + return get_base_rarity() + level < MAX_RARITY + func card_info() -> CardInfo: var info = CardInfo.new( get_mutation_name(), diff --git a/entities/plants/scripts/plant_mutation/cleaning_mutation.gd b/entities/plants/scripts/plant_mutation/cleaning_mutation.gd index 9ccfac9..d7872f9 100644 --- a/entities/plants/scripts/plant_mutation/cleaning_mutation.gd +++ b/entities/plants/scripts/plant_mutation/cleaning_mutation.gd @@ -2,7 +2,7 @@ extends PlantMutation class_name CleaningMutation func get_icon() -> Texture: - return preload("res://common/icons/alert-triangle.svg") + return preload("res://common/icons/bug.svg") func get_mutation_id() -> String: return "CLEANING" @@ -22,4 +22,4 @@ func _start_dead_effect(plant: Plant): )) func get_purification_radius() -> int: - return level + 1 # one more than purification + return level * 2 diff --git a/entities/plants/scripts/plant_mutation/cutting_mutation.sd.gd b/entities/plants/scripts/plant_mutation/cutting_mutation.sd.gd index 6299b61..5e005d9 100644 --- a/entities/plants/scripts/plant_mutation/cutting_mutation.sd.gd +++ b/entities/plants/scripts/plant_mutation/cutting_mutation.sd.gd @@ -20,10 +20,12 @@ func get_mutation_description() -> String: func _start_day_effect(plant: Plant): var cut_left := get_cutable_per_day() - for p in plant.data.nearby_plants: - if cut_left > 0 && p.is_mature(): - p.harvest() - cut_left -= 1 + + # Ne fonctionnera pas, nearby plants c'est des plantData donc on peut pas faire d'action dessus + # for p in plant.data.nearby_plants: + # if cut_left > 0 && p.is_mature(): + # p.harvest() + # cut_left -= 1 func get_cutable_per_day() -> int: return level diff --git a/entities/plants/scripts/plant_mutation/energizing_mutation.gd b/entities/plants/scripts/plant_mutation/energizing_mutation.gd deleted file mode 100644 index ba14194..0000000 --- a/entities/plants/scripts/plant_mutation/energizing_mutation.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends PlantMutation -class_name EnergizingMutation - -func get_icon() -> Texture: - return preload("res://common/icons/alert-triangle.svg") - -func get_base_rarity() -> int: - return 1 - -func get_mutation_id() -> String: - return "ENERGIZING" - -func get_mutation_name() -> String: - return tr("ENERGIZING") - -func get_mutation_description() -> String: - return tr("ENERGIZING_EFFECT_TEXT").format({ - "bonus_energy": get_bonus_energy() - }) - -func _start_dead_effect(plant: Plant): - plant.region.player.data.energy += get_bonus_energy() - -func get_bonus_energy() -> int: - return level diff --git a/entities/plants/scripts/plant_mutation/energizing_mutation.gd.uid b/entities/plants/scripts/plant_mutation/energizing_mutation.gd.uid deleted file mode 100644 index 8a09109..0000000 --- a/entities/plants/scripts/plant_mutation/energizing_mutation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://byj1hq1w42i7 diff --git a/entities/plants/scripts/plant_mutation/ermit_mutation.gd b/entities/plants/scripts/plant_mutation/ermit_mutation.gd index fe39683..a5d545d 100644 --- a/entities/plants/scripts/plant_mutation/ermit_mutation.gd +++ b/entities/plants/scripts/plant_mutation/ermit_mutation.gd @@ -2,26 +2,27 @@ extends PlantMutation class_name ErmitMutation func get_icon() -> Texture: - return preload("res://common/icons/alert-triangle.svg") + return preload("res://common/icons/christmas-tree.svg") func get_mutation_id() -> String: - return "ERMIT" + return "HERMIT" func get_mutation_name() -> String: - return tr("ERMIT") + return tr("HERMIT") func get_mutation_description() -> String: - return tr("ERMIT_EFFECT_TEXT").format( + return tr("HERMIT_EFFECT_TEXT").format( { - "score_increase": get_score_increase(), + "score_icon": Text.bbcode_icon(Plant.SCORE_ICON), + "score_multiplier": get_score_multiplier() + 1.0, } ) -func has_score(plant_data: PlantData) -> bool: - return false if plant_data.nearby_plants.size() > 0 else true +func nullify_score(plant_data: PlantData) -> bool: + return true if len(plant_data.nearby_plants) > 0 else false -func mutate_score(plant_data: PlantData, score: int) -> int: - return score + get_score_increase() if plant_data.nearby_plants.size() == 0 else 0 +func mutate_score_multiplier(_plant_data: PlantData, multiplier: float) -> float: + return multiplier + get_score_multiplier() -func get_score_increase(): - return 2 * level +func get_score_multiplier()->float: + return level diff --git a/entities/plants/scripts/plant_mutation/generous_mutation.gd b/entities/plants/scripts/plant_mutation/generous_mutation.gd index 37007bf..78387bc 100644 --- a/entities/plants/scripts/plant_mutation/generous_mutation.gd +++ b/entities/plants/scripts/plant_mutation/generous_mutation.gd @@ -16,8 +16,8 @@ func get_mutation_description() -> String: "score_icon": Text.bbcode_icon(Plant.SCORE_ICON) }) -func mutate_score_multiplier(_pd: PlantData, _m: float) -> float: - return 0 +func nullify_score(_plant_data: PlantData) -> bool: + return true func mutate_score_buff(plant_data: PlantData, score_buff : int) -> int: if plant_data.get_state() == PlantData.State.MATURE: diff --git a/entities/plants/scripts/plant_mutation/humide_mutation.gd.uid b/entities/plants/scripts/plant_mutation/humide_mutation.gd.uid deleted file mode 100644 index b0503ac..0000000 --- a/entities/plants/scripts/plant_mutation/humide_mutation.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://beualsis6xc8a diff --git a/entities/plants/scripts/plant_mutation/purification_mutation.gd b/entities/plants/scripts/plant_mutation/purification_mutation.gd index 7845359..bedf091 100644 --- a/entities/plants/scripts/plant_mutation/purification_mutation.gd +++ b/entities/plants/scripts/plant_mutation/purification_mutation.gd @@ -2,7 +2,7 @@ extends PlantMutation class_name PurificationMutation func get_icon() -> Texture: - return preload("res://common/icons/droplet.svg") + return preload("res://common/icons/leaf.svg") func get_mutation_id() -> String: return "PURIFICATION" diff --git a/entities/plants/scripts/plant_mutation/rhizome_mutation.gd b/entities/plants/scripts/plant_mutation/rhizome_mutation.gd index 9d03f69..0e97e5a 100644 --- a/entities/plants/scripts/plant_mutation/rhizome_mutation.gd +++ b/entities/plants/scripts/plant_mutation/rhizome_mutation.gd @@ -1,8 +1,10 @@ extends PlantMutation class_name RhizomeMutation +const DIG_PARTICLES := preload("res://entities/player/inventory/scripts/items/utils/dig_particles.tscn") + func get_icon() -> Texture: - return preload("res://common/icons/alert-triangle.svg") + return preload("res://common/icons/pick.svg") func get_mutation_id() -> String: return "RHIZOME" @@ -16,7 +18,17 @@ func get_mutation_description() -> String: }) func _start_maturation_effect(plant: Plant): - plant.region.dig_hole(plant.global_position, get_digging_radius()) + plant.region.dig_rocks( + Math.get_tiles_in_circle( + plant.global_position, + get_digging_radius() * (Region.TILE_SIZE + Region.TILE_SIZE / 2.) + ) + ) + + var particles := (DIG_PARTICLES.instantiate() as DigParticleEmmitter) + plant.region.add_child(particles) + particles.global_position = plant.get_global_position() + particles.emit() func get_digging_radius() -> int: return level diff --git a/entities/plants/scripts/plant_mutation/solar_mutation.gd b/entities/plants/scripts/plant_mutation/solar_mutation.gd index 5454716..0a6cf89 100644 --- a/entities/plants/scripts/plant_mutation/solar_mutation.gd +++ b/entities/plants/scripts/plant_mutation/solar_mutation.gd @@ -1,6 +1,8 @@ extends PlantMutation class_name SolarMutation +# Du coup on va probablement pas la mettre celle là + func get_icon() -> Texture: return preload("res://common/icons/alert-triangle.svg") diff --git a/entities/plants/scripts/plant_mutation/spontaneous_mutation.gd b/entities/plants/scripts/plant_mutation/spontaneous_mutation.gd index a9293f0..aaeb0e3 100644 --- a/entities/plants/scripts/plant_mutation/spontaneous_mutation.gd +++ b/entities/plants/scripts/plant_mutation/spontaneous_mutation.gd @@ -2,10 +2,13 @@ extends PlantMutation class_name SpontaneousMutation func get_icon() -> Texture: - return preload("res://common/icons/droplet.svg") + return preload("res://common/icons/sparkles.svg") func get_base_rarity() -> int: - return 1 + return 0 + +func is_max_level() -> bool: + return true func get_mutation_id() -> String: return "SPONTANEOUS" @@ -14,19 +17,12 @@ func get_mutation_name() -> String: return tr("SPONTANEOUS") func get_mutation_description() -> String: - return tr("SPONTANEOUS_EFFECT_TEXT").format({ - "bonus_seed": get_bonus_seed() - }) + return tr("SPONTANEOUS_EFFECT_TEXT") -func produce_seeds() -> bool: - return false - -func mutate_seed_number(_plant_data: PlantData, seed_number: int) -> int: - return seed_number + get_bonus_seed() +func nullify_seed_production() -> bool: + return true func _start_maturation_effect(plant: Plant): for i in range(plant.data.get_seed_number()): await plant.produce_seed() -func get_bonus_seed() -> int: - return level - 1 diff --git a/entities/plants/scripts/plant_mutation/humide_mutation.gd b/entities/plants/scripts/plant_mutation/tropical_mutation.gd similarity index 75% rename from entities/plants/scripts/plant_mutation/humide_mutation.gd rename to entities/plants/scripts/plant_mutation/tropical_mutation.gd index 814005b..8bd5a3e 100644 --- a/entities/plants/scripts/plant_mutation/humide_mutation.gd +++ b/entities/plants/scripts/plant_mutation/tropical_mutation.gd @@ -1,17 +1,17 @@ extends PlantMutation -class_name HumideMutation +class_name TropicalMutation func get_icon() -> Texture: - return preload("res://common/icons/shield.svg") + return preload("res://common/icons/cloud-rain.svg") func get_mutation_id() -> String: - return "HUMIDE" + return "TROPICAL" func get_mutation_name() -> String: - return tr("HUMIDE") + return tr("TROPICAL") func get_mutation_description() -> String: - return tr("HUMIDE_EFFECT_TEXT").format({ + return tr("TROPICAL_EFFECT_TEXT").format({ "score_icon": Text.bbcode_icon(Plant.SCORE_ICON), "score_multiplier": get_score_multiplier() + 1., }) diff --git a/entities/plants/scripts/plant_mutation/tropical_mutation.gd.uid b/entities/plants/scripts/plant_mutation/tropical_mutation.gd.uid new file mode 100644 index 0000000..84aa524 --- /dev/null +++ b/entities/plants/scripts/plant_mutation/tropical_mutation.gd.uid @@ -0,0 +1 @@ +uid://c4ruhg7wg2kta diff --git a/entities/player/inventory/scripts/items/seed.gd b/entities/player/inventory/scripts/items/seed.gd index 1efe383..7973d32 100644 --- a/entities/player/inventory/scripts/items/seed.gd +++ b/entities/player/inventory/scripts/items/seed.gd @@ -180,20 +180,24 @@ static func generate_first_mutations(rarity := 0) -> Array[PlantMutation]: var possible_mutation : PlantMutation = GameInfo.game_data.progression_data.get_available_mutations().filter( func (m : PlantMutation): return m.get_base_rarity() <= rarity - ).pick_random().duplicate_deep() + ).pick_random() + + if possible_mutation: + possible_mutation = possible_mutation.duplicate_deep() - var level_to_add = rarity - possible_mutation.get_base_rarity() + var level_to_add = rarity - possible_mutation.get_base_rarity() - possible_mutation.level += level_to_add + possible_mutation.level += level_to_add - return [possible_mutation] + return [possible_mutation] + return [] static func mutate_mutations(mutations : Array[PlantMutation], nearby_mutations : Array[PlantMutation]) -> Array[PlantMutation]: var mutation_possibility : Array[MutationPossibility] = [] var evolvable_mutations : Array[PlantMutation] = mutations.filter( - func (m : PlantMutation): return m.get_rarity() < PlantMutation.MAX_RARITY + func (m : PlantMutation): return not m.is_max_level() ) if ( @@ -206,7 +210,7 @@ static func mutate_mutations(mutations : Array[PlantMutation], nearby_mutations var chosen_mutation_possibility = mutation_possibility.pick_random() - return chosen_mutation_possibility.mutate(mutations) + return chosen_mutation_possibility.mutate(mutations,nearby_mutations) class MutationPossibility: func mutate(_mutations : Array[PlantMutation], _nearby_mutations : Array[PlantMutation])-> Array[PlantMutation]: diff --git a/translation/game/gui.csv b/translation/game/gui.csv index 6797a20..6683f46 100644 --- a/translation/game/gui.csv +++ b/translation/game/gui.csv @@ -92,6 +92,16 @@ GENEROUS,Generous,Généreux GENEROUS_EFFECT_TEXT,"When mature, add [b]{score_buff}[/b]{score_icon} to all nearby plants, but no longer make point","Si mature, ajoute [b]{score_buff}[/b]{score_icon} à toutes les plantes à proximité, mais ne génère plus de points" PROTECTIVE,Protective,Protecteur PROTECTIVE_EFFECT_TEXT,"Add [b]{lifetime_buff}[/b]{lifetime_icon} to all nearby plants","Ajoute [b]{lifetime_buff}[/b]{lifetime_icon} à toutes les plantes à proximité" +CLEANING,Cleaning,Nettoyage +CLEANING_EFFECT_TEXT,"At the end of its lifetime, create fertile zone in a radius of [b]{purification_radius}[/b]","À la fin de sa durée de vie, créée une zone fertile dans un rayon de [b]{purification_radius}[/b]" +HERMIT,Hermit,Ermite +HERMIT_EFFECT_TEXT,"Multiplies {score_icon} by [b]{score_multiplier}[/b] but make no points near other plants","Multiplie {score_icon} par [b]{score_multiplier}[/b] mais ne fait aucun point si à proximité d'autres plantes" +TROPICAL,Tropical,Tropical +TROPICAL_EFFECT_TEXT,Multiplies {score_icon} by [b]{score_multiplier}[/b] if the day is rainy (1/4 chance),"Multiplie {score_icon} par [b]{score_multiplier}[/b] s'il pleut (1 chance sur 4)" +RHIZOME,Rhizome,Rhizome +RHIZOME_EFFECT_TEXT,"On maturation, dig on a radius of {digging_radius} around","À la maturation, creuse sur un rayon de {digging_radius} autour" +SPONTANEOUS,Spontaneous,Spontanée +SPONTANEOUS_EFFECT_TEXT,Now produces seeds only on maturation,Produit maintenant des graines uniquement à la maturation COST_%d_ENERGY,Cost %d energy,Coûte %d d'énergie ONE_TIME_USE,Single use,Usage unique BUILD_%s,Build %s,Construit %s