aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/global.gd285
-rw-r--r--client/makefile2
-rw-r--r--client/map/auto_setup/environment_setup.gd11
-rw-r--r--client/map/auto_setup/light_setup.gd9
-rw-r--r--client/map/map.gd19
-rw-r--r--client/map/tiles/exterior_tree.gd2
-rw-r--r--client/map/tiles/grass.gd2
-rw-r--r--client/map/tiles/light_tile.gd11
-rw-r--r--client/menu/blur_setup.gd8
-rw-r--r--client/menu/character.tscn4
-rw-r--r--client/menu/credits.gd10
-rw-r--r--client/menu/entry.gd2
-rw-r--r--client/menu/game.gd2
-rw-r--r--client/menu/ingame.tscn14
-rw-r--r--client/menu/lobby.tscn6
-rw-r--r--client/menu/main.tscn10
-rw-r--r--client/menu/overlay.tscn18
-rw-r--r--client/menu/play.tscn10
-rw-r--r--client/menu/popup_message.gd14
-rw-r--r--client/menu/settings.gd43
-rw-r--r--client/menu/settings.tscn9
-rw-r--r--client/menu/settings/dropdown_setting.gd25
-rw-r--r--client/menu/settings/game_setting.gd50
-rw-r--r--client/menu/settings/input/input_manager.gd42
-rw-r--r--client/menu/settings/input/input_setting.gd19
-rw-r--r--client/menu/settings/input/input_value_node.gd5
-rw-r--r--client/menu/settings/preset_row.gd (renamed from client/menu/settings/preset.gd)32
-rw-r--r--client/menu/settings/range_setting.gd22
-rw-r--r--client/menu/settings/settings_category.gd35
-rw-r--r--client/menu/settings/settings_root.gd34
-rw-r--r--client/menu/settings/settings_row.gd1
-rw-r--r--client/menu/settings/text_setting.gd22
-rw-r--r--client/menu/settings/toggle_setting.gd22
-rw-r--r--client/menu/setup.gd2
-rw-r--r--client/menu/setup.tscn2
-rw-r--r--client/menu/warning_popup.gd1
-rw-r--r--client/multiplayer.gd8
-rw-r--r--client/player/controllable_player.gd2
-rw-r--r--client/player/follow_camera.gd6
-rw-r--r--client/player/player.gd7
-rw-r--r--client/server.gd10
-rw-r--r--client/settings.gd165
-rw-r--r--locale/ar.ini110
-rw-r--r--locale/de.ini128
-rw-r--r--locale/en.ini144
-rw-r--r--locale/es.ini128
-rw-r--r--locale/eu.ini110
-rw-r--r--locale/fi.ini110
-rw-r--r--locale/fr.ini110
-rw-r--r--locale/he.ini110
-rw-r--r--locale/ja.ini110
-rw-r--r--locale/pl.ini110
-rw-r--r--locale/pt.ini110
-rw-r--r--locale/tools/src/main.rs35
-rw-r--r--locale/tr.ini110
-rw-r--r--locale/zh_Hans.ini128
-rw-r--r--locale/zh_Hant.ini110
57 files changed, 1296 insertions, 1370 deletions
diff --git a/client/global.gd b/client/global.gd
index d62f5413..0923b457 100644
--- a/client/global.gd
+++ b/client/global.gd
@@ -19,7 +19,6 @@
class_name G
extends Node
-signal settings_changed()
signal using_joypad_change(using: bool)
signal using_touch_change(using: bool)
@@ -39,90 +38,16 @@ var default_profile := {
"has_seen_join_while_running": false
}
}
-var languages := language_array()
+
var using_joypad := false
var using_touch := false
-@onready var default_settings := [
- SettingsCategory.new(tr("Gameplay"), "gameplay", {
- "touch_controls": DropdownSetting.new(tr("Enable touch screen controls"), 0, [tr("Automatic"), tr("Enabled"), tr("Disabled")]),
- "interpolate_camera_rotation": ToggleSetting.new(tr("Smooth camera rotation"), false),
- "invert_camera": ToggleSetting.new(tr("Invert camera movement"), false),
- "usernames": ToggleSetting.new(tr("Show username tags"), true),
- "setup_complete": ToggleSetting.new(tr("Initial setup complete. (Uncheck and restart to reenter)"), false),
- "tutorial_started": ToggleSetting.new(tr("Tutorial started"), false),
- "latch_boost": ToggleSetting.new(tr("Always extend boost to maximum duration"), true),
- }),
- SettingsCategory.new(tr("Graphics"), "graphics", {
- "fullscreen": DropdownSetting.new(tr("Fullscreen"), 0, [tr("Keep"), tr("Always"), tr("Never")]),
- "aa": DropdownSetting.new(tr("Anti-aliasing"), 2 if on_high_end() else 0, [tr("Disabled"), "FXAA", "MSAA 2x", "MSAA 4x"]),
- "ssao": ToggleSetting.new(tr("Ambient occlusion"), true if on_high_end() else false),
- "taa": ToggleSetting.new(tr("Temporal Anti-Aliasing"), false),
- "gi": DropdownSetting.new(tr("Global illumination"), 0, [tr("Disabled"), tr("SDFGI"), tr("Voxel GI")]),
- "shadows": ToggleSetting.new(tr("Enable shadows"), true if on_high_end() else false),
- "glow": ToggleSetting.new(tr("Enable glow"), true if on_high_end() else false),
- "grass_amount": RangeSetting.new(tr("3D grass amount per grass tile"), 16 if on_high_end() else 0, 0, 32, false),
- "lq_trees": ToggleSetting.new(tr("Low-poly trees"), false if on_high_end() else true),
- "ui_blur": ToggleSetting.new(tr("Enable UI blur"), true)
- }, [
- Preset.new(tr("Graphics"), {
- tr("Low"): {
- "ui_blur": true,
- "aa": 0,
- "ssao": false,
- "taa": false,
- "shadows": false,
- "glow": false,
- "grass_amount": 0,
- "lq_trees": true
- },
- tr("Medium"): {
- "ui_blur": true,
- "aa": 1,
- "ssao": false,
- "taa": false,
- "shadows": true,
- "glow": false,
- "grass_amount": 0,
- "lq_trees": false
- },
- tr("High"): {
- "ui_blur": true,
- "aa": 2,
- "ssao": true,
- "taa": false,
- "shadows": true,
- "glow": true,
- "grass_amount": 16,
- "lq_trees": false
- }
- })
- ]),
- SettingsCategory.new(tr("Audio"), "audio", {
- "master_volume": RangeSetting.new(tr("Master Volume"), 0, -30, 0),
- "music_volume": RangeSetting.new(tr("Music Volume"), 0, -30, 0),
- "sfx_volume": RangeSetting.new(tr("SFX Volume"), 0, -30, 0),
- }),
- SettingsCategory.new(tr("User interface"), "ui", {
- "language": DropdownSetting.new(tr("Language"), 0, languages.map(func(e): return e[1])),
- "ui_scale_mode": DropdownSetting.new(tr("UI scale mode"), 0, [tr("Resize"), tr("Disabled")]),
- "ui_scale_factor": RangeSetting.new(tr("UI scale factor"), 1. if not on_mobile() else 1.5, 0.5, 1.5, 3),
- }),
- SettingsCategory.new(tr("Controls"), "input",
- InputManager.input_map_to_settings_dictionary(InputManager.default_input_map)
- ),
- SettingsCategory.new(tr("Other"), "other", {
- "server_binary": TextSetting.new(tr("Server binary (leave empty to search PATH)"), "", tr("Enter path")),
- "server_data": TextSetting.new(tr("Server data directory (leave empty to auto-detect)"), "", tr("Enter path")),
- "debug_info": ToggleSetting.new(tr("Display debug info (Framerate, etc.)"), false),
- })
- ]
-
-# Profile and settings are stored in a Dictionary[String, GameSetting]
-# Unlike the default settings, the settings dictionary is not split into categories.
+# profile and settings are stored in a Dictionary[String, Any]
var profile: Dictionary
var settings: Dictionary
+var settings_tree: GameSetting
+
var server_url = ""
var error_message = ""
@@ -131,28 +56,20 @@ var focused_node: Control
func _ready():
profile = load_dict("user://profile", default_profile)
load_settings("user://settings")
- apply_settings()
get_viewport().gui_focus_changed.connect(Sound.play_hover_maybe)
get_viewport().gui_focus_changed.connect(func(node): focused_node = node)
func _input(event):
if Input.is_action_just_pressed("fullscreen"):
- match Global.get_setting("fullscreen"):
- 0:
- # Keep setting
+ match Global.get_setting("graphics.fullscreen"):
+ "keep":
if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
else:
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
- 1:
- # Always
- set_setting("fullscreen", 2) # Set to never
- update_fullscreen()
- 2:
- # Never
- set_setting("fullscreen", 1) # Set to always
- update_fullscreen()
+ "always": set_setting("graphics.fullscreen", "never")
+ "never": set_setting("graphics.fullscreen", "always")
# Update using_joypad variable
if event is InputEventMouseButton or event is InputEventKey:
@@ -165,7 +82,7 @@ func _input(event):
using_joypad_change.emit(using_joypad)
# Update using_touch variable
- if get_setting("touch_controls") == 0: # Only if set to automatic
+ if get_setting("ui.touch_controls") == "automatic": # Only if set to automatic
if event is InputEventScreenTouch or event is InputEventScreenDrag:
if not using_touch:
using_touch = true
@@ -175,89 +92,11 @@ func _input(event):
using_touch = false
using_touch_change.emit(using_touch)
-func apply_settings():
- update_fullscreen()
- update_language()
-
- # Anti-aliasing
- match get_setting("aa"):
- 0:
- get_viewport().msaa_2d = Viewport.MSAA_DISABLED
- get_viewport().msaa_3d = Viewport.MSAA_DISABLED
- get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
- 1:
- get_viewport().msaa_2d = Viewport.MSAA_DISABLED
- get_viewport().msaa_3d = Viewport.MSAA_DISABLED
- get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA
- 2:
- get_viewport().msaa_2d = Viewport.MSAA_2X
- get_viewport().msaa_3d = Viewport.MSAA_2X
- get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
- 3:
- get_viewport().msaa_2d = Viewport.MSAA_4X
- get_viewport().msaa_3d = Viewport.MSAA_4X
- get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
-
- # Temporal Anti-aliasing
- get_viewport().use_taa = get_setting("taa")
-
- # UI scale mode
- match get_setting("ui_scale_mode"):
- 0:
- get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS
- 1:
- get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_DISABLED
-
- # UI scale factor
- get_tree().root.content_scale_factor = get_setting("ui_scale_factor")
-
- # Hints
- if not get_setting("tutorial_started"):
- for k in profile["hints"].keys():
- set_hint(k, false)
-
- # Sets all volumes
- Sound.set_volume(0, get_setting("master_volume"))
- Sound.set_volume(1, get_setting("music_volume"))
- Sound.set_volume(2, get_setting("sfx_volume"))
-
- # Touch controls
- match get_setting("touch_controls"):
- # 0: Automatically adjusted
- 1: # Enabled
- using_touch = true
- 2: # Disabled
- using_touch = false
- using_touch_change.emit()
-
- # Input settings
- InputManager.apply_input_map(InputManager.settings_dictionary_to_input_map(get_category_settings("input")))
-
- settings_changed.emit()
-
-func update_language():
- var language = languages[get_setting("language")][0]
- if language == "system": language = OS.get_locale_language()
- TranslationServer.set_locale(language)
-
-func update_fullscreen():
- match get_setting("fullscreen"):
- 0: pass
- 1: DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
- 2: if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN:
- DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
-
func save_profile():
save_dict("user://profile", profile)
func save_settings():
- for v in settings.values():
- v.fetch_setting()
- var dict := {}
- for k in settings.keys():
- var setting: GameSetting = settings[k]
- dict[k] = setting.get_value()
- save_dict("user://settings", dict)
+ save_dict("user://settings", settings)
func save_dict(path: String, dict: Dictionary):
var f = FileAccess.open(path, FileAccess.WRITE)
@@ -271,29 +110,19 @@ func load_dict(path: String, default: Dictionary) -> Dictionary:
return default
var f = FileAccess.open(path, FileAccess.READ)
var saved_dict = f.get_var(true)
-
- if saved_dict != null and saved_dict is Dictionary:
- add_missing_keys(saved_dict, default)
-
return saved_dict
func load_settings(path: String):
- for category: SettingsCategory in default_settings.duplicate(true):
- for k: String in category.settings.keys():
- settings[k] = category.settings[k]
-
- if not FileAccess.file_exists(path):
- print("Skip settings load")
- return
- var f = FileAccess.open(path, FileAccess.READ)
- var saved_dict = f.get_var(true)
-
- if saved_dict != null and saved_dict is Dictionary:
- for k in settings.keys():
- if saved_dict.has(k) and typeof(settings[k].get_value()) == typeof(saved_dict[k]):
- settings[k].set_value(saved_dict[k])
-
- save_settings() # Save updated keys
+ if FileAccess.file_exists(path):
+ var f = FileAccess.open(path, FileAccess.READ)
+ settings = f.get_var(true)
+ else:
+ print("No settings file found.")
+ settings = {}
+ settings_tree = Settings.get_root()
+ settings_tree.check()
+ Settings.apply_initial()
+ save_settings()
func on_mobile() -> bool:
var os_name := OS.get_name()
@@ -307,35 +136,24 @@ func on_high_end() -> bool:
func on_vulkan() -> bool:
return ProjectSettings.get_setting("rendering/rendering_device/driver") == "vulkan"
-func add_missing_keys(dict: Dictionary, reference: Dictionary):
- for k in reference.keys():
- if !dict.has(k):
- dict[k] = reference[k]
- else:
- if dict[k] is Dictionary:
- add_missing_keys(dict[k], reference[k])
-
func get_setting(key: String):
- if settings.has(key):
- return settings[key].get_value()
- else:
+ if !settings.has(key):
push_error("Tried to access setting \"%s\", which does not exist (missing key)" % key)
return null
+ return settings[key]
-func get_category_settings(category_id: String):
- for c: SettingsCategory in default_settings:
- if c.id == category_id:
- return c.settings
- push_error("Category %s not found" % category_id)
- return null
+func set_setting_unchecked(key: String, value):
+ value = value.duplicate(true) if value is Array else value
+ if key in settings and typeof(settings[key]) == typeof(value) and not value is Array and settings[key] == value: return
+ settings[key] = value
+ Settings.trigger_hook(key, value)
+ save_settings()
func set_setting(key: String, value):
if !settings.has(key):
push_error("Tried to set setting \"%s\", which does not yet exist (missing key)" % key)
return
- if get_setting(key) != value:
- settings[key].set_value(value)
- save_settings()
+ else: set_setting_unchecked(key, value)
func get_profile(key: String):
if profile.has(key):
@@ -391,43 +209,8 @@ func find_menu(node: Node) -> Menu:
if node is Menu: return node
else: return find_menu(node.get_parent())
-const NATIVE_LANGUAGE_NAMES = {
- "en": "English",
- "de": "Deutsch",
- "fr": "Français",
- "es": "Español",
- "eu": "euskara",
- "ja": "日本語",
- "he": "עִברִית",
- "tr": "Türkçe",
- "fi": "suomen",
- "ar": "العربية",
- "zh_Hans": "中文 (简化字)",
- "zh_Hant": "中文 (繁體字)",
- "pl": "Polski",
- "pt": "Português",
-}
-
-func language_display(l: String): return "%s (%s)" % [NATIVE_LANGUAGE_NAMES[l], l]
-func language_array() -> Array:
- var lang: Array = [["system", tr("System default")]]
- var to_order : Array = []
- for l in TranslationServer.get_loaded_locales():
- to_order.append([l, language_display(l)])
- to_order.append(["en", language_display("en")])
- to_order = sort_language_array(to_order)
- for i in to_order:
- lang.append(i)
- return lang
-
-func sort_language_array(lang : Array) -> Array:
- var sorting_array : Array = []
- var sorted_lang : Array = []
- for i in lang.size():
- sorting_array.append(lang[i][0])
- sorting_array.sort()
- for shorthand in sorting_array:
- for arr in lang:
- if arr[0] == shorthand:
- sorted_lang.append(arr)
- return sorted_lang
+func language_list():
+ var a = TranslationServer.get_loaded_locales()
+ a.sort()
+ a.insert(0, "system")
+ return a
diff --git a/client/makefile b/client/makefile
index 2f17bee1..085ed748 100644
--- a/client/makefile
+++ b/client/makefile
@@ -37,4 +37,4 @@ po/locales.csv: $(LT)
po/%.po: ../locale/%.ini $(LT)
@mkdir -p po
- $(LT) export-po $< $@ --remap-ids ../locale/en.ini
+ $(LT) export-po $< $@ --fallback ../locale/en.ini
diff --git a/client/map/auto_setup/environment_setup.gd b/client/map/auto_setup/environment_setup.gd
index 3ce8add3..c484ca1d 100644
--- a/client/map/auto_setup/environment_setup.gd
+++ b/client/map/auto_setup/environment_setup.gd
@@ -22,12 +22,9 @@ func set_sky(sky_name: String):
environment.sky.sky_material = load("res://map/environment/presets/%s_sky.tres" % sky_name)
func _ready():
- apply_settings()
- Global.settings_changed.connect(apply_settings)
-
-func apply_settings():
- environment.ssao_enabled = Global.get_setting("ssao")
- environment.sdfgi_enabled = Global.get_setting("gi") == 1 and allow_sdfgi
- environment.glow_enabled = Global.get_setting("glow")
+ Settings.hook_changed_init("graphics.ssao", false, func (x): environment.ssao_enabled = x)
+ Settings.hook_changed_init("graphics.gi", false, func (x): environment.sdfgi_enabled = x == "sdfgi" and allow_sdfgi)
+ Settings.hook_changed_init("graphics.glow", false, func (x): environment.glow_enabled = x)
+
if !Global.on_vulkan():
environment.environment.tonemap_exposure = 0.5
diff --git a/client/map/auto_setup/light_setup.gd b/client/map/auto_setup/light_setup.gd
index 1e256dae..7d1b0b7a 100644
--- a/client/map/auto_setup/light_setup.gd
+++ b/client/map/auto_setup/light_setup.gd
@@ -19,13 +19,12 @@ class_name LightSetup
@export var completely_disable_light_if_shadows_disabled := false
func _ready():
- apply_settings()
- Global.settings_changed.connect(apply_settings)
+ Settings.hook_changed_init("graphics.shadows", false, apply_settings)
-func apply_settings():
+func apply_settings(setting: bool):
if completely_disable_light_if_shadows_disabled:
- visible = Global.get_setting("shadows")
- shadow_enabled = Global.get_setting("shadows")
+ visible = setting
+ shadow_enabled = setting
func set_sky(sky_name: String):
match sky_name:
diff --git a/client/map/map.gd b/client/map/map.gd
index 208665bf..ce3c6dfa 100644
--- a/client/map/map.gd
+++ b/client/map/map.gd
@@ -52,17 +52,18 @@ func clear_tile(pos: Vector2i):
func _ready():
voxelgi_timer.connect("timeout", gi_bake)
- Global.settings_changed.connect(func():
- # is not baked yet but setting is true
- if Global.get_setting("gi") == 2 and not currently_baked:
- gi_bake()
- else:
- currently_baked = false
- voxelgi.data = null
- )
+ Settings.hook_changed("graphics.gi", false, apply_gi_setting)
+
+func apply_gi_setting(state):
+ if state == "voxelgi" and not currently_baked:
+ gi_bake()
+ else:
+ currently_baked = false
+ voxelgi.data = null
+
func gi_bake():
- if not Global.get_setting("gi") == 2: return
+ if Global.get_setting("graphics.gi") != "voxelgi": return
print("Map: Rebaking VoxelGI")
currently_baked = true
gi_bake_blocking()
diff --git a/client/map/tiles/exterior_tree.gd b/client/map/tiles/exterior_tree.gd
index edc08df3..9054cbaa 100644
--- a/client/map/tiles/exterior_tree.gd
+++ b/client/map/tiles/exterior_tree.gd
@@ -27,7 +27,7 @@ func _init(rename: String, _neighbors: Array):
var trunk: Mesh = load("res://map/tiles/tree/trunk_%d.res" % tree)
var leaves: Mesh = load("res://map/tiles/tree/leaves_%d_%s.res" % [
tree,
- "lq" if Global.get_setting("lq_trees") else "hq"
+ "lq" if Global.get_setting("graphics.lq_trees") else "hq"
])
var trunk_instance: MeshInstance3D = MeshInstance3D.new()
trunk_instance.mesh = trunk
diff --git a/client/map/tiles/grass.gd b/client/map/tiles/grass.gd
index b33642a3..4bd3587c 100644
--- a/client/map/tiles/grass.gd
+++ b/client/map/tiles/grass.gd
@@ -25,7 +25,7 @@ func _init(rename: String, _neighbors: Array):
var random = RandomNumberGenerator.new()
random.seed = rename.hash()
- for _i in Global.get_setting("grass_amount"):
+ for _i in Global.get_setting("graphics.grass_amount"):
var g: Node3D = GRASS_SIDE.instantiate()
base_mesh.add_child(g)
g.position = Vector3(random.randf_range(-.5, .5), 0, random.randf_range(-.5, .5))
diff --git a/client/map/tiles/light_tile.gd b/client/map/tiles/light_tile.gd
index fac3ee39..346cc3bb 100644
--- a/client/map/tiles/light_tile.gd
+++ b/client/map/tiles/light_tile.gd
@@ -18,12 +18,5 @@ extends Node3D
@export var lights: Array[Light3D]
func _ready():
- Global.settings_changed.connect(func():
- for l in lights:
- update_shadows()
- )
- update_shadows()
-
-func update_shadows():
- for l in lights:
- l.shadow_enabled = Global.get_setting("shadows")
+ # TODO hook settings
+ for l in lights: l.shadow_enabled = Global.get_setting("graphics.shadows")
diff --git a/client/menu/blur_setup.gd b/client/menu/blur_setup.gd
index 97729074..331d1f47 100644
--- a/client/menu/blur_setup.gd
+++ b/client/menu/blur_setup.gd
@@ -16,8 +16,8 @@
extends Control
func _ready():
- update()
- Global.settings_changed.connect(update)
+ update(Global.get_setting("graphics.ui_blur"))
+ Settings.hook_changed("graphics.ui_blur", false, update)
-func update():
- material.set_shader_parameter("enable_blur", Global.get_setting("ui_blur"))
+func update(state):
+ material.set_shader_parameter("enable_blur", state)
diff --git a/client/menu/character.tscn b/client/menu/character.tscn
index ef0cd842..6652982c 100644
--- a/client/menu/character.tscn
+++ b/client/menu/character.tscn
@@ -82,7 +82,7 @@ grow_horizontal = 2
[node name="Label" type="Label" parent="VBoxContainer/top_panel/a"]
layout_mode = 2
-text = "Username"
+text = "c.settings.username"
horizontal_alignment = 1
[node name="username" type="LineEdit" parent="VBoxContainer/top_panel/a"]
@@ -144,7 +144,7 @@ offset_bottom = 22.0
grow_horizontal = 2
grow_vertical = 2
size_flags_vertical = 8
-text = "Back"
+text = "c.menu.back"
[node name="SceneTransition" parent="." instance=ExtResource("4_c0ocf")]
visible = false
diff --git a/client/menu/credits.gd b/client/menu/credits.gd
index 0eccaae2..52a3b7e6 100644
--- a/client/menu/credits.gd
+++ b/client/menu/credits.gd
@@ -22,13 +22,13 @@ const cc_by_4 := "CC-BY 4.0"
const cc_by_3 := "CC-BY 3.0"
const cc0 := "CC0"
var credits := [
- [tr("Models"), [
+ [tr("c.credits.models"), [
["kenney.nl", "Various Models", cc0],
["Kay Lousberg", "Kitchen tiles", cc0],
["Poly by Google", "Strawberry", cc_by_3],
["Poly by Google", "Fish", cc_by_3]
]],
- [tr("Sounds"), [
+ [tr("c.credits.sounds"), [
["Dryoma", "Footstep sounds", cc_by_4],
["Koops", "Page_Turn_24.wav", cc_by_4],
["InspectorJ", "Pencil, Writing, Close, A.wav", cc_by_4],
@@ -49,8 +49,8 @@ func _ready():
var text = "[center]"
text += "\n\n\n[b]%s[/b]\n\n%s\n\n[b]%s[/b]\n\n\n" % [
- tr("Hurry Curry! - a game about cooking"),
- tr("developed by"),
+ tr("c.credits.title"),
+ tr("c.credits.developed_by"),
"\n".join(contributors)
]
@@ -62,7 +62,7 @@ func _ready():
text += "[cell][left]%s[/left][/cell]" % entry[2]
text += "[/table]\n\n\n"
- text += "\n[b]%s[/b]\n\n\n[/center]" % tr("Thank You For Playing")
+ text += "\n[b]%s[/b]\n\n\n[/center]" % tr("c.credits.thanks")
label.text = text
diff --git a/client/menu/entry.gd b/client/menu/entry.gd
index 5ca6dacb..456709ed 100644
--- a/client/menu/entry.gd
+++ b/client/menu/entry.gd
@@ -18,7 +18,7 @@ extends Menu
func _ready():
super()
- if not Global.get_setting("setup_complete"):
+ if not Global.get_setting("gameplay.setup_complete"):
await submenu("res://menu/setup.tscn")
else:
await submenu("res://menu/main.tscn")
diff --git a/client/menu/game.gd b/client/menu/game.gd
index f50a43a6..a2eb858c 100644
--- a/client/menu/game.gd
+++ b/client/menu/game.gd
@@ -43,7 +43,7 @@ func _menu_cover(state):
game.camera.update_disable_input()
func _process(_delta):
- if Global.get_setting("debug_info"):
+ if Global.get_setting("graphics.debug_info"):
debug_label.show()
debug_label.text = "%d FPS\nDriver: %s" % [Engine.get_frames_per_second(), ProjectSettings.get_setting("rendering/rendering_device/driver")]
else: debug_label.hide()
diff --git a/client/menu/ingame.tscn b/client/menu/ingame.tscn
index ce42bbdd..55678847 100644
--- a/client/menu/ingame.tscn
+++ b/client/menu/ingame.tscn
@@ -94,22 +94,22 @@ layout_mode = 2
[node name="Resume" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Resume"
+text = "c.menu.ingame.resume"
alignment = 0
[node name="Leave" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Join Game"
+text = "c.menu.ingame.join"
alignment = 0
[node name="Lobby" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Cancel game"
+text = "c.menu.ingame.cancel"
alignment = 0
[node name="Reconnect" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Reconnect"
+text = "c.menu.ingame.reconnect"
alignment = 0
[node name="Spacer2" type="Control" parent="Side/Margin/Options"]
@@ -118,7 +118,7 @@ layout_mode = 2
[node name="Settings" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Settings"
+text = "c.menu.settings"
alignment = 0
[node name="Spacer3" type="Control" parent="Side/Margin/Options"]
@@ -127,12 +127,12 @@ layout_mode = 2
[node name="MainMenu" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Main menu"
+text = "c.menu.ingame.main_menu"
alignment = 0
[node name="Quit" type="Button" parent="Side/Margin/Options"]
layout_mode = 2
-text = "Quit game"
+text = "c.menu.quit"
alignment = 0
[connection signal="pressed" from="Side/Margin/Options/Resume" to="." method="_on_resume_pressed"]
diff --git a/client/menu/lobby.tscn b/client/menu/lobby.tscn
index 05b6507c..d1fe2233 100644
--- a/client/menu/lobby.tscn
+++ b/client/menu/lobby.tscn
@@ -124,7 +124,7 @@ layout_mode = 2
[node name="EnableBots" type="CheckButton" parent="HBoxContainer/Bottom/MarginContainer/VBoxContainer/Bots"]
layout_mode = 2
-text = "Enable bots"
+text = "c.menu.lobby.enable_bots"
[node name="ScrollContainerCustom" type="ScrollContainer" parent="HBoxContainer/Bottom/MarginContainer/VBoxContainer/Bots"]
visible = false
@@ -145,7 +145,7 @@ alignment = 1
[node name="JoinSpectate" parent="HBoxContainer/Bottom/MarginContainer/VBoxContainer/VBoxContainer" instance=ExtResource("7_t6mox")]
custom_minimum_size = Vector2(148, 0)
layout_mode = 2
-text = "Spectate"
+text = "c.menu.ingame.spectate"
expand_icon = true
controller_texture = ExtResource("11_5uugf")
press_action = "join_spectate"
@@ -153,7 +153,7 @@ press_action = "join_spectate"
[node name="Start" parent="HBoxContainer/Bottom/MarginContainer/VBoxContainer/VBoxContainer" instance=ExtResource("7_t6mox")]
custom_minimum_size = Vector2(148, 0)
layout_mode = 2
-text = "Start game"
+text = "c.menu.lobby.start_game"
expand_icon = true
controller_texture = ExtResource("9_q14bw")
press_action = "start_game"
diff --git a/client/menu/main.tscn b/client/menu/main.tscn
index 94726109..26decd2b 100644
--- a/client/menu/main.tscn
+++ b/client/menu/main.tscn
@@ -63,27 +63,27 @@ layout_mode = 2
[node name="play" type="Button" parent="side/margin/options/first"]
layout_mode = 2
-text = "Play"
+text = "c.menu.play"
alignment = 0
[node name="change_character" type="Button" parent="side/margin/options/first"]
layout_mode = 2
-text = "My Chef"
+text = "c.menu.my_chef"
alignment = 0
[node name="settings" type="Button" parent="side/margin/options/first"]
layout_mode = 2
-text = "Settings"
+text = "c.menu.settings"
alignment = 0
[node name="credits" type="Button" parent="side/margin/options/first"]
layout_mode = 2
-text = "Credits"
+text = "c.menu.credits"
alignment = 0
[node name="quit" type="Button" parent="side/margin/options/first"]
layout_mode = 2
-text = "Quit"
+text = "c.menu.quit"
alignment = 0
[connection signal="pressed" from="side/margin/options/first/play" to="." method="_on_play_pressed"]
diff --git a/client/menu/overlay.tscn b/client/menu/overlay.tscn
index e28013db..0947e308 100644
--- a/client/menu/overlay.tscn
+++ b/client/menu/overlay.tscn
@@ -67,16 +67,16 @@ layout_mode = 2
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 25
-text = "Completed"
+text = "c.score.completed"
[node name="Spacer" type="Control" parent="Score/Paper/Margin/Lines/Line1"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Completed" type="Label" parent="Score/Paper/Margin/Lines/Line1"]
+auto_translate_mode = 2
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
-auto_translate = false
theme_override_colors/font_color = Color(0, 0.278431, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 35
@@ -91,16 +91,16 @@ layout_mode = 2
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 25
-text = "Failed"
+text = "c.score.failed"
[node name="Spacer" type="Control" parent="Score/Paper/Margin/Lines/Line2"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Failed" type="Label" parent="Score/Paper/Margin/Lines/Line2"]
+auto_translate_mode = 2
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
-auto_translate = false
theme_override_colors/font_color = Color(0.505882, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 35
@@ -115,16 +115,16 @@ layout_mode = 2
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 35
-text = "Points"
+text = "c.score.points"
[node name="Spacer" type="Control" parent="Score/Paper/Margin/Lines/Line3"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Points" type="Label" parent="Score/Paper/Margin/Lines/Line3"]
+auto_translate_mode = 2
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
-auto_translate = false
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 45
@@ -156,9 +156,9 @@ texture = ExtResource("3_oum5g")
layout_mode = 0
[node name="Seconds" type="Label" parent="Time/Paper/Line"]
+auto_translate_mode = 2
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
-auto_translate = false
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 45
@@ -166,8 +166,8 @@ text = "300"
horizontal_alignment = 2
[node name="Point" type="Label" parent="Time/Paper/Line"]
+auto_translate_mode = 2
layout_mode = 2
-auto_translate = false
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 45
@@ -175,8 +175,8 @@ text = "."
horizontal_alignment = 1
[node name="Decimals" type="Label" parent="Time/Paper/Line"]
+auto_translate_mode = 2
layout_mode = 2
-auto_translate = false
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_fonts/font = ExtResource("3_u54fv")
theme_override_font_sizes/font_size = 45
diff --git a/client/menu/play.tscn b/client/menu/play.tscn
index 959ca760..b91f7bda 100644
--- a/client/menu/play.tscn
+++ b/client/menu/play.tscn
@@ -59,7 +59,7 @@ layout_mode = 2
[node name="quick_connect" type="Button" parent="side/margin/options/second"]
layout_mode = 2
-text = "Quick Connect"
+text = "c.menu.play.quick_connect"
alignment = 0
[node name="connect" type="HBoxContainer" parent="side/margin/options/second"]
@@ -73,7 +73,7 @@ placeholder_text = "wss://example.org"
[node name="connect" type="Button" parent="side/margin/options/second/connect"]
layout_mode = 2
-text = "Connect"
+text = "c.menu.play.connect"
[node name="server" type="HBoxContainer" parent="side/margin/options/second"]
layout_mode = 2
@@ -81,12 +81,12 @@ layout_mode = 2
[node name="control" type="Button" parent="side/margin/options/second/server"]
layout_mode = 2
size_flags_horizontal = 3
-text = "Server"
+text = "c.menu.play.server"
alignment = 0
[node name="connect" type="Button" parent="side/margin/options/second/server"]
layout_mode = 2
-text = "Connect"
+text = "c.menu.play.connect"
[node name="spacer2" type="Control" parent="side/margin/options/second"]
custom_minimum_size = Vector2(0, 10)
@@ -94,7 +94,7 @@ layout_mode = 2
[node name="back" type="Button" parent="side/margin/options/second"]
layout_mode = 2
-text = "Back"
+text = "c.menu.back"
alignment = 0
[connection signal="pressed" from="side/margin/options/second/quick_connect" to="." method="_on_quick_connect_pressed"]
diff --git a/client/menu/popup_message.gd b/client/menu/popup_message.gd
index 90e86faa..1464e20c 100644
--- a/client/menu/popup_message.gd
+++ b/client/menu/popup_message.gd
@@ -109,24 +109,24 @@ func _input(_event):
Global.set_hint("has_reset", true)
func _on_boost_timeout():
- if not Global.get_hint("has_boosted") and not Global.get_setting("touch_controls"):
+ if not Global.get_hint("has_boosted") and not Global.get_setting("ui.touch_controls"):
display_hint_msg(tr("Press %s to boost") % display_keybind(tr("SHIFT"), "B"))
func _on_move_timeout():
- if not Global.get_hint("has_moved") and not Global.get_setting("touch_controls"):
+ if not Global.get_hint("has_moved") and not Global.get_setting("ui.touch_controls"):
display_hint_msg(tr("Use %s to move") % display_keybind("WASD", tr("left stick")))
func _on_interact_timeout():
- if not Global.get_hint("has_interacted") and not Global.get_setting("touch_controls"):
+ if not Global.get_hint("has_interacted") and not Global.get_setting("ui.touch_controls"):
var keybind = display_keybind(tr("SPACE"), "A")
display_hint_msg(tr("Press %s to pick up items and hold %s to interact with tools") % [keybind, keybind])
func _on_reset_timeout():
- if not Global.get_hint("has_reset") and not Global.get_setting("touch_controls"):
+ if not Global.get_hint("has_reset") and not Global.get_setting("ui.touch_controls"):
display_hint_msg(tr("Press %s to reset the camera view") % display_keybind("R", "Y"))
func _on_zoom_timeout():
- if not Global.get_hint("has_zoomed") and not Global.get_setting("touch_controls"):
+ if not Global.get_hint("has_zoomed") and not Global.get_setting("ui.touch_controls"):
display_hint_msg(tr("Use %s to zoom in/out") % display_keybind(tr("PageUp/PageDown"), "LT/RT"))
func display_keybind(keyboard: String, joypad: String, touch = null) -> String:
@@ -143,11 +143,11 @@ func any_action_just_pressed(actions: Array) -> bool:
return false
func _on_rotate_camera_timeout():
- if not Global.get_hint("has_rotated") and not Global.get_setting("touch_controls"):
+ if not Global.get_hint("has_rotated") and not Global.get_setting("ui.touch_controls"):
display_hint_msg(tr("Use %s to rotate the camera view") % display_keybind(tr("arrow keys"), tr("right stick")))
func _on_nametags_timeout():
- if not Global.get_hint("has_seen_nametags") and not Global.get_setting("usernames"):
+ if not Global.get_hint("has_seen_nametags") and not Global.get_setting("graphics.usernames"):
Global.set_hint("has_seen_nametags", true)
display_hint_msg(tr("Username tags can be enabled/disabled in the settings"))
diff --git a/client/menu/settings.gd b/client/menu/settings.gd
index eb143900..f035f712 100644
--- a/client/menu/settings.gd
+++ b/client/menu/settings.gd
@@ -16,52 +16,17 @@
#
extends Menu
-const SETTINGS_ROW_SCENE = preload("res://menu/settings/settings_row.tscn")
-
-@onready var settings_tabs: TabContainer = $OuterGap/Panel/InnerGap/VBoxContainer/TabContainer
+@onready var container = $OuterGap/Panel/InnerGap/VBoxContainer
func _ready():
super()
- update_rows()
+ var row = Global.settings_tree.create_row()
+ container.add_child(row)
+ container.move_child(row, 1)
func _on_back_pressed():
exit()
func exit():
Global.save_settings()
- Global.apply_settings()
super()
-
-func update_rows(fix_focus = false):
- for c in settings_tabs.get_children():
- c.queue_free()
-
- for category: SettingsCategory in Global.default_settings:
- var category_settings = category.settings
- var scroll := ScrollContainerCustom.new()
- var options := VBoxContainer.new()
- scroll.name = category.name
- scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- settings_tabs.add_child(scroll)
- options.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- scroll.add_child(options)
-
- var category_presets = category.presets
- if category_presets != null:
- for i: Preset in category_presets:
- var row: SettingsRow = SETTINGS_ROW_SCENE.instantiate()
- options.add_child(row)
- row.label.text = i.label
- row.reset_button.visible = false
- for b in i.buttons():
- row.value_parent.add_child(b)
-
- for k: String in category_settings.keys():
- var row: SettingsRow = Global.settings[k].get_row()
- options.add_child(row)
-
- if fix_focus:
- pass
- # TODO: Not implemented!
- # await get_tree().process_frame
- # Global.focus_first(self)
diff --git a/client/menu/settings.tscn b/client/menu/settings.tscn
index 9f523f7c..0a55e222 100644
--- a/client/menu/settings.tscn
+++ b/client/menu/settings.tscn
@@ -1,12 +1,10 @@
-[gd_scene load_steps=6 format=3 uid="uid://8ic77jmadadj"]
+[gd_scene load_steps=5 format=3 uid="uid://8ic77jmadadj"]
[ext_resource type="Theme" uid="uid://b0qmvo504e457" path="res://menu/theme/theme.tres" id="1_foq3a"]
[ext_resource type="Script" path="res://menu/settings.gd" id="2_3hgm8"]
[ext_resource type="Material" uid="uid://beea1pc5nt67r" path="res://menu/theme/dark_blur_material.tres" id="3_8nykw"]
[ext_resource type="Script" path="res://menu/blur_setup.gd" id="4_v6q3y"]
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_85urc"]
-
[node name="SettingsMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
@@ -52,11 +50,6 @@ size_flags_horizontal = 0
theme_override_font_sizes/font_size = 36
text = "Settings"
-[node name="TabContainer" type="TabContainer" parent="OuterGap/Panel/InnerGap/VBoxContainer"]
-layout_mode = 2
-size_flags_vertical = 3
-theme_override_styles/panel = SubResource("StyleBoxEmpty_85urc")
-
[node name="Back" type="Button" parent="OuterGap/Panel/InnerGap/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 8
diff --git a/client/menu/settings/dropdown_setting.gd b/client/menu/settings/dropdown_setting.gd
index e57fc40f..3d6b7c80 100644
--- a/client/menu/settings/dropdown_setting.gd
+++ b/client/menu/settings/dropdown_setting.gd
@@ -18,23 +18,14 @@ extends GameSetting
var options: Array
-func _init(new_description: String, new_preset: int, new_options: Array):
- assert(new_preset < new_options.size())
- super(new_description, new_preset)
+func _init(new_id: String, new_default, new_options: Array):
+ super(new_id, new_default)
options = new_options
-func _update_row():
- super()
+func create_row():
+ var row = super()
row.value_node = OptionButton.new()
- for i in options:
- row.value_node.add_item(i)
- row.value_node.select(_value)
-
-func fetch_setting():
- if row != null:
- _value = row.value_node.selected
-
-func set_value(v):
- super(v)
- if row != null:
- row.value_node.selected = _value
+ for i in options: row.value_node.add_item(tr(nskey + "." + i))
+ Settings.hook_changed_init(key, true, func (value): row.value_node.select(options.find(value)))
+ row.value_node.item_selected.connect(func(item): Global.set_setting(key, options[item]))
+ return row
diff --git a/client/menu/settings/game_setting.gd b/client/menu/settings/game_setting.gd
index afe1fe65..a98d5abb 100644
--- a/client/menu/settings/game_setting.gd
+++ b/client/menu/settings/game_setting.gd
@@ -16,39 +16,27 @@
class_name GameSetting
extends Object
-var preset
-var _value
-var description: String
+var default
+var key: String
+var nskey: String
-var row: SettingsRow
+func _init(new_id: String, new_default = null):
+ default = new_default
+ key = new_id
-func _init(new_description: String, new_preset):
- preset = new_preset
- set_value(new_preset)
- description = new_description
+func set_parent(parent: GameSetting):
+ if parent != null: key = parent.key + "." + key
+ nskey = "c.settings." + key
-func reset():
- set_value(preset)
-
-func get_row() -> SettingsRow:
- _update_row()
+func create_row():
+ var row = preload("res://menu/settings/settings_row.tscn").instantiate()
+ row.description = tr(nskey)
+ row.reset.connect(func(): Global.set_setting(key, default))
return row
-func _update_row():
- if row != null:
- row.queue_free()
- row = preload("res://menu/settings/settings_row.tscn").instantiate()
- row.description = description
- row.reset.connect(reset)
-
-func fetch_setting():
- pass
-
-func get_value():
- return _value
-
-func set_value(v):
- if v is Array:
- _value = v.duplicate(true)
- else:
- _value = v
+func check():
+ if default != null:
+ if not key in Global.settings:
+ Global.set_setting_unchecked(key, default)
+ if typeof(default) != typeof(Global.settings[key]):
+ Global.set_setting_unchecked(key, default)
diff --git a/client/menu/settings/input/input_manager.gd b/client/menu/settings/input/input_manager.gd
index 96cdca09..d216884b 100644
--- a/client/menu/settings/input/input_manager.gd
+++ b/client/menu/settings/input/input_manager.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 tpart
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -15,32 +16,6 @@
#
extends Node
-var action_descriptions = {
- "forwards": tr("Move forwards"),
- "backwards": tr("Move backwards"),
- "left": tr("Move left"),
- "right": tr("Move right"),
- "rotate_left": tr("Rotate camera to the left"),
- "rotate_right": tr("Rotate camera to the right"),
- "rotate_up": tr("Rotate camera upwards"),
- "rotate_down": tr("Rotate camera downwards"),
- "interact": tr("Interact", "Interacting with items, etc."),
- "boost": tr("Boost movement"),
- "zoom_in": tr("Zoom in"),
- "zoom_out": tr("Zoom out"),
- "chat": tr("Toggle chat", "Toggle chat on or off"),
- "reset": tr("Reset camera view"),
- "fullscreen": tr("Toggle fullscreen"),
- "previous": tr("Previous"),
- "next": tr("Next"),
- "start_game": tr("Start game"),
- "join_spectate": tr("Join / Spectate"),
- "zoom_in_discrete": tr("Zoom in (discrete)"),
- "zoom_out_discrete": tr("Zoom out (discrete)"),
- "scroll_down": tr("Scroll down"),
- "scroll_up": tr("Scroll up"),
-}
-
var default_input_map = {}
var input_map
@@ -56,19 +31,12 @@ func get_input_map() -> Dictionary:
kb[a] = input_events
return kb
-func input_map_to_settings_dictionary(map: Dictionary) -> Dictionary:
- var settings_dict := {}
+func input_map_to_settings(map: Dictionary) -> Array:
+ var entries := []
for k in map.keys():
var events = map[k]
- settings_dict[k] = InputSetting.new(action_descriptions[k] if action_descriptions.has(k) else k, events)
- return settings_dict
-
-func settings_dictionary_to_input_map(settings: Dictionary) -> Dictionary:
- var map := {}
- for k in settings.keys():
- var setting: InputSetting = settings[k]
- map[k] = setting.get_value()
- return map
+ entries.append(InputSetting.new(k, events))
+ return entries
func change_input_map_action(action_name: String, events: Array, save: bool = true):
if !InputMap.has_action(action_name):
diff --git a/client/menu/settings/input/input_setting.gd b/client/menu/settings/input/input_setting.gd
index eec68bdc..7388af78 100644
--- a/client/menu/settings/input/input_setting.gd
+++ b/client/menu/settings/input/input_setting.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 tpart
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -18,17 +19,9 @@ extends GameSetting
const INPUT_VALUE_NODE_SCENE = preload("res://menu/settings/input/input_value_node.tscn")
-func _update_row():
- super()
+func create_row():
+ var row = super()
row.value_node = INPUT_VALUE_NODE_SCENE.instantiate()
- row.value_node.value = _value
-
-func fetch_setting():
- if row != null:
- _value = row.value_node.value
-
-func set_value(v):
- super(v)
- if row != null:
- row.value_node.value = _value
- row.value_node.update()
+ Settings.hook_changed_init(key, true, func(value): row.value_node.value = value)
+ row.value_node.changed.connect(func(): Global.set_setting(key, row.value_node.value))
+ return row
diff --git a/client/menu/settings/input/input_value_node.gd b/client/menu/settings/input/input_value_node.gd
index 125a946b..9f89416b 100644
--- a/client/menu/settings/input/input_value_node.gd
+++ b/client/menu/settings/input/input_value_node.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 tpart
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -19,6 +20,8 @@ class_name InputValueNode
var value: Array[InputEvent] = []
var listening := false
+signal changed()
+
@onready var actions_container: VBoxContainer = $ActionsContainer
@onready var add_button: Button = $Add
@onready var add_text = add_button.text
@@ -55,6 +58,7 @@ func update(fix_focus: bool = false):
func erase_event(e: InputEvent):
value.erase(e)
update(true)
+ changed.emit()
func _input(e: InputEvent):
if listening:
@@ -66,6 +70,7 @@ func _input(e: InputEvent):
value.append(e)
_on_add_pressed()
update()
+ changed.emit()
func events_equal(e1: InputEvent, e2: InputEvent) -> bool:
if e1 is InputEventKey and e2 is InputEventKey:
diff --git a/client/menu/settings/preset.gd b/client/menu/settings/preset_row.gd
index bb13b570..af6cfe0e 100644
--- a/client/menu/settings/preset.gd
+++ b/client/menu/settings/preset_row.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 nokoe
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -13,27 +14,32 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
-class_name Preset
-extends Object
+class_name PresetRow
+extends GameSetting
-var label: String
var options: Dictionary
+var arr: Array[Button]
-func _init(name_: String, options_: Dictionary):
- label = name_
+func _init(id: String, options_: Dictionary):
+ super(id)
options = options_
+var prefix = ""
+func set_parent(parent):
+ super(parent)
+ if parent != null: prefix = parent.key
+
func apply(preset_name: String):
- var preset: Dictionary = options[preset_name]
+ var preset = options[preset_name]
for i in preset.keys():
- var setting_name: String = i
- Global.set_setting(setting_name, preset[setting_name])
+ Global.set_setting(prefix + "." + i, preset[i])
-func buttons() -> Array[Button]:
- var arr: Array[Button] = []
+func create_row():
+ var row = super()
+ row.value_node = HBoxContainer.new()
for i in options.keys():
var button := Button.new()
button.pressed.connect(apply.bind(i))
- button.text = i
- arr.push_back(button)
- return arr
+ button.text = tr(nskey + "." + i)
+ row.value_node.add_child(button)
+ return row
diff --git a/client/menu/settings/range_setting.gd b/client/menu/settings/range_setting.gd
index d13e2262..b119a205 100644
--- a/client/menu/settings/range_setting.gd
+++ b/client/menu/settings/range_setting.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 nokoe
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -21,27 +22,20 @@ var max_value: float
var tick_count
var smooth: bool
-func _init(new_description: String, new_preset: float, new_min_value: float, new_max_value: float, new_smooth: bool = true, new_tick_count = null):
- super(new_description, new_preset)
+func _init(new_id: String, new_default: float, new_min_value: float, new_max_value: float, new_smooth: bool = true, new_tick_count = null):
+ super(new_id, new_default)
min_value = new_min_value
max_value = new_max_value
tick_count = new_tick_count
smooth = new_smooth
-func _update_row():
- super()
+func create_row():
+ var row = super()
row.value_node = HSlider.new()
row.value_node.min_value = min_value
row.value_node.max_value = max_value
row.value_node.tick_count = abs(max_value - min_value) if tick_count == null else tick_count
row.value_node.step = 0 if smooth else (1 if tick_count == null else abs(max_value - min_value) / (tick_count - 1))
- row.value_node.value = _value
-
-func fetch_setting():
- if row != null:
- _value = row.value_node.value
-
-func set_value(v):
- super(v)
- if row != null:
- row.value_node.value = _value
+ Settings.hook_changed_init(key, true, func(value): row.value_node.value = value)
+ row.value_node.value_changed.connect(func(value): Global.set_setting(key, value))
+ return row
diff --git a/client/menu/settings/settings_category.gd b/client/menu/settings/settings_category.gd
index c4601429..b5d02d8f 100644
--- a/client/menu/settings/settings_category.gd
+++ b/client/menu/settings/settings_category.gd
@@ -14,15 +14,32 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
class_name SettingsCategory
-extends Object
+extends GameSetting
-var name: String
-var id: String
-var settings: Dictionary # Dictionary[String, GameSetting]
-var presets # Array[Preset] | null
+var settings: Array # Dictionary[String, GameSetting]
-func _init(new_name: String, new_id: String, new_settings: Dictionary, new_presets = null):
- name = new_name
- id = new_id
+var options: VBoxContainer
+
+func _init(new_id: String, new_settings: Array):
+ super(new_id)
settings = new_settings
- presets = new_presets
+
+func set_parent(parent: GameSetting):
+ super(parent)
+ for c in settings:
+ c.set_parent(self)
+
+func create_row():
+ var row = ScrollContainerCustom.new()
+ var options = VBoxContainer.new()
+ row.name = tr(nskey)
+ row.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ options.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ row.add_child(options)
+
+ for r in settings: options.add_child(r.create_row())
+ return row
+
+func check():
+ for c in settings:
+ c.check()
diff --git a/client/menu/settings/settings_root.gd b/client/menu/settings/settings_root.gd
new file mode 100644
index 00000000..1beb0d9b
--- /dev/null
+++ b/client/menu/settings/settings_root.gd
@@ -0,0 +1,34 @@
+# Hurry Curry! - a game about cooking
+# Copyright 2024 metamuffin
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+extends GameSetting
+class_name SettingsRoot
+
+var children: Array
+func _init(new_children: Array):
+ super("root")
+ children = new_children
+ for c in children:
+ c.set_parent(null)
+
+func create_row():
+ var row = TabContainer.new()
+ row.size_flags_vertical = Control.SIZE_EXPAND_FILL
+ for r in children: row.add_child(r.create_row())
+ return row
+
+func check():
+ for c in children:
+ c.check()
diff --git a/client/menu/settings/settings_row.gd b/client/menu/settings/settings_row.gd
index f5621d78..68340918 100644
--- a/client/menu/settings/settings_row.gd
+++ b/client/menu/settings/settings_row.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 nokoe
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
diff --git a/client/menu/settings/text_setting.gd b/client/menu/settings/text_setting.gd
index faafa610..dc9352ab 100644
--- a/client/menu/settings/text_setting.gd
+++ b/client/menu/settings/text_setting.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 nokoe
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -18,21 +19,14 @@ extends GameSetting
var placeholder: String
-func _init(new_description: String, new_preset: String, new_placeholder: String = ""):
- super(new_description, new_preset)
+func _init(new_id: String, new_default: String, new_placeholder: String = ""):
+ super(new_id, new_default)
placeholder = new_placeholder
-func _update_row():
- super()
+func create_row():
+ var row = super()
row.value_node = LineEdit.new()
- row.value_node.text = _value
row.value_node.placeholder_text = placeholder
-
-func fetch_setting():
- if row != null:
- _value = row.value_node.text
-
-func set_value(v):
- super(v)
- if row != null:
- row.value_node.text = _value
+ row.value_node.text_changed.connect(func(text): Global.set_setting(key, text))
+ Settings.hook_changed_init(key, true, func(text): row.value_node.text = text)
+ return row
diff --git a/client/menu/settings/toggle_setting.gd b/client/menu/settings/toggle_setting.gd
index 6d4150d4..8e0c030c 100644
--- a/client/menu/settings/toggle_setting.gd
+++ b/client/menu/settings/toggle_setting.gd
@@ -1,5 +1,6 @@
# Hurry Curry! - a game about cooking
# Copyright 2024 nokoe
+# Copyright 2024 metamuffin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
@@ -16,19 +17,12 @@
class_name ToggleSetting
extends GameSetting
-func _init(new_description: String, new_preset: bool):
- super(new_description, new_preset)
+func _init(new_id: String, new_default: bool):
+ super(new_id, new_default)
-func fetch_setting():
- if row != null:
- _value = row.value_node.button_pressed
-
-func _update_row():
- super()
+func create_row():
+ var row = super()
row.value_node = CheckButton.new()
- row.value_node.button_pressed = _value
-
-func set_value(v):
- super(v)
- if row != null:
- row.value_node.button_pressed = _value
+ row.value_node.pressed.connect(func(): Global.set_setting(key, row.value_node.button_pressed))
+ Settings.hook_changed_init(key, true, func(value): row.value_node.button_pressed = value)
+ return row
diff --git a/client/menu/setup.gd b/client/menu/setup.gd
index 6c3c90cd..16944c7c 100644
--- a/client/menu/setup.gd
+++ b/client/menu/setup.gd
@@ -73,5 +73,5 @@ func _on_sign_pressed():
Global.set_profile("username", username.text)
Global.set_profile("character", character)
- Global.set_setting("setup_complete", true)
+ Global.set_setting("gameplay.setup_complete", true)
replace_menu("res://menu/main.tscn")
diff --git a/client/menu/setup.tscn b/client/menu/setup.tscn
index 9d8e4975..53c4565e 100644
--- a/client/menu/setup.tscn
+++ b/client/menu/setup.tscn
@@ -209,8 +209,8 @@ layout_mode = 2
[node name="LineEdit" type="LineEdit" parent="ScrollContainer/Control/TextureRect/PaperMargin/Contents/PositionEntry"]
custom_minimum_size = Vector2(300, 30)
layout_mode = 2
-theme_override_colors/font_color = Color(0.458824, 0, 0, 1)
theme_override_colors/font_uneditable_color = Color(0.458824, 0, 0, 1)
+theme_override_colors/font_color = Color(0.458824, 0, 0, 1)
editable = false
[node name="LineEdit2" type="Label" parent="ScrollContainer/Control/TextureRect/PaperMargin/Contents/PositionEntry/LineEdit"]
diff --git a/client/menu/warning_popup.gd b/client/menu/warning_popup.gd
index 20741834..fd23a30a 100644
--- a/client/menu/warning_popup.gd
+++ b/client/menu/warning_popup.gd
@@ -2,7 +2,6 @@ extends Menu
class_name WarningPopup
func _ready():
- print(self.data)
$CenterContainer/Panel/MarginContainer/VBoxContainer/Message.text = self.data
func _on_accept_pressed():
diff --git a/client/multiplayer.gd b/client/multiplayer.gd
index d8c6c1ff..168e62e6 100644
--- a/client/multiplayer.gd
+++ b/client/multiplayer.gd
@@ -85,10 +85,8 @@ func _process(_delta):
handle_packet(socket.get_packet())
elif state == WebSocketPeer.STATE_CLOSED:
var code = socket.get_close_code()
- var reason = socket.get_close_reason() if code == socket.STATE_CLOSED else tr("unavailable", "The reason for the websocket closing is unavailable")
- connection_closed.emit(
- tr("WebSocket closed with code: %d, reason %s. Clean: %s") % [code, reason, code != -1]
- )
+ var reason = socket.get_close_reason() if code == socket.STATE_CLOSED else tr("c.error.websocket.unavailable")
+ connection_closed.emit(tr("c.error.websocket") % [code, reason, code != -1])
self.queue_free()
func handle_packet(bytes: PackedByteArray):
@@ -108,7 +106,7 @@ func handle_packet(bytes: PackedByteArray):
if major != VERSION_MAJOR and minor >= VERSION_MINOR:
socket.close()
connected = false
- connection_closed.emit(tr("Server and client versions do not match. Server: %d.%d, Client: %d.%d.\nAre you sure the game is up to date?") % [major, minor, VERSION_MAJOR, VERSION_MINOR])
+ connection_closed.emit(tr("c.error.version_mismatch") % [major, minor, VERSION_MAJOR, VERSION_MINOR])
"data":
var item_names = decoded["data"]["item_names"]
var tile_names = decoded["data"]["tile_names"]
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index 81315630..142d5f47 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -60,7 +60,7 @@ func _process(delta):
func _process_movement(delta):
var input = Input.get_vector("left", "right", "forwards", "backwards") if is_input_enabled() else Vector2.ZERO
- var boost = Input.is_action_pressed("boost") or (Global.get_setting("latch_boost") and boosting)
+ var boost = Input.is_action_pressed("boost") or (Global.get_setting("gameplay.latch_boost") and boosting)
input = input.rotated( - game.camera.angle_target)
if Input.is_action_pressed("interact") or Input.is_action_just_released("interact"):
input *= 0
diff --git a/client/player/follow_camera.gd b/client/player/follow_camera.gd
index 516b1ba1..88b6cad4 100644
--- a/client/player/follow_camera.gd
+++ b/client/player/follow_camera.gd
@@ -71,12 +71,12 @@ func reset():
func follow(delta):
if not _disable_input: angle_target += Input.get_axis("rotate_left", "rotate_right") * (
- ROTATE_SPEED * delta * (-1 if Global.get_setting("invert_camera") else 1)
+ ROTATE_SPEED * delta * (-1 if Global.get_setting("gameplay.invert_camera") else 1)
)
angle = G.interpolate_angle(angle, angle_target, delta * ROTATE_WEIGHT)
if not _disable_input: angle_up_target += Input.get_axis("rotate_down", "rotate_up") * (
- ROTATE_UP_SPEED * delta * (-1 if Global.get_setting("invert_camera") else 1)
+ ROTATE_UP_SPEED * delta * (-1 if Global.get_setting("gameplay.invert_camera") else 1)
)
angle_up_target = clamp(angle_up_target, ANGLE_UP_MIN, ANGLE_UP_MAX)
angle_up = G.interpolate_angle(angle_up, angle_up_target, delta * ROTATE_UP_WEIGHT)
@@ -87,7 +87,7 @@ func follow(delta):
new_transform.origin = target.position + offset
new_transform = new_transform.looking_at(target.position)
- if Global.get_setting("interpolate_camera_rotation"):
+ if Global.get_setting("gameplay.interpolate_camera_rotation"):
transform.basis = Basis.from_euler(Vector3(
G.interpolate_angle(transform.basis.get_euler().x, new_transform.basis.get_euler().x, delta * LOOK_WEIGHT),
G.interpolate_angle(transform.basis.get_euler().y, new_transform.basis.get_euler().y, delta * LOOK_WEIGHT),
diff --git a/client/player/player.gd b/client/player/player.gd
index d5837d47..f418337b 100644
--- a/client/player/player.gd
+++ b/client/player/player.gd
@@ -77,18 +77,17 @@ func _ready():
character.select_hairstyle(character_idx)
clear_timer.timeout.connect(clear_message)
- update_username_tag()
- Global.settings_changed.connect(update_username_tag)
+ Settings.hook_changed_init("gameplay.usernames", false, update_username_tag)
func update_position(new_position: Vector2, new_rotation: float, new_boosting: bool):
position_ = new_position
rotation_ = new_rotation
boosting = new_boosting
-func update_username_tag():
+func update_username_tag(state):
var tag: Label3D = character.username_tag
tag.text = username
- tag.visible = Global.get_setting("usernames")
+ tag.visible = state
func set_item(i: Item):
i.owned_by = hand_base
diff --git a/client/server.gd b/client/server.gd
index 3529e7e4..40d87672 100644
--- a/client/server.gd
+++ b/client/server.gd
@@ -85,18 +85,16 @@ func _server_exec():
sem.post()
func get_server_path() -> String:
- var path: String = Global.get_setting("server_binary")
+ var path: String = Global.get_setting("other.server_binary")
if path != "":
return path
else:
return "hurrycurry-server"
func get_server_data():
- var path: String = Global.get_setting("server_data")
- if path != "":
- return path
- else:
- return null
+ var path: String = Global.get_setting("other.server_data")
+ if path != "": return path
+ else: return null
func _process(_delta):
match state:
diff --git a/client/settings.gd b/client/settings.gd
new file mode 100644
index 00000000..2c3ae9a5
--- /dev/null
+++ b/client/settings.gd
@@ -0,0 +1,165 @@
+# Hurry Curry! - a game about cooking
+# Copyright 2024 metamuffin
+# Copyright 2024 tpart
+# Copyright 2024 nokoe
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+extends Node
+class_name Settings
+
+static func get_root():
+ return SettingsRoot.new([
+ SettingsCategory.new("gameplay", [
+ ToggleSetting.new("interpolate_camera_rotation", false),
+ ToggleSetting.new("invert_camera", false),
+ ToggleSetting.new("usernames", true),
+ ToggleSetting.new("setup_complete", false),
+ ToggleSetting.new("tutorial_started", false),
+ ToggleSetting.new("latch_boost", true),
+ ]),
+ SettingsCategory.new("graphics", [
+ PresetRow.new("preset", {
+ "low": {"ui_blur": true, "aa": "disabled", "ssao": false, "taa": false, "shadows": false, "glow": false, "grass_amount": 0, "lq_trees": true},
+ "medium": {"ui_blur": true, "aa": "fx", "ssao": false, "taa": false, "shadows": true, "glow": false, "grass_amount": 0, "lq_trees": false},
+ "high": {"ui_blur": true, "aa": "ms2x", "ssao": true, "taa": false, "shadows": true, "glow": true, "grass_amount": 16, "lq_trees": false}
+ }),
+ DropdownSetting.new("fullscreen", "keep", ["keep", "always", "never"]),
+ DropdownSetting.new("aa", "ms2x" if Global.on_high_end() else "disabled", ["disabled", "fx", "ms2x", "ms4x"]),
+ ToggleSetting.new("ssao", true if Global.on_high_end() else false),
+ ToggleSetting.new("taa", false),
+ DropdownSetting.new("gi", "disabled", ["disabled", "sdfgi", "voxelgi"]),
+ ToggleSetting.new("shadows", true if Global.on_high_end() else false),
+ ToggleSetting.new("glow", true if Global.on_high_end() else false),
+ RangeSetting.new("grass_amount", 16 if Global.on_high_end() else 0, 0, 32, false),
+ ToggleSetting.new("lq_trees", false if Global.on_high_end() else true),
+ ToggleSetting.new("debug_info", false),
+ ToggleSetting.new("ui_blur", true)
+ ]),
+ SettingsCategory.new("audio", [
+ RangeSetting.new("master_volume", 0, -30, 0),
+ RangeSetting.new("music_volume", 0, -30, 0),
+ RangeSetting.new("sfx_volume", 0, -30, 0),
+ ]),
+ SettingsCategory.new("ui", [
+ DropdownSetting.new("touch_controls", "automatic", ["automatic", "enabled", "disabled"]),
+ DropdownSetting.new("language", "system", Global.language_list()),
+ DropdownSetting.new("scale_mode", "resize", ["resize", "disabled"]),
+ RangeSetting.new("scale_factor", 1. if not Global.on_mobile() else 1.5, 0.5, 1.5, 3),
+ ]),
+ SettingsCategory.new("input",
+ InputManager.input_map_to_settings(InputManager.default_input_map)
+ ),
+ SettingsCategory.new("other", [
+ TextSetting.new("server_binary", ""),
+ TextSetting.new("server_data", ""),
+ ])
+ ])
+
+static func trigger_hook(key: String, value):
+ if Settings.change_hooks_display.get(key) != null: Settings.change_hooks_display.get(key).call(value)
+ if Settings.change_hooks_apply.get(key) != null: Settings.change_hooks_apply.get(key).call(value)
+ if key.find(".") != -1: trigger_hook(key.rsplit(".", false, 1)[0], null)
+
+static func hook_changed(key: String, display: bool, callable: Callable):
+ if display: change_hooks_display[key] = callable
+ else: change_hooks_apply[key] = callable
+
+static func hook_changed_init(key: String, display: bool, callable: Callable):
+ hook_changed(key, display, callable)
+ callable.call(Global.get_setting(key))
+
+static func get_category_dict(prefix: String):
+ var map = {}
+ for k in Global.settings.keys():
+ var kn = k.trim_prefix(prefix+".")
+ if kn == k: continue
+ map[kn] = Global.get_setting(k)
+ return map
+
+static var change_hooks_display = {}
+static var change_hooks_apply = {
+ "input": h_input,
+ "graphics.aa": h_aa,
+ "graphics.taa": h_taa,
+ "graphics.fullscreen": h_fullscreen,
+ "ui.scale_mode": h_scale_mode,
+ "ui.scale_factor": h_scale_factor,
+ "ui.language": h_language,
+ "audio.master_volume": h_volume_master,
+ "audio.music_volume": h_volume_music,
+ "audio.sfx_volume": h_volume_sfx,
+}
+
+static func apply_initial():
+ for key in change_hooks_apply.keys():
+ change_hooks_apply[key].call(Global.get_setting(key))
+
+static func h_aa(mode):
+ match mode:
+ "disabled":
+ Global.get_viewport().msaa_2d = Viewport.MSAA_DISABLED
+ Global.get_viewport().msaa_3d = Viewport.MSAA_DISABLED
+ Global.get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
+ "fx":
+ Global.get_viewport().msaa_2d = Viewport.MSAA_DISABLED
+ Global.get_viewport().msaa_3d = Viewport.MSAA_DISABLED
+ Global.get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA
+ "ms2x":
+ Global.get_viewport().msaa_2d = Viewport.MSAA_2X
+ Global.get_viewport().msaa_3d = Viewport.MSAA_2X
+ Global.get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
+ "ms4x":
+ Global.get_viewport().msaa_2d = Viewport.MSAA_4X
+ Global.get_viewport().msaa_3d = Viewport.MSAA_4X
+ Global.get_viewport().screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
+
+static func h_taa(enabled):
+ Global.get_viewport().use_taa = enabled
+
+static func h_scale_mode(mode: String):
+ match mode:
+ "resize": Global.get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS
+ "disabled": Global.get_tree().root.content_scale_mode = Window.CONTENT_SCALE_MODE_DISABLED
+
+static func h_scale_factor(value: float):
+ Global.get_tree().root.content_scale_factor = value
+
+static func h_volume_master(value: float): Sound.set_volume(0, value)
+static func h_volume_music(value: float): Sound.set_volume(1, value)
+static func h_volume_sfx(value: float): Sound.set_volume(2, value)
+
+static func h_touch(mode: String):
+ match mode:
+ "enabled": Global.using_touch = true
+ "disabled": Global.using_touch = false
+ Global.using_touch_change.emit()
+
+static func h_language(language: String):
+ if language == "system": language = OS.get_locale_language()
+ TranslationServer.set_locale(language)
+
+static func h_fullscreen(mode: String):
+ match mode:
+ "keep": pass
+ "always": DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)
+ "never": if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN:
+ DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)
+
+static func h_input(_x):
+ InputManager.apply_input_map(Settings.get_category_dict("input"))
+
+# TODO whatever this does
+# if not get_setting("tutorial_started"):
+# for k in profile["hints"].keys():
+# set_hint(k, false)
diff --git a/locale/ar.ini b/locale/ar.ini
index 20fdfbba..83d9d815 100644
--- a/locale/ar.ini
+++ b/locale/ar.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=استخدموا %s لتدوير الكاميرا
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=إملأ الشاشة
-c.controls.interact=مسار الملف
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.down=
+c.settings.input.left=
+c.settings.input.reset=استخدموا %s لتدوير الكاميرا
+c.settings.input.right=
+c.settings.input.up=
+c.settings.input.chat=
+c.settings.input.fullscreen=إملأ الشاشة
+c.settings.input.interact=مسار الملف
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=المطورين
c.credits.thanks=شكرا لكم على اللعب
c.credits.title=هري كري! - لعبة عن الطبخ
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=صوت البرنامج
c.settings.audio.music_volume=صوت الموسيقى
c.settings.audio.sfx_volume=صوت المؤثرات
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=زر القائمة/الهمبرغر/Menu
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=عرض معلومات التصحيح (fps، إلخ)
-c.settings.fullscreen=إملأ الشاشة
-c.settings.fullscreen.always=دائماً
-c.settings.fullscreen.keep=كما هو
-c.settings.fullscreen.never=أبداً
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=زر القائمة/الهمبرغر/Menu
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=عرض معلومات التصحيح (fps، إلخ)
+c.settings.graphics.fullscreen=إملأ الشاشة
+c.settings.graphics.fullscreen.always=دائماً
+c.settings.graphics.fullscreen.keep=كما هو
+c.settings.graphics.fullscreen.never=أبداً
c.settings.gameplay=
-c.settings.gameplay.extend_boost=قم دائمًا بتمديد الجري إلى أقصى مدة
-c.settings.gi=إضاءة عالمية
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=Voxel GI
-c.settings.glow=توهج
+c.settings.gameplay.latch_boost=قم دائمًا بتمديد الجري إلى أقصى مدة
+c.settings.graphics.gi=إضاءة عالمية
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=Voxel GI
+c.settings.graphics.glow=توهج
c.settings.graphics=رسوميات
c.settings.graphics.aa=تقنية التنعيم
c.settings.graphics.ao=انسداد المحيط
c.settings.graphics.taa=تقنية التنعيم الزمني
-c.settings.grass_amount=كمية العشب الـ3D للخانة
-c.settings.language=اللغة
-c.settings.language.system=الوضع الافتراضي للجهاز
-c.settings.low_poly_trees=أشجار Low-poly
+c.settings.graphics.grass_amount=كمية العشب الـ3D للخانة
+c.settings.ui.language=اللغة
+c.settings.ui.language.system=الوضع الافتراضي للجهاز
+c.settings.graphics.lq_trees=أشجار Low-poly
c.settings.other=
-c.settings.preset_high=عالي
-c.settings.preset_low=ضعيف
-c.settings.preset_medium=متوسط
-c.settings.server_data=دليل الـserver data (اتركوه فارغًا للبحث التلقائي)
-c.settings.server_path=ملف للـserver binary (اتركوه فارغًا للبحث في PATH)
-c.settings.server_path.placeholder=مسار الملف
-c.settings.shadows=ظلال
-c.settings.smooth_camera=سلّس حركة الكاميرا
+c.settings.graphics.preset.high=عالي
+c.settings.graphics.preset.low=ضعيف
+c.settings.graphics.preset.medium=متوسط
+c.settings.other.server_data=دليل الـserver data (اتركوه فارغًا للبحث التلقائي)
+c.settings.other.server_binary=ملف للـserver binary (اتركوه فارغًا للبحث في PATH)
+c.settings.other.server_binary.placeholder=مسار الملف
+c.settings.graphics.shadows=ظلال
+c.settings.gameplay.interpolate_camera_rotation=سلّس حركة الكاميرا
c.settings.ui=الإسم
c.settings.ui.scale_factor=عامل حجم واجهة المستخدم
c.settings.ui.scale_mode=طريقة تحجيم واجهة المستخدم
c.settings.ui.scale_mode.resize=تحديد الحجم تلقائيًا
c.settings.ui.touch_controls=فعّل شاشة اللمس
-c.settings.ui_blur=موّه واجهة المستخدم
+c.settings.graphics.ui_blur=موّه واجهة المستخدم
c.settings.username=الإسم
c.setup.contract_title=عقد عمل
c.setup.par00=هذا عقد ملزم بينكم (الموظف) وشركة موستر فوودز(Musterfoods) المحدودة (صاحب العمل) للعمل كطهاة أو نادلين.
@@ -139,25 +139,25 @@ unknown464=-
unknown476=مفتاح الإزاحة/ العالي/SHIFT
unknown484=عصا التحكم اليسرى
unknown488=مفتاح الفراغ/SPACE
-unknown49=عكّس حركة الكاميرا
-unknown494=اضغطوا على %s لالتقاط الأغراض واضغطوا باستمرار على %s للتفاعل مع الأدوات
+c.settings.gameplay.invert_camera=عكّس حركة الكاميرا
+c.hint.interact=اضغطوا على %s لالتقاط الأغراض واضغطوا باستمرار على %s للتفاعل مع الأدوات
unknown506=مفتاحا صفحة لأعلى(PageUp)/صفحة لأسفل(PageDown)
unknown510=استخدموا %s لتدوير الكاميرا
unknown514=مفاتيح الأسهم(Arrow keys)
unknown518=عصا التحكم اليمنى
unknown524=يمكن إظهار/إخفاء الأسماء في الإعدادات
-unknown53=اسماء اللاعبين
+c.settings.gameplay.usernames=اسماء اللاعبين
unknown530=اضغطوا على %s وانقروا على "انضم إلى اللعبة" للانضمام إلى اللعبة أثناء تشغيلها
unknown534=مفتاح الهروب/Esc
unknown538=زر القائمة/الهمبرغر/Menu
unknown551=غير موجود
unknown568=تسريحة الشعر %d
-unknown572=النماذج
-unknown576=الاصوات
-unknown59=تم الانتهاء من الإعداد الأولي. (إزيلوا علامة الإختيار وأعدوا التشغيل لإعادة الدخول)
+c.credits.models=النماذج
+c.credits.sounds=الاصوات
+c.settings.gameplay.setup_completed=تم الانتهاء من الإعداد الأولي. (إزيلوا علامة الإختيار وأعدوا التشغيل لإعادة الدخول)
unknown622=يجب عليكم ملء جميع الحقول.
unknown626=حسنا
-unknown63=بدأ البرنامج التعليمي
+c.settings.gameplay.tutorial_started=بدأ البرنامج التعليمي
unknown732=
unknown736=
unknown740=مشاهدين
diff --git a/locale/de.ini b/locale/de.ini
index f887201e..fb96b1c0 100644
--- a/locale/de.ini
+++ b/locale/de.ini
@@ -1,45 +1,31 @@
[hurrycurry]
-c.controls.boost=Bewegungsschub
-c.controls.camera_down=Kamera nach unten rotieren
-c.controls.camera_left=Kamera nach links rotieren
-c.controls.camera_reset=Kameraansicht zurücksetzen
-c.controls.camera_right=Kamera nach rechts rotieren
-c.controls.camera_up=Kamera nach oben rotieren
-c.controls.chat=Chat öffnen/schließen
-c.controls.fullscreen=Vollbild umschalten
-c.controls.interact=Interargieren
-c.controls.move_backward=Rückwärts bewegen
-c.controls.move_forward=Vorwärts bewegen
-c.controls.move_left=Nach links bewegen
-c.controls.move_right=Nach rechts bewegen
-c.controls.zoom_in=Hineinzoomen
-c.controls.zoom_in_discrete=Hineinzoomen (diskret)
-c.controls.zoom_out=Herauszoomen
-c.controls.zoom_out_discrete=Herauszoomen (diskret)
c.credits.developed_by=entwickelt von
+c.credits.models=Modelle
+c.credits.sounds=Soundeffekte
c.credits.thanks=Danke fürs Spielen
c.credits.title=Hurry Curry! - ein Spiel rund ums Kochen
-c.error=Fehler
c.error.cannot_cancel_no_game=Spiel kann nicht abgebrochen werde, da gerade kein Spiel läuft.
c.error.must_join_to_cancel=Du must dem Spiel beitreten um es abbrechen zu können.
c.error.placeholder=Dies sollte die Fehlernachricht sein.
c.error.websocket=Web-Socket wurde geschlossen mit Code: %d, Grund %s. Sauber: %s
-c.hint=Tipp
+c.error=Fehler
c.hint.boost=Drücke %s für Schub
c.hint.framerate_low=Ihre Bildrate scheint niedrig zu sein. Sie können Ihre Grafikeinstellungen in den Optionen verringern.
+c.hint.interact=Drücke %s, um Gegenstände aufzuheben und halte %s gedrückt, um mit Utensilien zu interagieren
c.hint.movement=Nutze %s zum Bewegen
c.hint.reset_camera=Drücke %s, um die Kameradrehung zurückzusetzen
c.hint.zoom_camera=Nutze %s zum Zoomen
+c.hint=Tipp
c.lobby.botenable=Roboter aktivieren
c.lobby.mapname=Kartenname
c.lobby.players=Spieler
c.lobby.start=Spiel starten
-c.map.difficulty=Schwierigkeitsstufe
c.map.difficulty.0=Einfach
c.map.difficulty.1=Schwer
c.map.difficulty.2=Medium
c.map.difficulty.3=Unspielbar
c.map.difficulty.4=Sehr schwer
+c.map.difficulty=Schwierigkeitsstufe
c.map.players_recommended=%d Spieler empfohlen
c.menu.back=Zurück
c.menu.credits=Anerkennung
@@ -53,10 +39,10 @@ c.menu.ingame.reconnect=Erneut verbinden
c.menu.ingame.resume=Fortsetzen
c.menu.ingame.spectate=Zuschauen
c.menu.my_chef=Mein Koch
-c.menu.play=Spielen
c.menu.play.connect=Verbinden
c.menu.play.quick_connect=Jetzt verbinden
c.menu.play.server=Server
+c.menu.play=Spielen
c.menu.quit=Verlassen
c.menu.settings=Einstellungen
c.score.acceptable=Akzeptabler Service
@@ -64,56 +50,77 @@ c.score.completed=Abgeschlossen
c.score.excellent=Ausgezeichneter Service
c.score.failed=Verfehlt
c.score.good=Guter Service
-c.score.points=Punkte
c.score.points_par=Sie haben %s Punkte gesammelt
+c.score.points=Punkte
c.score.poor=Schlechter Service
c.settings.apply=Speichern & Anwenden
-c.settings.audio=Audio
c.settings.audio.master_volume=Gesamtlautstärke
c.settings.audio.music_volume=Musiklautstärke
c.settings.audio.sfx_volume=Effektlautstärke
-c.settings.controls=Steuerung
-c.settings.controls.add=Hinzufügen
-c.settings.controls.joypad=%s (Joypad)
-c.settings.controls.joypad_axis=Joypad-Achse %s
-c.settings.controls.keyboard=%s (Tastatur)
-c.settings.controls.mouse_button=Maustaste %s
-c.settings.controls.other_event=Anderes Ereignis
-c.settings.controls.press_any_key=Drücke eine Taste...
-c.settings.debug_info=Diagnosedaten anzeigen (Bildrate, etc.)
-c.settings.fullscreen=Vollbild
-c.settings.fullscreen.always=Immer
-c.settings.fullscreen.keep=Beibehalten
-c.settings.fullscreen.never=Nie
+c.settings.audio=Audio
+c.settings.gameplay.interpolate_camera_rotation=Kameradrehung glätten
+c.settings.gameplay.invert_camera=Kamerabewegung invertieren
+c.settings.gameplay.latch_boost=Schub immer bis zum Anschlag verlängern
+c.settings.gameplay.setup_completed=Ersteinrichtung abgeschlossen (Deaktivieren und Spiel neu starten zum Neueinrichten)
+c.settings.gameplay.tutorial_started=Anleitung gestartet
+c.settings.gameplay.usernames=Benutzernamen anzeigen
c.settings.gameplay=Spiel
-c.settings.gameplay.extend_boost=Schub immer bis zum Anschlag verlängern
-c.settings.gi=Globale Beleuchtung
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=Voxel GlobaleBeleuchtung
-c.settings.glow=Glow aktivieren
-c.settings.graphics=Grafikvoreinstellung
c.settings.graphics.aa=Kantenglättung
c.settings.graphics.ao=Umgebungsverdeckung
+c.settings.graphics.debug_info=Diagnosedaten anzeigen (Bildrate, etc.)
+c.settings.graphics.fullscreen.always=Immer
+c.settings.graphics.fullscreen.keep=Beibehalten
+c.settings.graphics.fullscreen.never=Nie
+c.settings.graphics.fullscreen=Vollbild
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=Voxel GlobaleBeleuchtung
+c.settings.graphics.gi=Globale Beleuchtung
+c.settings.graphics.glow=Glow aktivieren
+c.settings.graphics.grass_amount=3D-Grasmenge pro Tile
+c.settings.graphics.lq_trees=Low-poly-Bäume
+c.settings.graphics.preset.high=Hoch
+c.settings.graphics.preset.low=Niedrig
+c.settings.graphics.preset.medium=Mittel
+c.settings.graphics.shadows=Schatten aktivieren
c.settings.graphics.taa=Zeitliche Kantenglättung
-c.settings.grass_amount=3D-Grasmenge pro Tile
-c.settings.language=Sprache
-c.settings.language.system=Systemstandard
-c.settings.low_poly_trees=Low-poly-Bäume
+c.settings.graphics.ui_blur=Benutzeroberflächenunschärfe
+c.settings.graphics=Grafikvoreinstellung
+c.settings.input.add=Hinzufügen
+c.settings.input.boost=Bewegungsschub
+c.settings.input.chat=Chat öffnen/schließen
+c.settings.input.fullscreen=Vollbild umschalten
+c.settings.input.interact=Interargieren
+c.settings.input.joypad_axis=Joypad-Achse %s
+c.settings.input.joypad=%s (Joypad)
+c.settings.input.keyboard=%s (Tastatur)
+c.settings.input.mouse_button=Maustaste %s
+c.settings.input.backwards=Rückwärts bewegen
+c.settings.input.forwards=Vorwärts bewegen
+c.settings.input.left=Nach links bewegen
+c.settings.input.right=Nach rechts bewegen
+c.settings.input.other_event=Anderes Ereignis
+c.settings.input.press_any_key=Drücke eine Taste...
+c.settings.input.reset=Kameraansicht zurücksetzen
+c.settings.input.rotate_down=Kamera nach unten rotieren
+c.settings.input.rotate_left=Kamera nach links rotieren
+c.settings.input.rotate_right=Kamera nach rechts rotieren
+c.settings.input.rotate_up=Kamera nach oben rotieren
+c.settings.input.zoom_in_discrete=Hineinzoomen (diskret)
+c.settings.input.zoom_in=Hineinzoomen
+c.settings.input.zoom_out_discrete=Herauszoomen (diskret)
+c.settings.input.zoom_out=Herauszoomen
+c.settings.input=Steuerung
+c.settings.other.server_binary.placeholder=Pfad eingeben
+c.settings.other.server_binary=Pfad zum Server (leer lassen, um PATH zu durchsuchen)
+c.settings.other.server_data=Server Datenverzeichnis (leer lassen, um automatisch zu erkennen)
c.settings.other=Sonstiges
-c.settings.preset_high=Hoch
-c.settings.preset_low=Niedrig
-c.settings.preset_medium=Mittel
-c.settings.server_data=Server Datenverzeichnis (leer lassen, um automatisch zu erkennen)
-c.settings.server_path=Pfad zum Server (leer lassen, um PATH zu durchsuchen)
-c.settings.server_path.placeholder=Pfad eingeben
-c.settings.shadows=Schatten aktivieren
-c.settings.smooth_camera=Kameradrehung glätten
-c.settings.ui=Benutzeroberfläche
+c.settings.ui.language.system=Systemstandard
+c.settings.ui.language=Sprache
c.settings.ui.scale_factor=Benutzeroberflächen Skalierungs Faktor
-c.settings.ui.scale_mode=Benutzeroberflächen Skalierungs Modus
c.settings.ui.scale_mode.resize=Skalieren
+c.settings.ui.scale_mode=Benutzeroberflächen Skalierungs Modus
c.settings.ui.touch_controls=Touchsteuerelemente aktivieren
-c.settings.ui_blur=Benutzeroberflächenunschärfe
+c.settings.ui=Benutzeroberfläche
c.settings.username=Benutzername
c.setup.contract_title=ARBEITSVERTRAG
c.setup.par00=Dies ist ein verbindlicher Vertrag zwischen Ihnen (der/die Angestelte) und Musterfoods GmbH. Sie verpflichten sich, Ihren Aufgaben als Koch/Köchin bzw. Bedienung nachzugehen.
@@ -139,25 +146,18 @@ unknown464=-
unknown476=UMSCHALTEN
unknown484=linken Stick
unknown488=LEERTASTE
-unknown49=Kamerabewegung invertieren
-unknown494=Drücke %s, um Gegenstände aufzuheben und halte %s gedrückt, um mit Utensilien zu interagieren
unknown506=BildHoch/BildRunter
unknown510=Nutze %s, um die Kameraansicht zurückzusetzen
unknown514=Pfeiltasten
unknown518=rechten Stick
unknown524=Die Anzeige von Nutzernamen kann in den Einstellungen ein- und ausgeschaltet werden
-unknown53=Benutzernamen anzeigen
unknown530=Drücken Sie %s und klicken Sie „Beitreten“, um beizutreten, während das Spiel läuft
unknown534=ESCAPE
unknown538=Menü-Knopf
unknown551=Nicht verfügbar
unknown568=Frisur %d
-unknown572=Modelle
-unknown576=Soundeffekte
-unknown59=Ersteinrichtung abgeschlossen (Deaktivieren und Spiel neu starten zum Neueinrichten)
unknown622=Sie müssen alle verlangten Felder ausfüllen.
unknown626=Akzeptieren
-unknown63=Anleitung gestartet
unknown732=Zurück
unknown736=Nächstes
unknown740=Beitreten / Zuschauen
diff --git a/locale/en.ini b/locale/en.ini
index 3903c574..509cfd34 100644
--- a/locale/en.ini
+++ b/locale/en.ini
@@ -1,40 +1,23 @@
[hurrycurry]
-c.controls.boost=Boost movement
-c.controls.camera_down=Rotate camera downwards
-c.controls.camera_left=Rotate camera to the left
-c.controls.camera_reset=Reset camera view
-c.controls.camera_right=Rotate camera to the right
-c.controls.camera_up=Rotate camera upwards
-c.controls.chat=Toggle chat
-c.controls.fullscreen=Toggle fullscreen
-c.controls.interact=Interact
-c.controls.move_backward=Move backwards
-c.controls.move_forward=Move forwards
-c.controls.move_left=Move left
-c.controls.move_right=Move right
-c.controls.zoom_in_discrete=Zoom in (discrete)
-c.controls.zoom_in=Zoom in
-c.controls.zoom_out_discrete=Zoom out (discrete)
-c.controls.zoom_out=Zoom out
c.credits.developed_by=developed by
+c.credits.models=Models
+c.credits.sounds=Sounds
c.credits.thanks=Thank You For Playing
c.credits.title=Hurry Curry! - a game about cooking
c.error.cannot_cancel_no_game=Cannot cancel game since no game is running.
c.error.must_join_to_cancel=You must join in order to be able to cancel the current game.
c.error.placeholder=This should be the error message.
+c.error.version_mismatch=Server and client versions do not match. Server: %d.%d, Client: %d.%d.%nAre you sure the game is up to date?
+c.error.websocket.unavailable=unavailable
c.error.websocket=WebSocket closed with code: %d, reason %s. Clean: %s
c.error=Error
c.hint.boost=Press %s to boost
c.hint.framerate_low=Your framerate seems to be low. You can lower your graphics settings in the settings menu.
-c.hint.interact=Press %s to pick up items and hold %s to interact with toolsDrücke %s, um Gegenstände aufzuheben und halte %s gedrückt= um mit Utensilien zu interagieren
+c.hint.interact=Press %s to pick up items and hold %s to interact with tools
c.hint.movement=Use %s to move
c.hint.reset_camera=Press %s to reset the camera view
c.hint.zoom_camera=Use %s to zoom in/out
c.hint=Hint
-c.lobby.botenable=Enable bots
-c.lobby.mapname=Map name
-c.lobby.players=Players
-c.lobby.start=Start game
c.map.difficulty.0=Easy
c.map.difficulty.1=Hard
c.map.difficulty.2=Moderate
@@ -50,11 +33,15 @@ c.menu.ingame.join2=Join Game
c.menu.ingame.leave=Leave game
c.menu.ingame.leave2=Leave Game
c.menu.ingame.main_menu=Main menu
-c.menu.ingame.mainmenu=Main Menu
+c.menu.ingame.main_menu2=Main Menu
c.menu.ingame.quit=Quit game
c.menu.ingame.reconnect=Reconnect
c.menu.ingame.resume=Resume
c.menu.ingame.spectate=Spectate
+c.menu.lobby.enable_bots=Enable bots
+c.menu.lobby.mapname=Map name
+c.menu.lobby.players=Players
+c.menu.lobby.start=Start game
c.menu.my_chef=My Chef
c.menu.play.connect=Connect
c.menu.play.quick_connect=Quick Connect
@@ -75,46 +62,86 @@ c.settings.audio.master_volume=Master Volume
c.settings.audio.music_volume=Music Volume
c.settings.audio.sfx_volume=SFX Volume
c.settings.audio=Audio
-c.settings.controls.add=Add new
-c.settings.controls.joypad_axis=Joypad axis %s
-c.settings.controls.joypad=%s (Joypad)
-c.settings.controls.keyboard=%s (Keyboard)
-c.settings.controls.mouse_button=Mouse button %s
-c.settings.controls.other_event=Other event
-c.settings.controls.press_any_key=Press any key...
-c.settings.controls=Controls
-c.settings.debug_info=Display debug info (Framerate, etc.)
-c.settings.fullscreen.always=Always
-c.settings.fullscreen.keep=Keep
-c.settings.fullscreen.never=Never
-c.settings.fullscreen=Fullscreen
-c.settings.gameplay.extend_boost=Always extend boost to maximum duration
+c.settings.gameplay.interpolate_camera_rotation=Smooth camera rotation
+c.settings.gameplay.invert_camera=Invert camera movement
+c.settings.gameplay.latch_boost=Always extend boost to maximum duration
+c.settings.gameplay.setup_completed=Initial setup complete. (Uncheck and restart to reenter)
+c.settings.gameplay.tutorial_started=Tutorial started
+c.settings.gameplay.usernames=Show username tags
c.settings.gameplay=Gameplay
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=Voxel GI
-c.settings.gi=Global illumination
-c.settings.glow=Enable glow
+c.settings.graphics.aa.disabled=Disabled
+c.settings.graphics.aa.fx=FXAA
+c.settings.graphics.aa.ms2x=MSAA 2x
+c.settings.graphics.aa.ms4x=MSAA 4x
c.settings.graphics.aa=Anti-aliasing
c.settings.graphics.ao=Ambient occlusion
+c.settings.graphics.debug_info=Display debug info (Framerate, etc.)
+c.settings.graphics.fullscreen.always=Always
+c.settings.graphics.fullscreen.keep=Keep
+c.settings.graphics.fullscreen.never=Never
+c.settings.graphics.fullscreen=Fullscreen
+c.settings.graphics.gi.disabled=Disabled
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=Voxel GI
+c.settings.graphics.gi=Global illumination
+c.settings.graphics.glow=Enable glow
+c.settings.graphics.grass_amount=3D grass amount per grass tile
+c.settings.graphics.lq_trees=Low-poly trees
+c.settings.graphics.preset.high=High
+c.settings.graphics.preset.low=Low
+c.settings.graphics.preset.medium=Medium
+c.settings.graphics.preset=Load preset
+c.settings.graphics.shadows=Enable shadows
+c.settings.graphics.ssao=Screen-space ambient occlusion (SSAO)
c.settings.graphics.taa=Temporal Anti-Aliasing
+c.settings.graphics.ui_blur=Enable UI blur
c.settings.graphics=Graphics
-c.settings.grass_amount=3D grass amount per grass tile
-c.settings.language.system=System default
-c.settings.language=Language
-c.settings.low_poly_trees=Low-poly trees
+c.settings.input.add=Add new
+c.settings.input.backwards=Move Backwards
+c.settings.input.boost=Boost movement
+c.settings.input.chat=Toggle chat
+c.settings.input.forwards=Move Forwards
+c.settings.input.fullscreen=Toggle fullscreen
+c.settings.input.interact=Interact
+c.settings.input.join_spectate=Join/Spectate
+c.settings.input.joypad_axis=Joypad axis %s
+c.settings.input.joypad=%s (Joypad)
+c.settings.input.keyboard=%s (Keyboard)
+c.settings.input.left=Move Left
+c.settings.input.mouse_button=Mouse button %s
+c.settings.input.next=Select next item
+c.settings.input.other_event=Other event
+c.settings.input.press_any_key=Press any key...
+c.settings.input.previous=Select previous item
+c.settings.input.reset=Reset camera
+c.settings.input.right=Move Right
+c.settings.input.rotate_down=Rotate camera down
+c.settings.input.rotate_left=Rotate camera left
+c.settings.input.rotate_right=Rotate camera right
+c.settings.input.rotate_up=Rotate camera up
+c.settings.input.scroll_down_discrete=Scroll down (discrete)
+c.settings.input.scroll_down=Scroll down
+c.settings.input.scroll_up_discrete=Scroll up (discrete)
+c.settings.input.scroll_up=Scroll up
+c.settings.input.start_game=Start game
+c.settings.input.zoom_in_discrete=Zoom in (discrete)
+c.settings.input.zoom_in=Zoom in
+c.settings.input.zoom_out_discrete=Zoom out (discrete)
+c.settings.input.zoom_out=Zoom out
+c.settings.input=Controls
+c.settings.other.server_binary.placeholder=Enter path
+c.settings.other.server_binary=Server binary (leave empty to search PATH)
+c.settings.other.server_data=Server data directory (leave empty to auto-detect)
c.settings.other=Other
-c.settings.preset_high=High
-c.settings.preset_low=Low
-c.settings.preset_medium=Medium
-c.settings.server_data=Server data directory (leave empty to auto-detect)
-c.settings.server_path.placeholder=Enter path
-c.settings.server_path=Server binary (leave empty to search PATH)
-c.settings.shadows=Enable shadows
-c.settings.smooth_camera=Smooth camera rotation
-c.settings.ui_blur=Enable UI blur
+c.settings.ui.language.system=System default
+c.settings.ui.language=Language
c.settings.ui.scale_factor=UI scale factor
+c.settings.ui.scale_mode.disabled=Disabled
c.settings.ui.scale_mode.resize=Resize
c.settings.ui.scale_mode=UI scale mode
+c.settings.ui.touch_controls.automatic=Automatic
+c.settings.ui.touch_controls.disabled=Disabled
+c.settings.ui.touch_controls.enabled=Enabled
c.settings.ui.touch_controls=Enable touch screen controls
c.settings.ui=User interface
c.settings.username=Username
@@ -146,27 +173,18 @@ unknown464=-
unknown476=SHIFT
unknown484=left stick
unknown488=SPACE
-unknown49=Invert camera movement
-unknown494=Press %s to pick up items and hold %s to interact with tools
unknown506=PageUp/PageDown
unknown510=Use %s to rotate the camera view
unknown514=arrow keys
unknown518=right stick
unknown524=Username tags can be enabled/disabled in the settings
-unknown53=Show username tags
unknown530=Press %s and click "Join" to join the game while it is running
unknown534=ESCAPE
unknown538=Menu button
unknown551=unavailable
-unknown564=Server and client versions do not match. Server: %d.%d, Client: %d.%d.%nAre you sure the game is up to date?
unknown568=Hairstyle %d
-unknown572=Models
-unknown576=Sounds
-unknown59=Initial setup complete. (Uncheck and restart to reenter)
-unknown598=[/table]%n%n%n
unknown622=You must fill out all requested fields.
unknown626=Accept
-unknown63=Tutorial started
unknown732=Previous
unknown736=Next
unknown740=Join / Spectate
diff --git a/locale/es.ini b/locale/es.ini
index d6a0a371..2c6d5883 100644
--- a/locale/es.ini
+++ b/locale/es.ini
@@ -1,45 +1,48 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=Usa %s para restablecer la cámara
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=Pantalla completa
-c.controls.interact=Pone ruta
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=Usa %s para restablecer la cámara
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=Pantalla completa
+c.settings.input.interact=Pone ruta
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_in=
+c.settings.input.zoom_out_discrete=
+c.settings.input.zoom_out=
c.credits.developed_by=desarrollado por
+c.credits.models=Modelos
+c.credits.sounds=Sonidos
c.credits.thanks=Gracias por jugar
c.credits.title=¡Hurry Curry! - un juego sobre cocinar
-c.error=Error
c.error.cannot_cancel_no_game=No se puede cancelar el juego porque no hay ningún juego en ejecución.
c.error.must_join_to_cancel=Debes unirte para poder cancelar el juego.
c.error.placeholder=///.
c.error.websocket=WebSocket cerrado con código: %d, motivo %s. Limpiar: %s
-c.hint=Pista
+c.error=Error
c.hint.boost=Presione %s para impulsar
c.hint.framerate_low=La velocidad de cuadros parece ser baja. Puedes reducir la configuración de gráficos en el menú de configuración.
+c.hint.interact=Presione %s para recoger elementos y mantenga presionado %s para interactuar con útiles
c.hint.movement=Usa %s para moverte
c.hint.reset_camera=Presione %s para restablecer la cámara
c.hint.zoom_camera=Usa %s para hacer zoom
+c.hint=Pista
c.lobby.botenable=Activar robots
c.lobby.mapname=Nombre del mapa
c.lobby.players=Jugadores
c.lobby.start=Iniciar juego
-c.map.difficulty=Dificultad
c.map.difficulty.0=Fácil
c.map.difficulty.1=Duro
c.map.difficulty.2=Moderado
c.map.difficulty.3=Demasiado
c.map.difficulty.4=Muy duro
+c.map.difficulty=Dificultad
c.map.players_recommended=%d jugadores recomendadas
c.menu.back=Atrás
c.menu.credits=Créditos
@@ -53,10 +56,10 @@ c.menu.ingame.reconnect=Reconectar
c.menu.ingame.resume=Resumir
c.menu.ingame.spectate=Observar
c.menu.my_chef=Mi cocinero
-c.menu.play=Iniciar partida
c.menu.play.connect=Conectar
c.menu.play.quick_connect=Conexión rápida
c.menu.play.server=Servidor
+c.menu.play=Iniciar partida
c.menu.quit=Abandonar
c.menu.settings=Ajustes
c.score.acceptable=Servicio aceptable
@@ -64,56 +67,60 @@ c.score.completed=Terminado
c.score.excellent=Excelente servicio
c.score.failed=Fallido
c.score.good=Buen servicio
-c.score.points=Puntos
c.score.points_par=Has acumulado %s puntos
+c.score.points=Puntos
c.score.poor=Servicio pobre
c.settings.apply=Guardar & aplicar
-c.settings.audio=
c.settings.audio.master_volume=Volumen principal
c.settings.audio.music_volume=Volumen de la música
c.settings.audio.sfx_volume=Volumen de efectos especiales
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=Botón de menú
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=Mostrar información de depuración (Cuadros por segundo, etc.)
-c.settings.fullscreen=Pantalla completa
-c.settings.fullscreen.always=Siempre
-c.settings.fullscreen.keep=Mantener
-c.settings.fullscreen.never=Jamás
+c.settings.audio=
+c.settings.gameplay.interpolate_camera_rotation=Interpolar la rotación de la cámara
+c.settings.gameplay.invert_camera=Invertir el movimiento de la cámara
+c.settings.gameplay.latch_boost=Siempre extienda el impulso a la duración máxima
+c.settings.gameplay.setup_completed=Configuración inicial completa. (Desmarque y recomenza para reentrar)
+c.settings.gameplay.tutorial_started=Tutorial comenzó
+c.settings.gameplay.usernames=Mostrar nombres de usuarios
c.settings.gameplay=
-c.settings.gameplay.extend_boost=Siempre extienda el impulso a la duración máxima
-c.settings.gi=Iluminación global
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=Voxel GI
-c.settings.glow=Activar brillo
-c.settings.graphics=Gráficos
c.settings.graphics.aa=Antialiasing
c.settings.graphics.ao=Oclusión ambiental
+c.settings.graphics.debug_info=Mostrar información de depuración (Cuadros por segundo, etc.)
+c.settings.graphics.fullscreen.always=Siempre
+c.settings.graphics.fullscreen.keep=Mantener
+c.settings.graphics.fullscreen.never=Jamás
+c.settings.graphics.fullscreen=Pantalla completa
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=Voxel GI
+c.settings.graphics.gi=Iluminación global
+c.settings.graphics.glow=Activar brillo
+c.settings.graphics.grass_amount=cantidad de hierba 3D por loseta de césped
+c.settings.graphics.lq_trees=Árboles con pocos polígonos
+c.settings.graphics.preset.high=Alto
+c.settings.graphics.preset.low=Bajo
+c.settings.graphics.preset.medium=Medio
+c.settings.graphics.shadows=Activar sombras
c.settings.graphics.taa=Antialiasing temporal
-c.settings.grass_amount=cantidad de hierba 3D por loseta de césped
-c.settings.language=Lengua
-c.settings.language.system=Sistema por defecto
-c.settings.low_poly_trees=Árboles con pocos polígonos
+c.settings.graphics.ui_blur=Activar difuminar
+c.settings.graphics=Gráficos
+c.settings.input.add=
+c.settings.input.joypad_axis=
+c.settings.input.joypad=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=Botón de menú
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.input=
+c.settings.other.server_binary.placeholder=Pone ruta
+c.settings.other.server_binary=Binario del servidor (deja vacío para buscar RUTA)
+c.settings.other.server_data=Directorio de datos del servidor (deja vacío para detectar automáticamente)
c.settings.other=
-c.settings.preset_high=Alto
-c.settings.preset_low=Bajo
-c.settings.preset_medium=Medio
-c.settings.server_data=Directorio de datos del servidor (deja vacío para detectar automáticamente)
-c.settings.server_path=Binario del servidor (deja vacío para buscar RUTA)
-c.settings.server_path.placeholder=Pone ruta
-c.settings.shadows=Activar sombras
-c.settings.smooth_camera=Interpolar la rotación de la cámara
-c.settings.ui=Nombre de usuario
+c.settings.ui.language.system=Sistema por defecto
+c.settings.ui.language=Lengua
c.settings.ui.scale_factor=Escala de interfaz de usuario
-c.settings.ui.scale_mode=Modo d’escala de interfaz de usuario
c.settings.ui.scale_mode.resize=Redimensionado
+c.settings.ui.scale_mode=Modo d’escala de interfaz de usuario
c.settings.ui.touch_controls=Permitir controles de pantalla táctil
-c.settings.ui_blur=Activar difuminar
+c.settings.ui=Nombre de usuario
c.settings.username=Nombre de usuario
c.setup.contract_title=CONTRATO DE EMPLEO
c.setup.par00=Este es un contrato oficial entre usted (el empleado) y Musterfoods Ltd. (el empleador) para trabajar como chef o camarero.
@@ -139,25 +146,18 @@ unknown464=-
unknown476=CAMBIO
unknown484=palo izquierdo
unknown488=BARRA ESPACIADORA
-unknown49=Invertir el movimiento de la cámara
-unknown494=Presione %s para recoger elementos y mantenga presionado %s para interactuar con útiles
unknown506=RePág/AvPág
unknown510=Usa %s para restablecer la cámara
unknown514=teclas de flechas
unknown518=palo derecho
unknown524=Los nombres de usuarios se pueden habilitar/deshabilitar en la configuración
-unknown53=Mostrar nombres de usuarios
unknown530=Presiona %s y haz clic en "Unirse" para unirte al juego
unknown534=ESCAPAR
unknown538=Botón de menú
unknown551=Servidor (No disponible)
unknown568=Peinado %d
-unknown572=Modelos
-unknown576=Sonidos
-unknown59=Configuración inicial completa. (Desmarque y recomenza para reentrar)
unknown622=Debes completar todos los requisitos.
unknown626=Aceptar
-unknown63=Tutorial comenzó
unknown732=
unknown736=
unknown740=Observar
diff --git a/locale/eu.ini b/locale/eu.ini
index 359e9760..b84e9191 100644
--- a/locale/eu.ini
+++ b/locale/eu.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=Bultzada
-c.controls.camera_down=Kamera behera biratu
-c.controls.camera_left=Kamera ezkerrera biratu
-c.controls.camera_reset=Berrezarri kamera
-c.controls.camera_right=Kamera eskuinera biratu
-c.controls.camera_up=Kamera gora biratu
-c.controls.chat=Chat-a erakutsi/gorde
-c.controls.fullscreen=Pantaila osoa gaitu/desgaitu
-c.controls.interact=Eragin
-c.controls.move_backward=Mugitu atzera
-c.controls.move_forward=Mugitu aurrera
-c.controls.move_left=Mugitu ezkerrera
-c.controls.move_right=Mugitu eskuinera
-c.controls.zoom_in=Handiagotu
-c.controls.zoom_in_discrete=Handiagotu (diskretua)
-c.controls.zoom_out=Txikiagotu
-c.controls.zoom_out_discrete=Txikiagotu (diskretua)
+c.settings.input.boost=Bultzada
+c.settings.input.rotate_down=Kamera behera biratu
+c.settings.input.rotate_left=Kamera ezkerrera biratu
+c.settings.input.reset=Berrezarri kamera
+c.settings.input.rotate_right=Kamera eskuinera biratu
+c.settings.input.rotate_up=Kamera gora biratu
+c.settings.input.chat=Chat-a erakutsi/gorde
+c.settings.input.fullscreen=Pantaila osoa gaitu/desgaitu
+c.settings.input.interact=Eragin
+c.settings.input.backwards=Mugitu atzera
+c.settings.input.forwards=Mugitu aurrera
+c.settings.input.left=Mugitu ezkerrera
+c.settings.input.right=Mugitu eskuinera
+c.settings.input.zoom_in=Handiagotu
+c.settings.input.zoom_in_discrete=Handiagotu (diskretua)
+c.settings.input.zoom_out=Txikiagotu
+c.settings.input.zoom_out_discrete=Txikiagotu (diskretua)
c.credits.developed_by=garatzailea
c.credits.thanks=Eskerrik asko jostatzeagatik
c.credits.title=Hurry Curry! - sukaldaritza jokoa
@@ -72,48 +72,48 @@ c.settings.audio=Audioa
c.settings.audio.master_volume=Bolumen Orokorra
c.settings.audio.music_volume=Musikaren Bolumena
c.settings.audio.sfx_volume=Efektuen Bolumena
-c.settings.controls=Kontrolak
-c.settings.controls.add=Gehitu berria
-c.settings.controls.joypad=%s (Agintea)
-c.settings.controls.joypad_axis=Agintearen %s ardatza
-c.settings.controls.keyboard=%s (Teklatua)
-c.settings.controls.mouse_button=Saguaren %s botoia
-c.settings.controls.other_event=Beste gertaerak
-c.settings.controls.press_any_key=Sakatu edozein tekla...
-c.settings.debug_info=Erakutsi arazte informazioa (FPS, etab.)
-c.settings.fullscreen=Pantaila osoa
-c.settings.fullscreen.always=Beti
-c.settings.fullscreen.keep=Mantendu
-c.settings.fullscreen.never=Inoiz ez
+c.settings.input=Kontrolak
+c.settings.input.add=Gehitu berria
+c.settings.input.joypad=%s (Agintea)
+c.settings.input.joypad_axis=Agintearen %s ardatza
+c.settings.input.keyboard=%s (Teklatua)
+c.settings.input.mouse_button=Saguaren %s botoia
+c.settings.input.other_event=Beste gertaerak
+c.settings.input.press_any_key=Sakatu edozein tekla...
+c.settings.graphics.debug_info=Erakutsi arazte informazioa (FPS, etab.)
+c.settings.graphics.fullscreen=Pantaila osoa
+c.settings.graphics.fullscreen.always=Beti
+c.settings.graphics.fullscreen.keep=Mantendu
+c.settings.graphics.fullscreen.never=Inoiz ez
c.settings.gameplay=Jokoa
-c.settings.gameplay.extend_boost=Beti luzatu bultzada iraupen luzeenera
-c.settings.gi=Argiztapen orokorra
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=Voxel GI
-c.settings.glow=Gaitu distira
+c.settings.gameplay.latch_boost=Beti luzatu bultzada iraupen luzeenera
+c.settings.graphics.gi=Argiztapen orokorra
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=Voxel GI
+c.settings.graphics.glow=Gaitu distira
c.settings.graphics=Grafikoak
c.settings.graphics.aa=Anti-aliasinga
c.settings.graphics.ao=Giro oklusioa
c.settings.graphics.taa=Anti-aliasing tenporala
-c.settings.grass_amount=3D belar kopurua belar lauza bakoitzeko
-c.settings.language=Hizkuntza
-c.settings.language.system=Sistemaren berezkoak
-c.settings.low_poly_trees=Low-poly zuhaitzak
+c.settings.graphics.grass_amount=3D belar kopurua belar lauza bakoitzeko
+c.settings.ui.language=Hizkuntza
+c.settings.ui.language.system=Sistemaren berezkoak
+c.settings.graphics.lq_trees=Low-poly zuhaitzak
c.settings.other=Besteak
-c.settings.preset_high=Altua
-c.settings.preset_low=Baxua
-c.settings.preset_medium=Erdikoa
-c.settings.server_data=Zerbitzariaren datu direktorioa (hutsik utzi automatikoki bilatzeko)
-c.settings.server_path=Zerbitzari exekutagarria (hutsik utzi PATH-en bilatzeko)
-c.settings.server_path.placeholder=Sartu bidea
-c.settings.shadows=Gaitu itzalak
-c.settings.smooth_camera=Kamera biraketa leuna
+c.settings.graphics.preset.high=Altua
+c.settings.graphics.preset.low=Baxua
+c.settings.graphics.preset.medium=Erdikoa
+c.settings.other.server_data=Zerbitzariaren datu direktorioa (hutsik utzi automatikoki bilatzeko)
+c.settings.other.server_binary=Zerbitzari exekutagarria (hutsik utzi PATH-en bilatzeko)
+c.settings.other.server_binary.placeholder=Sartu bidea
+c.settings.graphics.shadows=Gaitu itzalak
+c.settings.gameplay.interpolate_camera_rotation=Kamera biraketa leuna
c.settings.ui=Erab. Interfazea
c.settings.ui.scale_factor=UI eskalatze faktorea
c.settings.ui.scale_mode=UI eskalatze modua
c.settings.ui.scale_mode.resize=Neurria aldatu
c.settings.ui.touch_controls=Gaitu ukipen-pantaila kontrolak
-c.settings.ui_blur=Gaitu UI lausotzea
+c.settings.graphics.ui_blur=Gaitu UI lausotzea
c.settings.username=Erabiltzaile izena
c.setup.contract_title=LAN KONTRATUA
c.setup.par00=Zure (langilea) eta Musterfoods Ltd. (enpresa)-ren arteko kontratu loteslea da hau, chef edo zerbitzari gisa lan egin dezazun.
@@ -139,25 +139,25 @@ unknown464=-
unknown476=SHIFT
unknown484=ezker palanka
unknown488=HUTSUNEA
-unknown49=Kamera mugimendua alderantzikatu
-unknown494=Sakatu %s objektuak hartzeko eta eutsi %s tresnekin lan egiteko
+c.settings.gameplay.invert_camera=Kamera mugimendua alderantzikatu
+c.hint.interact=Sakatu %s objektuak hartzeko eta eutsi %s tresnekin lan egiteko
unknown506=PageUp/PageDown
unknown510=Erabili %s kamera bista biratzeko
unknown514=gezi teklak
unknown518=eskuin palanka
unknown524=Erabiltzaile etiketak ezarpenetan gaitu/desgaitu daitezke
-unknown53=Erakutsi erabiltzaile izen etiketak
+c.settings.gameplay.usernames=Erakutsi erabiltzaile izen etiketak
unknown530=Sakatu %s eta klikatu "Batu" martxan dagoen joko batean batzeko
unknown534=ESCAPE
unknown538=Menu botoia
unknown551=eskuraezina
unknown568=%d orrazkera
-unknown572=Modeloak
-unknown576=Soinuak
-unknown59=Hasierako konfigurazioa osatuta. (Marka kendu eta berrabiarazi berriz sartzeko)
+c.credits.models=Modeloak
+c.credits.sounds=Soinuak
+c.settings.gameplay.setup_completed=Hasierako konfigurazioa osatuta. (Marka kendu eta berrabiarazi berriz sartzeko)
unknown622=Eskatutako eremu guztiak bete behar dituzu.
unknown626=Onartu
-unknown63=Tutoriala hasi da
+c.settings.gameplay.tutorial_started=Tutoriala hasi da
unknown732=Aurrekoa
unknown736=Hurrengoa
unknown740=Batu / Ikusi
diff --git a/locale/fi.ini b/locale/fi.ini
index 8b8996a8..322a0fa8 100644
--- a/locale/fi.ini
+++ b/locale/fi.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=
-c.controls.interact=
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=
+c.settings.input.interact=
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=
c.credits.thanks=
c.credits.title=
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=
c.settings.audio.music_volume=
c.settings.audio.sfx_volume=
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=
-c.settings.fullscreen=
-c.settings.fullscreen.always=
-c.settings.fullscreen.keep=
-c.settings.fullscreen.never=
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=
+c.settings.graphics.fullscreen=
+c.settings.graphics.fullscreen.always=
+c.settings.graphics.fullscreen.keep=
+c.settings.graphics.fullscreen.never=
c.settings.gameplay=
-c.settings.gameplay.extend_boost=
-c.settings.gi=
-c.settings.gi.sdfgi=
-c.settings.gi.voxelgi=
-c.settings.glow=
+c.settings.gameplay.latch_boost=
+c.settings.graphics.gi=
+c.settings.graphics.gi.sdfgi=
+c.settings.graphics.gi.voxelgi=
+c.settings.graphics.glow=
c.settings.graphics=
c.settings.graphics.aa=
c.settings.graphics.ao=
c.settings.graphics.taa=
-c.settings.grass_amount=
-c.settings.language=
-c.settings.language.system=
-c.settings.low_poly_trees=
+c.settings.graphics.grass_amount=
+c.settings.ui.language=
+c.settings.ui.language.system=
+c.settings.graphics.lq_trees=
c.settings.other=
-c.settings.preset_high=
-c.settings.preset_low=
-c.settings.preset_medium=
-c.settings.server_data=
-c.settings.server_path=
-c.settings.server_path.placeholder=
-c.settings.shadows=
-c.settings.smooth_camera=
+c.settings.graphics.preset.high=
+c.settings.graphics.preset.low=
+c.settings.graphics.preset.medium=
+c.settings.other.server_data=
+c.settings.other.server_binary=
+c.settings.other.server_binary.placeholder=
+c.settings.graphics.shadows=
+c.settings.gameplay.interpolate_camera_rotation=
c.settings.ui=
c.settings.ui.scale_factor=
c.settings.ui.scale_mode=
c.settings.ui.scale_mode.resize=
c.settings.ui.touch_controls=
-c.settings.ui_blur=
+c.settings.graphics.ui_blur=
c.settings.username=
c.setup.contract_title=
c.setup.par00=
@@ -139,25 +139,25 @@ unknown464=
unknown476=
unknown484=
unknown488=
-unknown49=
-unknown494=
+c.settings.gameplay.invert_camera=
+c.hint.interact=
unknown506=
unknown510=
unknown514=
unknown518=
unknown524=
-unknown53=
+c.settings.gameplay.usernames=
unknown530=
unknown534=
unknown538=
unknown551=
unknown568=
-unknown572=
-unknown576=
-unknown59=
+c.credits.models=
+c.credits.sounds=
+c.settings.gameplay.setup_completed=
unknown622=
unknown626=
-unknown63=
+c.settings.gameplay.tutorial_started=
unknown732=
unknown736=
unknown740=
diff --git a/locale/fr.ini b/locale/fr.ini
index 157c56fa..4ae4a305 100644
--- a/locale/fr.ini
+++ b/locale/fr.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=Utilisez %s pour réinitialiser la caméra
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=Plein écran
-c.controls.interact=Entrez le chemin
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=Utilisez %s pour réinitialiser la caméra
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=Plein écran
+c.settings.input.interact=Entrez le chemin
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=développé par
c.credits.thanks=Merci d’avoir joué
c.credits.title=Hurry Curry! - un jeu sur la cuisine
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=Volume principal
c.settings.audio.music_volume=Volume de la musique
c.settings.audio.sfx_volume=Volume des effets sonores
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=Bouton de menu
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=Montrer les informations de débogage (Fréquence d’images, etc.)
-c.settings.fullscreen=Plein écran
-c.settings.fullscreen.always=Toujours
-c.settings.fullscreen.keep=Garder
-c.settings.fullscreen.never=Jamais
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=Bouton de menu
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=Montrer les informations de débogage (Fréquence d’images, etc.)
+c.settings.graphics.fullscreen=Plein écran
+c.settings.graphics.fullscreen.always=Toujours
+c.settings.graphics.fullscreen.keep=Garder
+c.settings.graphics.fullscreen.never=Jamais
c.settings.gameplay=
-c.settings.gameplay.extend_boost=Toujours prolonger le boost jusqu’à la durée maximale
-c.settings.gi=Luminosité générale
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=IG Voxel
-c.settings.glow=Activer la lueur
+c.settings.gameplay.latch_boost=Toujours prolonger le boost jusqu’à la durée maximale
+c.settings.graphics.gi=Luminosité générale
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=IG Voxel
+c.settings.graphics.glow=Activer la lueur
c.settings.graphics=Graphismes
c.settings.graphics.aa=Anti crénelage
c.settings.graphics.ao=Occlusion ambiante
c.settings.graphics.taa=Anti crénelage temporel
-c.settings.grass_amount=Quantité d’herbe 3D par tuile d’herbe
-c.settings.language=Langue
-c.settings.language.system=Défaut du système
-c.settings.low_poly_trees=Arbres de quelques polygones
+c.settings.graphics.grass_amount=Quantité d’herbe 3D par tuile d’herbe
+c.settings.ui.language=Langue
+c.settings.ui.language.system=Défaut du système
+c.settings.graphics.lq_trees=Arbres de quelques polygones
c.settings.other=
-c.settings.preset_high=Élevé
-c.settings.preset_low=Faible
-c.settings.preset_medium=Moyen
-c.settings.server_data=Répertoire de données du serveur (laisser vide pour la détection automatique)
-c.settings.server_path=Binaire du serveur (laisser vide pour rechercher le chemin)
-c.settings.server_path.placeholder=Entrez le chemin
-c.settings.shadows=Activer les ombres
-c.settings.smooth_camera=Interpoler la rotation de la caméra
+c.settings.graphics.preset.high=Élevé
+c.settings.graphics.preset.low=Faible
+c.settings.graphics.preset.medium=Moyen
+c.settings.other.server_data=Répertoire de données du serveur (laisser vide pour la détection automatique)
+c.settings.other.server_binary=Binaire du serveur (laisser vide pour rechercher le chemin)
+c.settings.other.server_binary.placeholder=Entrez le chemin
+c.settings.graphics.shadows=Activer les ombres
+c.settings.gameplay.interpolate_camera_rotation=Interpoler la rotation de la caméra
c.settings.ui=Nom d’utilisateur
c.settings.ui.scale_factor=Taille de l’interface utilisateur
c.settings.ui.scale_mode=Mode d’échelle de l’interface utilisateur
c.settings.ui.scale_mode.resize=Redimensionner
c.settings.ui.touch_controls=Activer les commandes de l’écran tactile
-c.settings.ui_blur=Activer le flou dans l’interface utilisateus
+c.settings.graphics.ui_blur=Activer le flou dans l’interface utilisateus
c.settings.username=Nom d’utilisateur
c.setup.contract_title=CONTRAT DE TRAVAIL
c.setup.par00=Ce contrat légal est rédigé entre vous (l’employé) et Musterfoods Ltd. (l’employeur) pour travailler comme chef ou serveur.
@@ -139,25 +139,25 @@ unknown464=-
unknown476=MAJUSCULE
unknown484=stick gauche
unknown488=BARRE D’ESPACE
-unknown49=Inverser le mouvement de caméra
-unknown494=Appuyez sur %s pour attraper des objets et maintenez %s enfoncé pour interagir avec les outils
+c.settings.gameplay.invert_camera=Inverser le mouvement de caméra
+c.hint.interact=Appuyez sur %s pour attraper des objets et maintenez %s enfoncé pour interagir avec les outils
unknown506=Page précédente/Page suivante
unknown510=Utilisez %s pour orienter le point de vue de la caméra
unknown514=Touches fléchées
unknown518=stick droit
unknown524=Les noms d’utilisateurs peuvent être activées/désactivées dans les paramètres
-unknown53=Montrer les noms d’utilisateur
+c.settings.gameplay.usernames=Montrer les noms d’utilisateur
unknown530=Appuyez sur %s et cliquez sur "Rejoindre" pour rejoindre le partie lorsqu’elle est en route
unknown534=ÉCHAP
unknown538=Bouton de menu
unknown551=Serveur (Indisponible)
unknown568=Coiffure %d
-unknown572=Modèles
-unknown576=Sons
-unknown59=Configuration initiale terminée. (Décochez et recommencer pour entrer à nouveau)
+c.credits.models=Modèles
+c.credits.sounds=Sons
+c.settings.gameplay.setup_completed=Configuration initiale terminée. (Décochez et recommencer pour entrer à nouveau)
unknown622=Vous devez remplir tous les champs requis.
unknown626=Accepter
-unknown63=Tutoriel commencé
+c.settings.gameplay.tutorial_started=Tutoriel commencé
unknown732=
unknown736=
unknown740=Regarder
diff --git a/locale/he.ini b/locale/he.ini
index 24141707..e27de6c9 100644
--- a/locale/he.ini
+++ b/locale/he.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=לחצו %s על מנת לאפס את מיקום המצלמה
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=מסך מלא
-c.controls.interact=הכנס נתיב
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=לחצו %s על מנת לאפס את מיקום המצלמה
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=מסך מלא
+c.settings.input.interact=הכנס נתיב
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=פותח על ידי
c.credits.thanks=תודה ששיחקתם
c.credits.title=הרי קרי! - משחק בישול
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=
c.settings.audio.music_volume=
c.settings.audio.sfx_volume=
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=כפתור התפריט
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=
-c.settings.fullscreen=מסך מלא
-c.settings.fullscreen.always=תמיד
-c.settings.fullscreen.keep=שמור
-c.settings.fullscreen.never=אף פעם
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=כפתור התפריט
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=
+c.settings.graphics.fullscreen=מסך מלא
+c.settings.graphics.fullscreen.always=תמיד
+c.settings.graphics.fullscreen.keep=שמור
+c.settings.graphics.fullscreen.never=אף פעם
c.settings.gameplay=
-c.settings.gameplay.extend_boost=תמיד הארך דחיפה לזמן המירבי
-c.settings.gi=תאורה גלובאלית
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=
-c.settings.glow=אפשר זוהר
+c.settings.gameplay.latch_boost=תמיד הארך דחיפה לזמן המירבי
+c.settings.graphics.gi=תאורה גלובאלית
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=
+c.settings.graphics.glow=אפשר זוהר
c.settings.graphics=גרפיקה
c.settings.graphics.aa=אנטי אליאסינג
c.settings.graphics.ao=ספיגה סביבתית
c.settings.graphics.taa=
-c.settings.grass_amount=כמות דשא תלת מימדית לכל אריח דשא
-c.settings.language=שפה
-c.settings.language.system=ברירת מחדל
-c.settings.low_poly_trees=
+c.settings.graphics.grass_amount=כמות דשא תלת מימדית לכל אריח דשא
+c.settings.ui.language=שפה
+c.settings.ui.language.system=ברירת מחדל
+c.settings.graphics.lq_trees=
c.settings.other=
-c.settings.preset_high=גבוה
-c.settings.preset_low=נמוך
-c.settings.preset_medium=
-c.settings.server_data=תקיית המידע של השרת (השאר ריק על מנת לזהות אוטומטית)
-c.settings.server_path=קובץ הרצה של השרת (השאר ריק על מנת לחפש ב PATH)
-c.settings.server_path.placeholder=הכנס נתיב
-c.settings.shadows=אפשר צללים
-c.settings.smooth_camera=
+c.settings.graphics.preset.high=גבוה
+c.settings.graphics.preset.low=נמוך
+c.settings.graphics.preset.medium=
+c.settings.other.server_data=תקיית המידע של השרת (השאר ריק על מנת לזהות אוטומטית)
+c.settings.other.server_binary=קובץ הרצה של השרת (השאר ריק על מנת לחפש ב PATH)
+c.settings.other.server_binary.placeholder=הכנס נתיב
+c.settings.graphics.shadows=אפשר צללים
+c.settings.gameplay.interpolate_camera_rotation=
c.settings.ui=שם משתמש
c.settings.ui.scale_factor=
c.settings.ui.scale_mode=
c.settings.ui.scale_mode.resize=שנה גודל
c.settings.ui.touch_controls=אפשר מסך מגע
-c.settings.ui_blur=
+c.settings.graphics.ui_blur=
c.settings.username=שם משתמש
c.setup.contract_title=חוזה מעביד
c.setup.par00=מסמך זה הינו חוזה המחייב בינך (העובד) ומאסטרפוד בע"מ (המעביד) על מנת לעבוד כשף או מלצר.
@@ -139,25 +139,25 @@ unknown464=
unknown476=SHIFT
unknown484=ג'ויסטיק שמאלי
unknown488=רווח
-unknown49=הפוך תזוזת מצלמה
-unknown494=
+c.settings.gameplay.invert_camera=הפוך תזוזת מצלמה
+c.hint.interact=
unknown506=PageUp/PageDown
unknown510=
unknown514=חיצים
unknown518=ג'ויסטיק ימני
unknown524=
-unknown53=הראה שמות משתמשים
+c.settings.gameplay.usernames=הראה שמות משתמשים
unknown530=
unknown534=Escape
unknown538=כפתור התפריט
unknown551=
unknown568=תספורת %d
-unknown572=מודלים
-unknown576=
-unknown59=אתחול ראשוני נגמר. (הורד סימון והדלק מחדש על מנת להכנס מחדש)
+c.credits.models=מודלים
+c.credits.sounds=
+c.settings.gameplay.setup_completed=אתחול ראשוני נגמר. (הורד סימון והדלק מחדש על מנת להכנס מחדש)
unknown622=אנא מלאו את כל השדות הנדרשים.
unknown626=אשר
-unknown63=הדרכה התחילה
+c.settings.gameplay.tutorial_started=הדרכה התחילה
unknown732=
unknown736=
unknown740=צפייה
diff --git a/locale/ja.ini b/locale/ja.ini
index 90f4a187..dc286bb5 100644
--- a/locale/ja.ini
+++ b/locale/ja.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=カメラをリセットするには %s を使用して
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=全画面
-c.controls.interact=パスを入力
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=カメラをリセットするには %s を使用して
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=全画面
+c.settings.input.interact=パスを入力
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=開発者
c.credits.thanks=プレイしていただきありがとうございます
c.credits.title=Hurry Curry!料理に関するゲーム
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=音量
c.settings.audio.music_volume=音量
c.settings.audio.sfx_volume=音量
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=メニューボタン
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=デバッグ情報を表示(フレームレートなど)
-c.settings.fullscreen=全画面
-c.settings.fullscreen.always=いつも
-c.settings.fullscreen.keep=保つ
-c.settings.fullscreen.never=決して
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=メニューボタン
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=デバッグ情報を表示(フレームレートなど)
+c.settings.graphics.fullscreen=全画面
+c.settings.graphics.fullscreen.always=いつも
+c.settings.graphics.fullscreen.keep=保つ
+c.settings.graphics.fullscreen.never=決して
c.settings.gameplay=
-c.settings.gameplay.extend_boost=ブーストを常に最大限に拡張する
-c.settings.gi=グローバルイルミネーション
-c.settings.gi.sdfgi=SDFGI
-c.settings.gi.voxelgi=Voxel GI
-c.settings.glow=グローを有効に
+c.settings.gameplay.latch_boost=ブーストを常に最大限に拡張する
+c.settings.graphics.gi=グローバルイルミネーション
+c.settings.graphics.gi.sdfgi=SDFGI
+c.settings.graphics.gi.voxelgi=Voxel GI
+c.settings.graphics.glow=グローを有効に
c.settings.graphics=グラフィックス
c.settings.graphics.aa=アンチエイリアシング
c.settings.graphics.ao=アンビエントオクルージョン
c.settings.graphics.taa=テンポラルアンチエイリアシング
-c.settings.grass_amount=芝生タイルあたりの3D芝生
-c.settings.language=言語
-c.settings.language.system=システムのデフォルト
-c.settings.low_poly_trees=ローポリ木
+c.settings.graphics.grass_amount=芝生タイルあたりの3D芝生
+c.settings.ui.language=言語
+c.settings.ui.language.system=システムのデフォルト
+c.settings.graphics.lq_trees=ローポリ木
c.settings.other=
-c.settings.preset_high=高
-c.settings.preset_low=悪い
-c.settings.preset_medium=正常
-c.settings.server_data=サーバーデータディレクトリ(させて空の -> 自動検出)
-c.settings.server_path=サーバーバイナリ(させて空の ->「パス」)
-c.settings.server_path.placeholder=パスを入力
-c.settings.shadows=影を有効に
-c.settings.smooth_camera=カメラの回転を補間
+c.settings.graphics.preset.high=高
+c.settings.graphics.preset.low=悪い
+c.settings.graphics.preset.medium=正常
+c.settings.other.server_data=サーバーデータディレクトリ(させて空の -> 自動検出)
+c.settings.other.server_binary=サーバーバイナリ(させて空の ->「パス」)
+c.settings.other.server_binary.placeholder=パスを入力
+c.settings.graphics.shadows=影を有効に
+c.settings.gameplay.interpolate_camera_rotation=カメラの回転を補間
c.settings.ui=ユーザー名
c.settings.ui.scale_factor=UIスケール
c.settings.ui.scale_mode=UIスケール
c.settings.ui.scale_mode.resize=サイズ変更
c.settings.ui.touch_controls=タッチスクリーンコントロールを有効に
-c.settings.ui_blur=グローを有効に
+c.settings.graphics.ui_blur=グローを有効に
c.settings.username=ユーザー名
c.setup.contract_title=「雇用契約」
c.setup.par00=これは雇用契約。あなた【 従業員】と Musterfoods Ltd.【雇用主】の間のシェフやウェイターとして働く。
@@ -139,25 +139,25 @@ unknown464=-
unknown476=「シフト」
unknown484=左スティック
unknown488=「スペース」
-unknown49=カメラの動きを反転
-unknown494=%s キーを押すとアイテムを拾い、 %s キーを押したままにするとツールを操作できます
+c.settings.gameplay.invert_camera=カメラの動きを反転
+c.hint.interact=%s キーを押すとアイテムを拾い、 %s キーを押したままにするとツールを操作できます
unknown506=ページアップ/ページダウン
unknown510=カメラをリセットするには %s を使用して
unknown514=矢印キー
unknown518=右スティック
unknown524=ユーザー名は設定で有効/無効にできます
-unknown53=ユーザー名を表示
+c.settings.gameplay.usernames=ユーザー名を表示
unknown530=ゲームに参加するには、 %s を押して「参加」をクリック
unknown534=「エスケープ」
unknown538=メニューボタン
unknown551=利用不可
unknown568=髪型 %d
-unknown572=モデル
-unknown576=サウンド
-unknown59=初期設定完了。(チェックを外して再起動して)
+c.credits.models=モデル
+c.credits.sounds=サウンド
+c.settings.gameplay.setup_completed=初期設定完了。(チェックを外して再起動して)
unknown622=要求されたフィールドをすべて入力する必要があります。
unknown626=アクセプト
-unknown63=チュートリアルを開始
+c.settings.gameplay.tutorial_started=チュートリアルを開始
unknown732=
unknown736=
unknown740=観戦
diff --git a/locale/pl.ini b/locale/pl.ini
index a51b29b5..2fcc0e17 100644
--- a/locale/pl.ini
+++ b/locale/pl.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=Użyj %s aby obrócić kamerę
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=Pełny ekran
-c.controls.interact=Podaj ścieżkę
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=Użyj %s aby obrócić kamerę
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.rotate_chat=
+c.settings.input.fullscreen=Pełny ekran
+c.settings.input.interact=Podaj ścieżkę
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=stworzone przez
c.credits.thanks=Dziękujemy za grę
c.credits.title=Hurry Curry! - gra o gotowaniu
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=Głośność główna
c.settings.audio.music_volume=Głośność muzyki
c.settings.audio.sfx_volume=Głośność efektów dźwiękowych
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=przycisk menu
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=Wyświetlaj informacje debugowania (częstość klatek itp.)
-c.settings.fullscreen=Pełny ekran
-c.settings.fullscreen.always=Zawsze
-c.settings.fullscreen.keep=Zachowaj
-c.settings.fullscreen.never=Nigdy
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=przycisk menu
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=Wyświetlaj informacje debugowania (częstość klatek itp.)
+c.settings.graphics.fullscreen=Pełny ekran
+c.settings.graphics.fullscreen.always=Zawsze
+c.settings.graphics.fullscreen.keep=Zachowaj
+c.settings.graphics.fullscreen.never=Nigdy
c.settings.gameplay=
-c.settings.gameplay.extend_boost=Zawsze wydłużaj przyspieszenie do maksymalnego czasu trwania
-c.settings.gi=Globalne oświetlenie
-c.settings.gi.sdfgi=SDF
-c.settings.gi.voxelgi=Oświetlenie wokselowe
-c.settings.glow=Połysk
+c.settings.gameplay.latch_boost=Zawsze wydłużaj przyspieszenie do maksymalnego czasu trwania
+c.settings.graphics.gi=Globalne oświetlenie
+c.settings.graphics.gi.sdfgi=SDF
+c.settings.graphics.gi.voxelgi=Oświetlenie wokselowe
+c.settings.graphics.glow=Połysk
c.settings.graphics=Ustawienia grafiki
c.settings.graphics.aa=Antyaliasing
c.settings.graphics.ao=Okluzja otoczenia
c.settings.graphics.taa=Antyaliasing temporalny
-c.settings.grass_amount=Gęstość trawy 3D
-c.settings.language=Język
-c.settings.language.system=Domyślny systemowy
-c.settings.low_poly_trees=Drzewa low-poly
+c.settings.graphics.grass_amount=Gęstość trawy 3D
+c.settings.ui.language=Język
+c.settings.ui.language.system=Domyślny systemowy
+c.settings.graphics.lq_trees=Drzewa low-poly
c.settings.other=
-c.settings.preset_high=Wysokie
-c.settings.preset_low=Niskie
-c.settings.preset_medium=Średnie
-c.settings.server_data=Folder danych serwera (pozostaw puste aby wykryć automatycznie)
-c.settings.server_path=Plik wykonywalny serwera (pozostaw puste aby przeszukać ścieżkę PATH)
-c.settings.server_path.placeholder=Podaj ścieżkę
-c.settings.shadows=Cienie
-c.settings.smooth_camera=Gładki obrót kamery
+c.settings.graphics.preset.high=Wysokie
+c.settings.graphics.preset.low=Niskie
+c.settings.graphics.preset.medium=Średnie
+c.settings.other.server_data=Folder danych serwera (pozostaw puste aby wykryć automatycznie)
+c.settings.other.server_binary=Plik wykonywalny serwera (pozostaw puste aby przeszukać ścieżkę PATH)
+c.settings.other.server_binary.placeholder=Podaj ścieżkę
+c.settings.graphics.shadows=Cienie
+c.settings.gameplay.interpolate_camera_rotation=Gładki obrót kamery
c.settings.ui=Nazwa użytkownika
c.settings.ui.scale_factor=Stopień skalowania interfejsu
c.settings.ui.scale_mode=Skalowanie interfejsu
c.settings.ui.scale_mode.resize=Dopasuj
c.settings.ui.touch_controls=Sterowanie dotykowe
-c.settings.ui_blur=Rozmycie interfejsu
+c.settings.graphics.ui_blur=Rozmycie interfejsu
c.settings.username=Nazwa użytkownika
c.setup.contract_title=UMOWA ZATRUDNIENIA
c.setup.par00=Niniejszy dokument stanowi umowę między Panem/Panią (zatrudnionym) a Musterfoods sp. z o. o. (pracodawcą) na stanowisku kucharz/kelner.
@@ -139,25 +139,25 @@ unknown464=-
unknown476=SHIFT
unknown484=lewy dżojstik
unknown488=SPACJA
-unknown49=Odwrócone sterowanie kamerą
-unknown494=Wciśnij %s aby podnieść przedmioty i przytrzymaj %s aby użyć narzędzia
+c.settings.gameplay.invert_camera=Odwrócone sterowanie kamerą
+c.hint.interact=Wciśnij %s aby podnieść przedmioty i przytrzymaj %s aby użyć narzędzia
unknown506=PageUp/PageDown
unknown510=Użyj %s aby obrócić kamerę
unknown514=klawisze strzałek
unknown518=prawy dżojstik
unknown524=Tagi z nazwą użytkownika możesz włączyć/wyłączyć w ustawieniach
-unknown53=Pokazywanie tagów z nazwą użytkownika
+c.settings.gameplay.usernames=Pokazywanie tagów z nazwą użytkownika
unknown530=Wciśnij %s i wybierz "Dołącz" aby dołączyć do gry w toku
unknown534=ESCAPE
unknown538=przycisk menu
unknown551=niedostępne
unknown568=Fryzura %d
-unknown572=Modele
-unknown576=Oprawa dźwiękowa
-unknown59=Konfiguracja wstępna ukończona. (Odznacz i zrestartuj aby wykonać ponownie)
+c.credits.models=Modele
+c.credits.sounds=Oprawa dźwiękowa
+c.settings.gameplay.setup_completed=Konfiguracja wstępna ukończona. (Odznacz i zrestartuj aby wykonać ponownie)
unknown622=Musisz wypełnić wymagane pola.
unknown626=Zatwierdź
-unknown63=Tutorial rozpoczęty
+c.settings.gameplay.tutorial_started=Tutorial rozpoczęty
unknown732=
unknown736=
unknown740=Oglądaj
diff --git a/locale/pt.ini b/locale/pt.ini
index 8b8996a8..322a0fa8 100644
--- a/locale/pt.ini
+++ b/locale/pt.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=
-c.controls.interact=
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=
+c.settings.input.interact=
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=
c.credits.thanks=
c.credits.title=
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=
c.settings.audio.music_volume=
c.settings.audio.sfx_volume=
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=
-c.settings.fullscreen=
-c.settings.fullscreen.always=
-c.settings.fullscreen.keep=
-c.settings.fullscreen.never=
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=
+c.settings.graphics.fullscreen=
+c.settings.graphics.fullscreen.always=
+c.settings.graphics.fullscreen.keep=
+c.settings.graphics.fullscreen.never=
c.settings.gameplay=
-c.settings.gameplay.extend_boost=
-c.settings.gi=
-c.settings.gi.sdfgi=
-c.settings.gi.voxelgi=
-c.settings.glow=
+c.settings.gameplay.latch_boost=
+c.settings.graphics.gi=
+c.settings.graphics.gi.sdfgi=
+c.settings.graphics.gi.voxelgi=
+c.settings.graphics.glow=
c.settings.graphics=
c.settings.graphics.aa=
c.settings.graphics.ao=
c.settings.graphics.taa=
-c.settings.grass_amount=
-c.settings.language=
-c.settings.language.system=
-c.settings.low_poly_trees=
+c.settings.graphics.grass_amount=
+c.settings.ui.language=
+c.settings.ui.language.system=
+c.settings.graphics.lq_trees=
c.settings.other=
-c.settings.preset_high=
-c.settings.preset_low=
-c.settings.preset_medium=
-c.settings.server_data=
-c.settings.server_path=
-c.settings.server_path.placeholder=
-c.settings.shadows=
-c.settings.smooth_camera=
+c.settings.graphics.preset.high=
+c.settings.graphics.preset.low=
+c.settings.graphics.preset.medium=
+c.settings.other.server_data=
+c.settings.other.server_binary=
+c.settings.other.server_binary.placeholder=
+c.settings.graphics.shadows=
+c.settings.gameplay.interpolate_camera_rotation=
c.settings.ui=
c.settings.ui.scale_factor=
c.settings.ui.scale_mode=
c.settings.ui.scale_mode.resize=
c.settings.ui.touch_controls=
-c.settings.ui_blur=
+c.settings.graphics.ui_blur=
c.settings.username=
c.setup.contract_title=
c.setup.par00=
@@ -139,25 +139,25 @@ unknown464=
unknown476=
unknown484=
unknown488=
-unknown49=
-unknown494=
+c.settings.gameplay.invert_camera=
+c.hint.interact=
unknown506=
unknown510=
unknown514=
unknown518=
unknown524=
-unknown53=
+c.settings.gameplay.usernames=
unknown530=
unknown534=
unknown538=
unknown551=
unknown568=
-unknown572=
-unknown576=
-unknown59=
+c.credits.models=
+c.credits.sounds=
+c.settings.gameplay.setup_completed=
unknown622=
unknown626=
-unknown63=
+c.settings.gameplay.tutorial_started=
unknown732=
unknown736=
unknown740=
diff --git a/locale/tools/src/main.rs b/locale/tools/src/main.rs
index 1ae59c83..68805b99 100644
--- a/locale/tools/src/main.rs
+++ b/locale/tools/src/main.rs
@@ -26,11 +26,30 @@ enum Args {
ExportPo {
#[arg(long)]
remap_ids: Option<PathBuf>,
+ #[arg(long)]
+ fallback: Option<PathBuf>,
input: PathBuf,
output: PathBuf,
},
}
+static NATIVE_LANGUAGE_NAMES: &[(&'static str, &'static str)] = &[
+ ("en", "English"),
+ ("de", "Deutsch"),
+ ("fr", "Français"),
+ ("es", "Español"),
+ ("eu", "euskara"),
+ ("ja", "日本語"),
+ ("he", "עִברִית"),
+ ("tr", "Türkçe"),
+ ("fi", "suomen"),
+ ("ar", "العربية"),
+ ("zh_Hans", "中文 (简化字)"),
+ ("zh_Hant", "中文 (繁體字)"),
+ ("pl", "Polski"),
+ ("pt", "Português"),
+];
+
fn main() -> Result<()> {
let args = Args::parse();
match args {
@@ -38,9 +57,23 @@ fn main() -> Result<()> {
remap_ids: id_map,
input,
output,
+ fallback,
} => {
- let ini = load_ini(&input)?;
+ let mut ini = load_ini(&input)?;
let id_map = id_map.map(|path| load_ini(&path)).transpose()?;
+ if let Some(fallback) = fallback {
+ let f = load_ini(&fallback)?;
+ for (k, v) in f {
+ if !ini.contains_key(&k) {
+ eprintln!("fallback: key {k:?} is missing");
+ ini.insert(k, v);
+ }
+ }
+ }
+
+ for &(code, name) in NATIVE_LANGUAGE_NAMES {
+ ini.insert(format!("c.settings.ui.language.{code}"), name.to_owned());
+ }
File::create(output)?.write_all(
format!(
diff --git a/locale/tr.ini b/locale/tr.ini
index 8b8996a8..322a0fa8 100644
--- a/locale/tr.ini
+++ b/locale/tr.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=
-c.controls.interact=
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=
+c.settings.input.interact=
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=
c.credits.thanks=
c.credits.title=
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=
c.settings.audio.music_volume=
c.settings.audio.sfx_volume=
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=
-c.settings.fullscreen=
-c.settings.fullscreen.always=
-c.settings.fullscreen.keep=
-c.settings.fullscreen.never=
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=
+c.settings.graphics.fullscreen=
+c.settings.graphics.fullscreen.always=
+c.settings.graphics.fullscreen.keep=
+c.settings.graphics.fullscreen.never=
c.settings.gameplay=
-c.settings.gameplay.extend_boost=
-c.settings.gi=
-c.settings.gi.sdfgi=
-c.settings.gi.voxelgi=
-c.settings.glow=
+c.settings.gameplay.latch_boost=
+c.settings.graphics.gi=
+c.settings.graphics.gi.sdfgi=
+c.settings.graphics.gi.voxelgi=
+c.settings.graphics.glow=
c.settings.graphics=
c.settings.graphics.aa=
c.settings.graphics.ao=
c.settings.graphics.taa=
-c.settings.grass_amount=
-c.settings.language=
-c.settings.language.system=
-c.settings.low_poly_trees=
+c.settings.graphics.grass_amount=
+c.settings.ui.language=
+c.settings.ui.language.system=
+c.settings.graphics.lq_trees=
c.settings.other=
-c.settings.preset_high=
-c.settings.preset_low=
-c.settings.preset_medium=
-c.settings.server_data=
-c.settings.server_path=
-c.settings.server_path.placeholder=
-c.settings.shadows=
-c.settings.smooth_camera=
+c.settings.graphics.preset.high=
+c.settings.graphics.preset.low=
+c.settings.graphics.preset.medium=
+c.settings.other.server_data=
+c.settings.other.server_binary=
+c.settings.other.server_binary.placeholder=
+c.settings.graphics.shadows=
+c.settings.gameplay.interpolate_camera_rotation=
c.settings.ui=
c.settings.ui.scale_factor=
c.settings.ui.scale_mode=
c.settings.ui.scale_mode.resize=
c.settings.ui.touch_controls=
-c.settings.ui_blur=
+c.settings.graphics.ui_blur=
c.settings.username=
c.setup.contract_title=
c.setup.par00=
@@ -139,25 +139,25 @@ unknown464=
unknown476=
unknown484=
unknown488=
-unknown49=
-unknown494=
+c.settings.gameplay.invert_camera=
+c.hint.interact=
unknown506=
unknown510=
unknown514=
unknown518=
unknown524=
-unknown53=
+c.settings.gameplay.usernames=
unknown530=
unknown534=
unknown538=
unknown551=
unknown568=
-unknown572=
-unknown576=
-unknown59=
+c.credits.models=
+c.credits.sounds=
+c.settings.gameplay.setup_completed=
unknown622=
unknown626=
-unknown63=
+c.settings.gameplay.tutorial_started=
unknown732=
unknown736=
unknown740=
diff --git a/locale/zh_Hans.ini b/locale/zh_Hans.ini
index 3042b7ec..5ea728f5 100644
--- a/locale/zh_Hans.ini
+++ b/locale/zh_Hans.ini
@@ -1,45 +1,48 @@
[hurrycurry]
-c.controls.boost=加速移动
-c.controls.camera_down=向下旋转摄像头
-c.controls.camera_left=向左旋转摄像头
-c.controls.camera_reset=重置摄像头视图
-c.controls.camera_right=向右旋转摄像头
-c.controls.camera_up=向上旋转摄像头
-c.controls.chat=切换聊天
-c.controls.fullscreen=切换全屏
-c.controls.interact=交互
-c.controls.move_backward=向后移动
-c.controls.move_forward=向前移动
-c.controls.move_left=向左移动
-c.controls.move_right=向右移动
-c.controls.zoom_in=放大
-c.controls.zoom_in_discrete=放大(离散)
-c.controls.zoom_out=缩小
-c.controls.zoom_out_discrete=缩小(离散)
+c.settings.input.boost=加速移动
+c.settings.input.rotate_down=向下旋转摄像头
+c.settings.input.rotate_left=向左旋转摄像头
+c.settings.input.reset=重置摄像头视图
+c.settings.input.rotate_right=向右旋转摄像头
+c.settings.input.rotate_up=向上旋转摄像头
+c.settings.input.chat=切换聊天
+c.settings.input.fullscreen=切换全屏
+c.settings.input.interact=交互
+c.settings.input.backwards=向后移动
+c.settings.input.forwards=向前移动
+c.settings.input.left=向左移动
+c.settings.input.right=向右移动
+c.settings.input.zoom_in_discrete=放大(离散)
+c.settings.input.zoom_in=放大
+c.settings.input.zoom_out_discrete=缩小(离散)
+c.settings.input.zoom_out=缩小
c.credits.developed_by=开发人员
+c.credits.models=模型
+c.credits.sounds=声音
c.credits.thanks=谢谢你玩
c.credits.title=Hurry Curry! — 一个关于烹饪的游戏
-c.error=错误
c.error.cannot_cancel_no_game=无法取消游戏,因为没有游戏正在运行。
c.error.must_join_to_cancel=您必须加入才能取消当前游戏。
c.error.placeholder=这应该是错误消息。
c.error.websocket=WebSocket 已关闭,代码为:%d,原因 %s。清理:%s
-c.hint=提示
+c.error=错误
c.hint.boost=按 %s 来加速
c.hint.framerate_low=您的帧速率似乎较低。您可以在设置菜单中降低图形设置。
+c.hint.interact=按下 %s 可拾取物品,按住 %s 可与工具交互
c.hint.movement=使用 %s 来移动
c.hint.reset_camera=按 %s 重置摄像头视图
c.hint.zoom_camera=使用 %s 放大/缩小
+c.hint=提示
c.lobby.botenable=启用机器人
c.lobby.mapname=地图名称
c.lobby.players=玩家
c.lobby.start=开始游戏
-c.map.difficulty=难度
c.map.difficulty.0=简单
c.map.difficulty.1=困难
c.map.difficulty.2=中等
c.map.difficulty.3=无法玩
c.map.difficulty.4=非常困难
+c.map.difficulty=难度
c.map.players_recommended=%d 名玩家推荐
c.menu.back=返回
c.menu.credits=致谢
@@ -53,10 +56,10 @@ c.menu.ingame.reconnect=重新连接
c.menu.ingame.resume=重新开始
c.menu.ingame.spectate=旁观
c.menu.my_chef=我的厨师
-c.menu.play=玩
c.menu.play.connect=连接
c.menu.play.quick_connect=快速连接
c.menu.play.server=服务器
+c.menu.play=玩
c.menu.quit=退出
c.menu.settings=设置
c.score.acceptable=可接受的服务
@@ -64,56 +67,60 @@ c.score.completed=已完成
c.score.excellent=优质服务
c.score.failed=失败
c.score.good=服务好
-c.score.points=积分
c.score.points_par=您已收集 %s 积分
+c.score.points=积分
c.score.poor=服务差
c.settings.apply=保存并应用
-c.settings.audio=音频
c.settings.audio.master_volume=主音量
c.settings.audio.music_volume=音乐音量
c.settings.audio.sfx_volume=音效音量
-c.settings.controls=限定
-c.settings.controls.add=添加新的
-c.settings.controls.joypad=%s(游戏手柄)
-c.settings.controls.joypad_axis=游戏手柄轴 %s
-c.settings.controls.keyboard=%s(键盘)
-c.settings.controls.mouse_button=鼠标按钮 %s
-c.settings.controls.other_event=其他活动
-c.settings.controls.press_any_key=按任意键…
-c.settings.debug_info=显示调试信息(帧率等)
-c.settings.fullscreen=全屏
-c.settings.fullscreen.always=始终
-c.settings.fullscreen.keep=保持
-c.settings.fullscreen.never=从不
+c.settings.audio=音频
+c.settings.gameplay.interpolate_camera_rotation=平滑的摄像头旋转
+c.settings.gameplay.invert_camera=反转摄像头移动
+c.settings.gameplay.latch_boost=始终将加速延长至最大持续时间
+c.settings.gameplay.setup_completed=初始设置完成。(取消选中并重启以重新进入)
+c.settings.gameplay.tutorial_started=教程已开始
+c.settings.gameplay.usernames=显示用户名标签
c.settings.gameplay=游戏玩法
-c.settings.gameplay.extend_boost=始终将加速延长至最大持续时间
-c.settings.gi=全局照明
-c.settings.gi.sdfgi=有符号距离场全局照明
-c.settings.gi.voxelgi=体素全局照明
-c.settings.glow=启用辉光
-c.settings.graphics=图形
c.settings.graphics.aa=抗锯齿
c.settings.graphics.ao=环境光遮蔽
+c.settings.graphics.debug_info=显示调试信息(帧率等)
+c.settings.graphics.fullscreen.always=始终
+c.settings.graphics.fullscreen.keep=保持
+c.settings.graphics.fullscreen.never=从不
+c.settings.graphics.fullscreen=全屏
+c.settings.graphics.gi.sdfgi=有符号距离场全局照明
+c.settings.graphics.gi.voxelgi=体素全局照明
+c.settings.graphics.gi=全局照明
+c.settings.graphics.glow=启用辉光
+c.settings.graphics.grass_amount=每块草砖的 3D 草量
+c.settings.graphics.lq_trees=低多边形树
+c.settings.graphics.preset.high=高
+c.settings.graphics.preset.low=低
+c.settings.graphics.preset.medium=中
+c.settings.graphics.shadows=启用阴影
c.settings.graphics.taa=随机采样抗锯齿
-c.settings.grass_amount=每块草砖的 3D 草量
-c.settings.language=语言
-c.settings.language.system=系统默认
-c.settings.low_poly_trees=低多边形树
+c.settings.graphics.ui_blur=启用用户界面模糊
+c.settings.graphics=图形
+c.settings.input.add=添加新的
+c.settings.input.joypad_axis=游戏手柄轴 %s
+c.settings.input.joypad=%s(游戏手柄)
+c.settings.input.keyboard=%s(键盘)
+c.settings.input.mouse_button=鼠标按钮 %s
+c.settings.input.other_event=其他活动
+c.settings.input.press_any_key=按任意键…
+c.settings.input=限定
+c.settings.other.server_binary.placeholder=输入路径
+c.settings.other.server_binary=服务器二进制文件(留空以搜索路径)
+c.settings.other.server_data=服务器数据目录(留空以自动检测)
c.settings.other=其他
-c.settings.preset_high=高
-c.settings.preset_low=低
-c.settings.preset_medium=中
-c.settings.server_data=服务器数据目录(留空以自动检测)
-c.settings.server_path=服务器二进制文件(留空以搜索路径)
-c.settings.server_path.placeholder=输入路径
-c.settings.shadows=启用阴影
-c.settings.smooth_camera=平滑的摄像头旋转
-c.settings.ui=用户界面
+c.settings.ui.language.system=系统默认
+c.settings.ui.language=语言
c.settings.ui.scale_factor=用户界面比例系数
-c.settings.ui.scale_mode=用户界面缩放模式
c.settings.ui.scale_mode.resize=调整大小
+c.settings.ui.scale_mode=用户界面缩放模式
c.settings.ui.touch_controls=启用触摸屏控制
-c.settings.ui_blur=启用用户界面模糊
+c.settings.ui=用户界面
c.settings.username=用户名
c.setup.contract_title=雇佣合同
c.setup.par00=这是您(雇员)和 Musterfoods Ltd. (雇主)之间有约束力的厨师或服务员合同。
@@ -139,25 +146,18 @@ unknown464=-
unknown476=Shift
unknown484=左摇杆
unknown488=空格键
-unknown49=反转摄像头移动
-unknown494=按下 %s 可拾取物品,按住 %s 可与工具交互
unknown506=向上/向下翻页
unknown510=使用 %s 旋转摄像头视图
unknown514=方向键
unknown518=右摇杆
unknown524=可以在设置中启用/禁用用户名标签
-unknown53=显示用户名标签
unknown530=按 %s 并单击“加入”以在游戏运行时加入游戏
unknown534=Esc
unknown538=菜单按钮
unknown551=不可用
unknown568=发型 %d
-unknown572=模型
-unknown576=声音
-unknown59=初始设置完成。(取消选中并重启以重新进入)
unknown622=您必须填写所有要求的字段。
unknown626=接受
-unknown63=教程已开始
unknown732=上一个
unknown736=下一个
unknown740=加入/旁观
diff --git a/locale/zh_Hant.ini b/locale/zh_Hant.ini
index 167f1bd9..6e304c2c 100644
--- a/locale/zh_Hant.ini
+++ b/locale/zh_Hant.ini
@@ -1,21 +1,21 @@
[hurrycurry]
-c.controls.boost=
-c.controls.camera_down=
-c.controls.camera_left=
-c.controls.camera_reset=使用 %s 來旋轉相機視角
-c.controls.camera_right=
-c.controls.camera_up=
-c.controls.chat=
-c.controls.fullscreen=全螢幕
-c.controls.interact=輸入路徑
-c.controls.move_backward=
-c.controls.move_forward=
-c.controls.move_left=
-c.controls.move_right=
-c.controls.zoom_in=
-c.controls.zoom_in_discrete=
-c.controls.zoom_out=
-c.controls.zoom_out_discrete=
+c.settings.input.boost=
+c.settings.input.rotate_down=
+c.settings.input.rotate_left=
+c.settings.input.reset=使用 %s 來旋轉相機視角
+c.settings.input.rotate_right=
+c.settings.input.rotate_up=
+c.settings.input.chat=
+c.settings.input.fullscreen=全螢幕
+c.settings.input.interact=輸入路徑
+c.settings.input.backwards=
+c.settings.input.forwards=
+c.settings.input.left=
+c.settings.input.right=
+c.settings.input.zoom_in=
+c.settings.input.zoom_in_discrete=
+c.settings.input.zoom_out=
+c.settings.input.zoom_out_discrete=
c.credits.developed_by=開發者
c.credits.thanks=感謝你遊玩
c.credits.title=Hurry Curry!—一個關於烹飪的遊戲
@@ -72,48 +72,48 @@ c.settings.audio=
c.settings.audio.master_volume=主音量
c.settings.audio.music_volume=音樂音量
c.settings.audio.sfx_volume=音效音量
-c.settings.controls=
-c.settings.controls.add=
-c.settings.controls.joypad=
-c.settings.controls.joypad_axis=
-c.settings.controls.keyboard=
-c.settings.controls.mouse_button=選單按鈕
-c.settings.controls.other_event=
-c.settings.controls.press_any_key=
-c.settings.debug_info=顯示偵錯資訊(幀率等)
-c.settings.fullscreen=全螢幕
-c.settings.fullscreen.always=總是
-c.settings.fullscreen.keep=保留
-c.settings.fullscreen.never=永不
+c.settings.input=
+c.settings.input.add=
+c.settings.input.joypad=
+c.settings.input.joypad_axis=
+c.settings.input.keyboard=
+c.settings.input.mouse_button=選單按鈕
+c.settings.input.other_event=
+c.settings.input.press_any_key=
+c.settings.graphics.debug_info=顯示偵錯資訊(幀率等)
+c.settings.graphics.fullscreen=全螢幕
+c.settings.graphics.fullscreen.always=總是
+c.settings.graphics.fullscreen.keep=保留
+c.settings.graphics.fullscreen.never=永不
c.settings.gameplay=
-c.settings.gameplay.extend_boost=總是將加速延長至最長持續時間
-c.settings.gi=全域照明
-c.settings.gi.sdfgi=有符號距離場全域照明(SDFGI)
-c.settings.gi.voxelgi=Voxel 全域照明
-c.settings.glow=啟用發光
+c.settings.gameplay.latch_boost=總是將加速延長至最長持續時間
+c.settings.graphics.gi=全域照明
+c.settings.graphics.gi.sdfgi=有符號距離場全域照明(SDFGI)
+c.settings.graphics.gi.voxelgi=Voxel 全域照明
+c.settings.graphics.glow=啟用發光
c.settings.graphics=圖形
c.settings.graphics.aa=抗鋸齒
c.settings.graphics.ao=環境遮擋
c.settings.graphics.taa=時間抗鋸齒
-c.settings.grass_amount=每個草塊的 3D 草量
-c.settings.language=語言
-c.settings.language.system=系統預設
-c.settings.low_poly_trees=低多邊形樹
+c.settings.graphics.grass_amount=每個草塊的 3D 草量
+c.settings.ui.language=語言
+c.settings.ui.language.system=系統預設
+c.settings.graphics.lq_trees=低多邊形樹
c.settings.other=
-c.settings.preset_high=高
-c.settings.preset_low=低
-c.settings.preset_medium=中
-c.settings.server_data=伺服器資料目錄(留空以自動偵測)
-c.settings.server_path=伺服器二進制檔案(留空以搜尋 PATH)
-c.settings.server_path.placeholder=輸入路徑
-c.settings.shadows=啟用陰影
-c.settings.smooth_camera=平滑的相機旋轉
+c.settings.graphics.preset.high=高
+c.settings.graphics.preset.low=低
+c.settings.graphics.preset.medium=中
+c.settings.other.server_data=伺服器資料目錄(留空以自動偵測)
+c.settings.other.server_binary=伺服器二進制檔案(留空以搜尋 PATH)
+c.settings.other.server_binary.placeholder=輸入路徑
+c.settings.graphics.shadows=啟用陰影
+c.settings.gameplay.interpolate_camera_rotation=平滑的相機旋轉
c.settings.ui=使用者名稱
c.settings.ui.scale_factor=介面比例系數
c.settings.ui.scale_mode=介面縮放模式
c.settings.ui.scale_mode.resize=調整大小
c.settings.ui.touch_controls=啟用觸控螢幕控制
-c.settings.ui_blur=啟用介面模糊
+c.settings.graphics.ui_blur=啟用介面模糊
c.settings.username=使用者名稱
c.setup.contract_title=僱傭合約
c.setup.par00=這是你(僱員)和 Musterfoods Ltd.(僱主)之間關於擔任廚師或服務生的具有約束力的合約。
@@ -139,25 +139,25 @@ unknown464=-
unknown476=SHIFT
unknown484=左搖桿
unknown488=空白鍵
-unknown49=反相相機移動
-unknown494=按下 %s 來拾取物品並按住 %s 來與工具互動
+c.settings.gameplay.invert_camera=反相相機移動
+c.hint.interact=按下 %s 來拾取物品並按住 %s 來與工具互動
unknown506=PageUp/PageDown
unknown510=使用 %s 來旋轉相機視角
unknown514=方向鍵
unknown518=右搖桿
unknown524=可以在設定中啟用/停用使用者名稱標籤
-unknown53=顯示使用者名稱標籤
+c.settings.gameplay.usernames=顯示使用者名稱標籤
unknown530=按下 %s 並點擊「加入」以在遊戲運行時加入
unknown534=ESCAPE
unknown538=選單按鈕
unknown551=不可用
unknown568=髮型 %d
-unknown572=模型
-unknown576=聲音
-unknown59=初始設定完成。(取消勾選並重新啟動以重新進入)
+c.credits.models=模型
+c.credits.sounds=聲音
+c.settings.gameplay.setup_completed=初始設定完成。(取消勾選並重新啟動以重新進入)
unknown622=你必須填寫所有要求的欄位。
unknown626=接受
-unknown63=教程已啟動
+c.settings.gameplay.tutorial_started=教程已啟動
unknown732=
unknown736=
unknown740=旁觀