From af91337017d9606107b903fff55b41ef081cebde Mon Sep 17 00:00:00 2001 From: Zacharie Guet Date: Fri, 19 Jun 2026 10:42:34 +0200 Subject: [PATCH] =?UTF-8?q?Dev=20d=C3=A9mo=201.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- .../Modules/Variable/subsystem_variables.gd | 322 +++++++++--------- common/game_data/scripts/settings_data.gd | 5 + common/game_info/game_info.gd | 4 + gui/menu/settings/scripts/settings.gd | 4 + gui/menu/settings/settings.tscn | 19 +- project.godot | 10 +- stages/terrain/region/region.tscn | 6 +- translation/game/gui.csv | 15 +- 8 files changed, 209 insertions(+), 176 deletions(-) diff --git a/addons/dialogic/Modules/Variable/subsystem_variables.gd b/addons/dialogic/Modules/Variable/subsystem_variables.gd index ff5c142..b6dff6d 100644 --- a/addons/dialogic/Modules/Variable/subsystem_variables.gd +++ b/addons/dialogic/Modules/Variable/subsystem_variables.gd @@ -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"(?([^{}]|\{[^}]*\})*)\}") + # Trying to extract the curly brackets from the text + var regex := RegEx.new() + regex.compile(r"(?([^{}]|\{[^}]*\})*)\}") - var parsed := text.replace('\\{', '{') - for result in regex.search_all(text): - var value: Variant = get_variable(result.get_string('variable'), "") - 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'), "") + 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 diff --git a/common/game_data/scripts/settings_data.gd b/common/game_data/scripts/settings_data.gd index 34491ff..11be536 100644 --- a/common/game_data/scripts/settings_data.gd +++ b/common/game_data/scripts/settings_data.gd @@ -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 ------------------ diff --git a/common/game_info/game_info.gd b/common/game_info/game_info.gd index f52b231..906c0a0 100644 --- a/common/game_info/game_info.gd +++ b/common/game_info/game_info.gd @@ -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)): diff --git a/gui/menu/settings/scripts/settings.gd b/gui/menu/settings/scripts/settings.gd index a767eab..e741bc1 100644 --- a/gui/menu/settings/scripts/settings.gd +++ b/gui/menu/settings/scripts/settings.gd @@ -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 diff --git a/gui/menu/settings/settings.tscn b/gui/menu/settings/settings.tscn index 6ff22dc..151c6e2 100644 --- a/gui/menu/settings/settings.tscn +++ b/gui/menu/settings/settings.tscn @@ -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"] diff --git a/project.godot b/project.godot index fd2eec7..24b9ca4 100644 --- a/project.godot +++ b/project.godot @@ -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) ] } diff --git a/stages/terrain/region/region.tscn b/stages/terrain/region/region.tscn index ecdf8f7..7e1f510 100644 --- a/stages/terrain/region/region.tscn +++ b/stages/terrain/region/region.tscn @@ -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 diff --git a/translation/game/gui.csv b/translation/game/gui.csv index 3bccd2b..3951a05 100644 --- a/translation/game/gui.csv +++ b/translation/game/gui.csv @@ -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