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:
@@ -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
|
||||
|
||||
@@ -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 ------------------
|
||||
|
||||
|
||||
|
||||
@@ -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)):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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)
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user