Dev démo 1.3

* Ajout d'un paramètre pour la taille de l'UI
* Changement de la traduction anglaise de la fourche en "pitchfork" et correction de
* Réparation de bug suite à la montée de version de Godot en 4.7
This commit is contained in:
2026-06-19 10:42:34 +02:00
parent 69dc4444e3
commit af91337017
8 changed files with 209 additions and 176 deletions

View File

@@ -27,15 +27,15 @@ signal variable_was_set(info:Dictionary)
####################################################################################################
func clear_game_state(clear_flag:=DialogicGameHandler.ClearFlags.FULL_CLEAR):
# loading default variables
if ! clear_flag & DialogicGameHandler.ClearFlags.KEEP_VARIABLES:
reset()
# loading default variables
if ! clear_flag & DialogicGameHandler.ClearFlags.KEEP_VARIABLES:
reset()
func load_game_state(load_flag:=LoadFlags.FULL_LOAD):
if load_flag == LoadFlags.ONLY_DNODES:
return
dialogic.current_state_info['variables'] = merge_folder(dialogic.current_state_info['variables'], ProjectSettings.get_setting('dialogic/variables', {}).duplicate(true))
if load_flag == LoadFlags.ONLY_DNODES:
return
dialogic.current_state_info['variables'] = merge_folder(dialogic.current_state_info['variables'], ProjectSettings.get_setting('dialogic/variables', {}).duplicate(true))
#endregion
@@ -54,226 +54,228 @@ func load_game_state(load_flag:=LoadFlags.FULL_LOAD):
## it will try to search for an autoload with the name `Game` and get the value
## of `player_name` to replace it.
func parse_variables(text:String) -> String:
# First some dirty checks to avoid parsing
if not '{' in text:
return text
# First some dirty checks to avoid parsing
if not '{' in text:
return text
# Trying to extract the curly brackets from the text
var regex := RegEx.new()
regex.compile(r"(?<!\\)\{(?<variable>([^{}]|\{[^}]*\})*)\}")
# Trying to extract the curly brackets from the text
var regex := RegEx.new()
regex.compile(r"(?<!\\)\{(?<variable>([^{}]|\{[^}]*\})*)\}")
var parsed := text.replace('\\{', '{')
for result in regex.search_all(text):
var value: Variant = get_variable(result.get_string('variable'), "<NOT FOUND>")
parsed = parsed.replace("{"+result.get_string('variable')+"}", str(value))
var parsed := text.replace('\\{', '{')
for result in regex.search_all(text):
var value: Variant = get_variable(result.get_string('variable'), "<NOT FOUND>")
parsed = parsed.replace("{"+result.get_string('variable')+"}", str(value))
return parsed
return parsed
func set_variable(variable_name: String, value: Variant) -> bool:
variable_name = variable_name.trim_prefix('{').trim_suffix('}')
variable_name = variable_name.trim_prefix('{').trim_suffix('}')
# First assume this is a simple dialogic variable
if has(variable_name):
DialogicUtil._set_value_in_dictionary(variable_name, dialogic.current_state_info['variables'], value)
variable_changed.emit({'variable':variable_name, 'new_value':value})
return true
# First assume this is a simple dialogic variable
if has(variable_name):
DialogicUtil._set_value_in_dictionary(variable_name, dialogic.current_state_info['variables'], value)
variable_changed.emit({'variable':variable_name, 'new_value':value})
return true
# Second assume this is an autoload variable
elif '.' in variable_name:
var from := variable_name.get_slice('.', 0)
var variable := variable_name.trim_prefix(from+'.')
# Second assume this is an autoload variable
elif '.' in variable_name:
var from := variable_name.get_slice('.', 0)
var variable := variable_name.trim_prefix(from+'.')
var autoloads := get_autoloads()
var object: Object = null
if from in autoloads:
object = autoloads[from]
while variable.count("."):
from = variable.get_slice('.', 0)
if from in object and object.get(from) is Object:
object = object.get(from)
variable = variable.trim_prefix(from+'.')
var autoloads := get_autoloads()
var object: Object = null
if from in autoloads:
object = autoloads[from]
while variable.count("."):
from = variable.get_slice('.', 0)
if from in object and object.get(from) is Object:
object = object.get(from)
variable = variable.trim_prefix(from+'.')
if object:
var sub_idx := ""
if '[' in variable:
sub_idx = variable.substr(variable.find('['))
variable = variable.trim_suffix(sub_idx)
sub_idx = sub_idx.trim_prefix('[').trim_suffix(']')
if object:
var sub_idx := ""
if '[' in variable:
sub_idx = variable.substr(variable.find('['))
variable = variable.trim_suffix(sub_idx)
sub_idx = sub_idx.trim_prefix('[').trim_suffix(']')
if variable in object:
match typeof(object.get(variable)):
TYPE_ARRAY:
if not sub_idx:
if typeof(value) == TYPE_ARRAY:
object.set(variable, value)
return true
elif sub_idx.is_valid_float():
object.get(variable).remove_at(int(sub_idx))
object.get(variable).insert(int(sub_idx), value)
return true
TYPE_DICTIONARY:
if not sub_idx:
if typeof(value) == TYPE_DICTIONARY:
object.set(variable, value)
return true
else:
object.get(variable).merge({str_to_var(sub_idx):value}, true)
return true
_:
object.set(variable, value)
return true
if variable in object:
match typeof(object.get(variable)):
TYPE_ARRAY:
if not sub_idx:
if typeof(value) == TYPE_ARRAY:
object.set(variable, value)
return true
elif sub_idx.is_valid_float():
object.get(variable).remove_at(int(sub_idx))
object.get(variable).insert(int(sub_idx), value)
return true
TYPE_DICTIONARY:
if not sub_idx:
if typeof(value) == TYPE_DICTIONARY:
object.set(variable, value)
return true
else:
object.get(variable).merge({str_to_var(sub_idx):value}, true)
return true
_:
object.set(variable, value)
return true
printerr("[Dialogic] Tried setting non-existant variable '"+variable_name+"'.")
return false
printerr("[Dialogic] Tried setting non-existant variable '"+variable_name+"'.")
return false
func get_variable(variable_path:String, default: Variant = null, no_warning := false) -> Variant:
if variable_path.begins_with('{') and variable_path.ends_with('}') and variable_path.count('{') == 1:
variable_path = variable_path.trim_prefix('{').trim_suffix('}')
if variable_path.begins_with('{') and variable_path.ends_with('}') and variable_path.count('{') == 1:
variable_path = variable_path.trim_prefix('{').trim_suffix('}')
# First assume this is just a single variable
var value: Variant = DialogicUtil._get_value_in_dictionary(variable_path, dialogic.current_state_info['variables'])
if value != null:
return value
# First assume this is just a single variable
var value: Variant = DialogicUtil._get_value_in_dictionary(variable_path, dialogic.current_state_info['variables'])
if value != null:
return value
# Second assume this is an expression.
else:
value = dialogic.Expressions.execute_string(variable_path, null, no_warning)
if value != null:
return value
# Second assume this is an expression.
else:
value = dialogic.Expressions.execute_string(variable_path, null, no_warning)
if value != null:
return value
# If everything fails, tell the user and return the default
if not no_warning:
printerr("[Dialogic] Failed parsing variable/expression '"+variable_path+"'.")
return default
# If everything fails, tell the user and return the default
if not no_warning:
printerr("[Dialogic] Failed parsing variable/expression '"+variable_path+"'.")
return default
## Resets all variables or a specific variable to the value(s) defined in the variable editor
func reset(variable:="") -> void:
if variable.is_empty():
dialogic.current_state_info['variables'] = ProjectSettings.get_setting("dialogic/variables", {}).duplicate(true)
else:
DialogicUtil._set_value_in_dictionary(variable, dialogic.current_state_info['variables'], DialogicUtil._get_value_in_dictionary(variable, ProjectSettings.get_setting('dialogic/variables', {})))
if variable.is_empty():
dialogic.current_state_info['variables'] = ProjectSettings.get_setting("dialogic/variables", {}).duplicate(true)
else:
DialogicUtil._set_value_in_dictionary(variable, dialogic.current_state_info['variables'], DialogicUtil._get_value_in_dictionary(variable, ProjectSettings.get_setting('dialogic/variables', {})))
## Returns true if a variable with the given path exists
func has(variable:="") -> bool:
return DialogicUtil._get_value_in_dictionary(variable, dialogic.current_state_info['variables']) != null
return DialogicUtil._get_value_in_dictionary(variable, dialogic.current_state_info['variables']) != null
## Allows to set dialogic built-in variables
func _set(property, value) -> bool:
property = str(property)
var vars: Dictionary = dialogic.current_state_info['variables']
if property in vars.keys():
if typeof(vars[property]) != TYPE_DICTIONARY:
vars[property] = value
return true
if value is VariableFolder:
return true
return false
property = str(property)
var vars: Dictionary = dialogic.current_state_info['variables']
if property in vars.keys():
if typeof(vars[property]) != TYPE_DICTIONARY:
vars[property] = value
return true
if value is VariableFolder:
return true
return false
## Allows to get dialogic built-in variables
func _get(property):
property = str(property)
if property in dialogic.current_state_info['variables'].keys():
if typeof(dialogic.current_state_info['variables'][property]) == TYPE_DICTIONARY:
return VariableFolder.new(dialogic.current_state_info['variables'][property], property, self)
else:
return DialogicUtil.logical_convert(dialogic.current_state_info['variables'][property])
property = str(property)
if property in dialogic.current_state_info['variables'].keys():
if typeof(dialogic.current_state_info['variables'][property]) == TYPE_DICTIONARY:
return VariableFolder.new(dialogic.current_state_info['variables'][property], property, self)
else:
return DialogicUtil.logical_convert(dialogic.current_state_info['variables'][property])
return null
func folders() -> Array:
var result := []
for i in dialogic.current_state_info['variables'].keys():
if dialogic.current_state_info['variables'][i] is Dictionary:
result.append(VariableFolder.new(dialogic.current_state_info['variables'][i], i, self))
return result
var result := []
for i in dialogic.current_state_info['variables'].keys():
if dialogic.current_state_info['variables'][i] is Dictionary:
result.append(VariableFolder.new(dialogic.current_state_info['variables'][i], i, self))
return result
func variables(_absolute:=false) -> Array:
var result := []
for i in dialogic.current_state_info['variables'].keys():
if not dialogic.current_state_info['variables'][i] is Dictionary:
result.append(i)
return result
var result := []
for i in dialogic.current_state_info['variables'].keys():
if not dialogic.current_state_info['variables'][i] is Dictionary:
result.append(i)
return result
#endregion
#region HELPERS
################################################################################
func get_autoloads() -> Dictionary:
var autoloads := {}
for node: Node in get_tree().root.get_children():
autoloads[node.name] = node
return autoloads
var autoloads := {}
for node: Node in get_tree().root.get_children():
autoloads[node.name] = node
return autoloads
func merge_folder(new:Dictionary, defs:Dictionary) -> Dictionary:
# also go through all groups in this folder
for x in new.keys():
if x in defs and typeof(new[x]) == TYPE_DICTIONARY:
new[x] = merge_folder(new[x], defs[x])
# add all new variables
for x in defs.keys():
if not x in new:
new[x] = defs[x]
return new
# also go through all groups in this folder
for x in new.keys():
if x in defs and typeof(new[x]) == TYPE_DICTIONARY:
new[x] = merge_folder(new[x], defs[x])
# add all new variables
for x in defs.keys():
if not x in new:
new[x] = defs[x]
return new
#endregion
#region VARIABLE FOLDER
################################################################################
class VariableFolder:
var data := {}
var path := ""
var outside: DialogicSubsystem
var data := {}
var path := ""
var outside: DialogicSubsystem
func _init(_data:Dictionary, _path:String, _outside:DialogicSubsystem):
data = _data
path = _path
outside = _outside
func _init(_data:Dictionary, _path:String, _outside:DialogicSubsystem):
data = _data
path = _path
outside = _outside
func _get(property:StringName):
property = str(property)
if property in data:
if typeof(data[property]) == TYPE_DICTIONARY:
return VariableFolder.new(data[property], path+"."+property, outside)
else:
return DialogicUtil.logical_convert(data[property])
func _get(property:StringName):
property = str(property)
if property in data:
if typeof(data[property]) == TYPE_DICTIONARY:
return VariableFolder.new(data[property], path+"."+property, outside)
else:
return DialogicUtil.logical_convert(data[property])
return null
func _set(property:StringName, value:Variant) -> bool:
property = str(property)
if not value is VariableFolder:
DialogicUtil._set_value_in_dictionary(path+"."+property, outside.dialogic.current_state_info['variables'], value)
return true
func _set(property:StringName, value:Variant) -> bool:
property = str(property)
if not value is VariableFolder:
DialogicUtil._set_value_in_dictionary(path+"."+property, outside.dialogic.current_state_info['variables'], value)
return true
func has(key:String) -> bool:
return key in data
func has(key:String) -> bool:
return key in data
func folders() -> Array:
var result := []
for i in data.keys():
if data[i] is Dictionary:
result.append(VariableFolder.new(data[i], path+"."+i, outside))
return result
func folders() -> Array:
var result := []
for i in data.keys():
if data[i] is Dictionary:
result.append(VariableFolder.new(data[i], path+"."+i, outside))
return result
func variables(absolute:=false) -> Array:
var result := []
for i in data.keys():
if not data[i] is Dictionary:
if absolute:
result.append(path+'.'+i)
else:
result.append(i)
return result
func variables(absolute:=false) -> Array:
var result := []
for i in data.keys():
if not data[i] is Dictionary:
if absolute:
result.append(path+'.'+i)
else:
result.append(i)
return result
#endregion

View File

@@ -51,6 +51,11 @@ const AVAILABLE_LANGUAGES_LABEL = [
full_screen = v
video_changed.emit(self)
@export var ui_size : float = 1. :
set(v):
ui_size = v
video_changed.emit(self)
#region ------------------ Controls ------------------

View File

@@ -81,6 +81,10 @@ func update_language_settings(s : SettingsData = settings_data):
func update_video_settings(s : SettingsData = settings_data):
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED)
if not is_node_ready():
await ready
get_tree().root.content_scale_factor = s.ui_size
func update_inputs(s : SettingsData = settings_data):
for i in range(len(s.input_remapped)):

View File

@@ -44,6 +44,7 @@ func setup_sound():
func setup_video():
%FullScreenCheckBox.button_pressed = settings.full_screen
%UiSizeSlider.value = settings.ui_size
func setup_controls():
%AutoPickupCheckBox.button_pressed = settings.auto_pickup
@@ -81,3 +82,6 @@ func _on_fov_slider_value_changed(value):
func _on_sensibility_slider_value_changed(value: float):
settings.mouse_sensivity = value
func _on_ui_size_slider_value_changed(value: float):
settings.ui_size = %UiSizeSlider.value

View File

@@ -23,7 +23,7 @@ script = ExtResource("1_7t8mv")
[node name="SettingsWindow" parent="." unique_id=798514856 instance=ExtResource("1_gkn1k")]
unique_name_in_owner = true
process_mode = 3
custom_minimum_size = Vector2(900, 634.155)
custom_minimum_size = Vector2(900, 667.77)
layout_mode = 1
offset_left = -349.99994
offset_right = 350.00055
@@ -132,6 +132,22 @@ size_flags_horizontal = 10
size_flags_vertical = 4
theme = ExtResource("2_7t8mv")
[node name="UiSizeSliderText" parent="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/VideoSettings" unique_id=1487118616 instance=ExtResource("4_rbiwc")]
layout_mode = 2
size_flags_horizontal = 3
text = "UI_SIZE"
[node name="UiSizeSlider" type="HSlider" parent="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/VideoSettings" unique_id=921491472]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme = ExtResource("2_7t8mv")
min_value = 0.5
max_value = 1.5
step = 0.01
value = 1.5
[node name="FovSliderText" parent="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/VideoSettings" unique_id=1512796885 instance=ExtResource("4_rbiwc")]
layout_mode = 2
size_flags_horizontal = 3
@@ -202,6 +218,7 @@ bus = &"Sfx"
[connection signal="value_changed" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/SoundSliders/EnvSlider" to="." method="_on_env_slider_value_changed"]
[connection signal="value_changed" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/SoundSliders/SFXSlider" to="." method="_on_sfx_slider_value_changed"]
[connection signal="toggled" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/VideoSettings/FullScreenCheckBox" to="." method="_on_full_screen_check_box_toggled"]
[connection signal="value_changed" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/VideoSettings/UiSizeSlider" to="." method="_on_ui_size_slider_value_changed"]
[connection signal="value_changed" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/VideoSettings/FovSlider" to="." method="_on_fov_slider_value_changed"]
[connection signal="value_changed" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/GameSettings/SensibilitySlider" to="." method="_on_sensibility_slider_value_changed"]
[connection signal="toggled" from="SettingsWindow/WindowContent/MarginContainer/ContentContainer/MarginContainer/SettingsContent/GameSettings/AutoPickupCheckBox" to="." method="_on_auto_pickup_check_box_toggled"]

View File

@@ -16,9 +16,9 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true
config/name="Seeding The Wasteland"
config/description="Seeding planets is a survival, managment and cosy game in which you play a little gardener robot."
config/version="demo-1.2"
config/version="demo-1.3"
run/main_scene="uid://c5bruelvqbm1k"
config/features=PackedStringArray("4.6", "Forward Plus")
config/features=PackedStringArray("4.7", "Forward Plus")
config/icon="uid://df0y0s666ui4h"
[audio]
@@ -227,10 +227,10 @@ item_9={
}
dialogic_default_action={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":true,"double_click":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":16,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
]
}

View File

@@ -21,9 +21,9 @@
[sub_resource type="Resource" id="Resource_r4e5h"]
script = ExtResource("3_r4e5h")
rain_value = 0.42404523
cloud_value = 0.4445428
wind_direction = Vector2(-0.63176113, -0.7751632)
wind_force = 0.92673165
cloud_value = 0.4684971
wind_direction = Vector2(-0.72454613, 0.6892263)
wind_force = 0.9580294
fog_value = 0.5362279
ambiance_name = "ExteriorWindy"
type = 3

View File

@@ -91,7 +91,7 @@ PROTECTIVE_EFFECT_TEXT,"Add [b]{lifetime_buff}[/b]{lifetime_icon} to all nearby
COST_%d_ENERGY,Cost %d energy,Coûte %d d'énergie
ONE_TIME_USE,Single use,Usage unique
BUILD_%s,Build %s,Construit %s
FORK,Fork,Fourche
FORK,Pitchfork,Fourche
FORK_DESC_TEXT,"Use it to [b]harvest mature plants[/b].","Utilise-la pour [b]récolter les plantes mature[/b]."
DETECTOR,Detector,Détecteur
DETECTOR_DESC_TEXT,"Indicate [b]near signals[/b]","Indique les [b]signaux proches[/b]"
@@ -127,7 +127,7 @@ TAKE_A_SEED_BY_CLICKING_ON_IT,Take a [b]Seed[/b] by clicking or moving over it,P
DIG_A_TALION_VEIN_WITH_SHOVEL,Dig a [b]Talion Vein[/b] with the [b]Pickaxe[/b],Creuser une [b]Veine de Talion[/b] avec la [b]Pioche[/b]
PLANT_SEED_IN_FERTILE_ZONE,Plant a [b]Seed[/b] in the [b]Fertile Zone[/b],Planter une [b]Graine[/b] dans la [b]Zone Fertile[/b]
WAIT_FOR_THE_PLANT_MATURATION,Wait for the plant to [b]Mature[/b] (recharging will pass days),Attendez que la plante soit [b]Mature[/b] (se recharger fera passer les jours)
HARVEST_A_MATURE_PLANT,Harvest a [b]Mature Plant[/b] using your [b]Fork[/b],Récoltez une [b]Plante Mature[/b] en utilisant votre [b]Fourche[/b]
HARVEST_A_MATURE_PLANT,Harvest a [b]Mature Plant[/b] using your [b]Pitchfork[/b],Récoltez une [b]Plante Mature[/b] en utilisant votre [b]Fourche[/b]
TAKE_HARVESTED_SEEDS,Take the harvested seeds,Prenez les graines récoltées
HAVE_3_PLANT_POINTS_SIMULTANEOUSLY,Reach 3 plant points,Atteignez 3 points de plantes
ENERGY,The Energy,L'Énergie
@@ -138,15 +138,15 @@ RECHARGE_STATION_TUTORIAL_DESC_TEXT,"You can recharge all of your energy in the
PLANT_NAME_TEXT,"[b]Plant name and state[/b] Each plant species has a unique name.","[b]Nom et état de la plante[/b] Chaque espèce de plantes a un nom unique."
PLANT_STATS_TEXT,"[b]Plant stats[/b] Here you can see your plant's age, the day of maturation, the lifetime, and the seed number that the plant can produce","[b]Statistiques[/b] Ici, vous pouvez voir l'âge de votre plante, le jour de maturation, le temps de vie et le nombre de graine que la plante donne"
PLANTS_INFO,"The Plants","Les plantes"
EACH_PLANT_HAVE_3_STATE,"Each plant have three state","Chaque plante a trois états"
JUVENILE_DESC_TEXT,"[b]Juvenile[/b] The plant is growing, we can recover its seed with the [b]Fork[/b].","[b]Juvenile[/b] La plante grandit, il est possible de récupérer sa graine avec la [b]Fourche[/b]."
MATURE_DESC_TEXT,"[b]Mature[/b] Have one [b]Plant point[/b]","[b]Mature[/b] Possède un [b]Point de Plante[/b]."
EACH_PLANT_HAVE_3_STATE,"Each plant has three state","Chaque plante a trois états"
JUVENILE_DESC_TEXT,"[b]Juvenile[/b] The plant is growing, we can recover its seed with the [b]Pitchfork[/b].","[b]Juvenile[/b] La plante grandit, il est possible de récupérer sa graine avec la [b]Fourche[/b]."
MATURE_DESC_TEXT,"[b]Mature[/b] Has one [b]Plant point[/b]","[b]Mature[/b] Possède un [b]Point de Plante[/b]."
DEAD_DESC_TEXT,"[b]Dead[/b] When harvested or when exceeding their lifetime, each plant dies and produce two [b]Seeds[/b].","[b]Morte[/b] Lors de la récolte ou lorsque leur durée de vie est arrivée à son terme, chaque plante meurt et produit deux [b]Graines[/b]."
OBTAIN_INFORMATION_ON_PLANTS_WHILE_HOVERING_PLANTS_BASE,"Hover the plants to obtain information","Obtenez des informations sur les plantes en les survolant"
THE_PLANT_POINTS,"The Plant Points","Les Points de Plantes"
HOW_TO_GET_PLANT_POINTS,"How to get Plant Points","Comment avoir des Points de Plantes"
PLANT_POINTS_TUTORIAL_DESC_1_TEXT,"Each mature plant have one [b]Plant Point[/b], you can see your progress on your [b]Objective[/b] in the top of the screen.","Chaque plante mature possède un [b]Point de Plante[/b]. Vous pouvez suivre votre progression dans votre [b]Objectif[/b] en haut de l'écran."
PLANT_POINTS_TUTORIAL_DESC_2_TEXT,"Plant Points of dead or harvested plants are [b]no more counted[/b].","Les Points de Plante des plantes mortes ou récoltées ne sont [b]plus comptabilisés[/b]."
PLANT_POINTS_TUTORIAL_DESC_1_TEXT,"Each mature plant has one [b]Plant Point[/b], you can see your progress on your [b]Objective[/b] in the top of the screen.","Chaque plante mature possède un [b]Point de Plante[/b]. Vous pouvez suivre votre progression dans votre [b]Objectif[/b] en haut de l'écran."
PLANT_POINTS_TUTORIAL_DESC_2_TEXT,"Plant Points of dead or harvested plants are [b]not counted anymore[/b].","Les Points de Plante des plantes mortes ou récoltées ne sont [b]plus comptabilisés[/b]."
PLANT_MUTATION_TEXT,"[b]Mutations[/b] Mutation change the plant behavior. These mutations are transmitted between generations, where they can change or evolve superior levels","[b]Mutations[/b] Les mutations changent le comportement de la plante. Ces mutations se transmettent entre les générations, et peuvent changer ou évoluer aux niveaux supérieurs"
SHOW_ENERGY_TUTORIAL,"Show energy tutorial","Montrer le tutoriel de l'énergie"
SHOW_PLANT_TUTORIAL,"Show plant tutorial","Montrer le tutoriel des plantes"
@@ -189,6 +189,7 @@ SFX_VOLUME,Sfx Volume,Volume des bruitages
VIDEO,Video,Vidéo
FULLSCREEN,Fullscreen,Plein écran
FOV,Fov,Fov
UI_SIZE,Ui Size,Taille de l'UI
GAME,Game,Jeu
MOUSE_SENSIVITY,Mouse Sensivity in 3D scenes,Sensibilité de la souris dans les scènes en 3D
AUTO_PICKUP,Auto pickup seeds,Récolte automatique des graines
1 keys en fr
91 COST_%d_ENERGY Cost %d energy Coûte %d d'énergie
92 ONE_TIME_USE Single use Usage unique
93 BUILD_%s Build %s Construit %s
94 FORK Fork Pitchfork Fourche
95 FORK_DESC_TEXT Use it to [b]harvest mature plants[/b]. Utilise-la pour [b]récolter les plantes mature[/b].
96 DETECTOR Detector Détecteur
97 DETECTOR_DESC_TEXT Indicate [b]near signals[/b] Indique les [b]signaux proches[/b]
127 DIG_A_TALION_VEIN_WITH_SHOVEL Dig a [b]Talion Vein[/b] with the [b]Pickaxe[/b] Creuser une [b]Veine de Talion[/b] avec la [b]Pioche[/b]
128 PLANT_SEED_IN_FERTILE_ZONE Plant a [b]Seed[/b] in the [b]Fertile Zone[/b] Planter une [b]Graine[/b] dans la [b]Zone Fertile[/b]
129 WAIT_FOR_THE_PLANT_MATURATION Wait for the plant to [b]Mature[/b] (recharging will pass days) Attendez que la plante soit [b]Mature[/b] (se recharger fera passer les jours)
130 HARVEST_A_MATURE_PLANT Harvest a [b]Mature Plant[/b] using your [b]Fork[/b] Harvest a [b]Mature Plant[/b] using your [b]Pitchfork[/b] Récoltez une [b]Plante Mature[/b] en utilisant votre [b]Fourche[/b]
131 TAKE_HARVESTED_SEEDS Take the harvested seeds Prenez les graines récoltées
132 HAVE_3_PLANT_POINTS_SIMULTANEOUSLY Reach 3 plant points Atteignez 3 points de plantes
133 ENERGY The Energy L'Énergie
138 PLANT_NAME_TEXT [b]Plant name and state[/b] Each plant species has a unique name. [b]Nom et état de la plante[/b] Chaque espèce de plantes a un nom unique.
139 PLANT_STATS_TEXT [b]Plant stats[/b] Here you can see your plant's age, the day of maturation, the lifetime, and the seed number that the plant can produce [b]Statistiques[/b] Ici, vous pouvez voir l'âge de votre plante, le jour de maturation, le temps de vie et le nombre de graine que la plante donne
140 PLANTS_INFO The Plants Les plantes
141 EACH_PLANT_HAVE_3_STATE Each plant have three state Each plant has three state Chaque plante a trois états
142 JUVENILE_DESC_TEXT [b]Juvenile[/b] The plant is growing, we can recover its seed with the [b]Fork[/b]. [b]Juvenile[/b] The plant is growing, we can recover its seed with the [b]Pitchfork[/b]. [b]Juvenile[/b] La plante grandit, il est possible de récupérer sa graine avec la [b]Fourche[/b].
143 MATURE_DESC_TEXT [b]Mature[/b] Have one [b]Plant point[/b] [b]Mature[/b] Has one [b]Plant point[/b] [b]Mature[/b] Possède un [b]Point de Plante[/b].
144 DEAD_DESC_TEXT [b]Dead[/b] When harvested or when exceeding their lifetime, each plant dies and produce two [b]Seeds[/b]. [b]Morte[/b] Lors de la récolte ou lorsque leur durée de vie est arrivée à son terme, chaque plante meurt et produit deux [b]Graines[/b].
145 OBTAIN_INFORMATION_ON_PLANTS_WHILE_HOVERING_PLANTS_BASE Hover the plants to obtain information Obtenez des informations sur les plantes en les survolant
146 THE_PLANT_POINTS The Plant Points Les Points de Plantes
147 HOW_TO_GET_PLANT_POINTS How to get Plant Points Comment avoir des Points de Plantes
148 PLANT_POINTS_TUTORIAL_DESC_1_TEXT Each mature plant have one [b]Plant Point[/b], you can see your progress on your [b]Objective[/b] in the top of the screen. Each mature plant has one [b]Plant Point[/b], you can see your progress on your [b]Objective[/b] in the top of the screen. Chaque plante mature possède un [b]Point de Plante[/b]. Vous pouvez suivre votre progression dans votre [b]Objectif[/b] en haut de l'écran.
149 PLANT_POINTS_TUTORIAL_DESC_2_TEXT Plant Points of dead or harvested plants are [b]no more counted[/b]. Plant Points of dead or harvested plants are [b]not counted anymore[/b]. Les Points de Plante des plantes mortes ou récoltées ne sont [b]plus comptabilisés[/b].
150 PLANT_MUTATION_TEXT [b]Mutations[/b] Mutation change the plant behavior. These mutations are transmitted between generations, where they can change or evolve superior levels [b]Mutations[/b] Les mutations changent le comportement de la plante. Ces mutations se transmettent entre les générations, et peuvent changer ou évoluer aux niveaux supérieurs
151 SHOW_ENERGY_TUTORIAL Show energy tutorial Montrer le tutoriel de l'énergie
152 SHOW_PLANT_TUTORIAL Show plant tutorial Montrer le tutoriel des plantes
189 VIDEO Video Vidéo
190 FULLSCREEN Fullscreen Plein écran
191 FOV Fov Fov
192 UI_SIZE Ui Size Taille de l'UI
193 GAME Game Jeu
194 MOUSE_SENSIVITY Mouse Sensivity in 3D scenes Sensibilité de la souris dans les scènes en 3D
195 AUTO_PICKUP Auto pickup seeds Récolte automatique des graines