diff options
-rw-r--r-- | client/menu/main.gd | 2 | ||||
-rw-r--r-- | client/menu/play.gd | 28 | ||||
-rw-r--r-- | client/menu/rating/rating.tscn | 2 | ||||
-rw-r--r-- | client/project.godot | 2 | ||||
-rw-r--r-- | client/server_list.gd | 106 | ||||
-rw-r--r-- | client/server_list.tscn | 8 | ||||
-rw-r--r-- | client/settings.gd | 7 | ||||
-rw-r--r-- | locale/ar.ini | 2 | ||||
-rw-r--r-- | locale/de.ini | 2 | ||||
-rw-r--r-- | locale/en.ini | 106 | ||||
-rw-r--r-- | locale/es.ini | 2 | ||||
-rw-r--r-- | locale/eu.ini | 2 | ||||
-rw-r--r-- | locale/fi.ini | 2 | ||||
-rw-r--r-- | locale/fr.ini | 2 | ||||
-rw-r--r-- | locale/he.ini | 2 | ||||
-rw-r--r-- | locale/ja.ini | 2 | ||||
-rw-r--r-- | locale/nl.ini | 2 | ||||
-rw-r--r-- | locale/pl.ini | 2 | ||||
-rw-r--r-- | locale/pt.ini | 2 | ||||
-rw-r--r-- | locale/tr.ini | 2 | ||||
-rw-r--r-- | locale/zh_Hans.ini | 2 | ||||
-rw-r--r-- | locale/zh_Hant.ini | 4 |
22 files changed, 187 insertions, 104 deletions
diff --git a/client/menu/main.gd b/client/menu/main.gd index 997653c9..5aa3fbaa 100644 --- a/client/menu/main.gd +++ b/client/menu/main.gd @@ -24,7 +24,7 @@ func _ready(): if OS.has_feature("web"): quit_button.hide() Sound.play_music("MainMenu") - ServerList.fetch_server_list() + ServerList.one_shot() func _menu_cover(state): $side.visible = not state diff --git a/client/menu/play.gd b/client/menu/play.gd index b117d6a4..44cd3eb0 100644 --- a/client/menu/play.gd +++ b/client/menu/play.gd @@ -37,21 +37,23 @@ func _ready(): ServerList.update_loading.connect(update_server_list_loading) update_server_list(ServerList.current_list) update_server_list_loading(ServerList.loading) - + + ServerList.start() super() -func update_server_list(json: Array): +func update_server_list(lists: Array[Array]): for c in server_list.get_children(): c.queue_free() - for i in json: - var b := Button.new() - b.text_overrun_behavior = TextServer.OVERRUN_TRIM_WORD_ELLIPSIS - b.text = "%s (%d players)" % [i.name, i.players_online] - # TODO: Implement fallback address correctly - if i.version[0] != Multiplayer.VERSION_MAJOR or i.version[1] > Multiplayer.VERSION_MINOR: - b.disabled = true - b.pressed.connect(connect_to.bind(i.address[0])) - server_list.add_child(b) + for l in lists: + for i in l: + var b := Button.new() + b.text_overrun_behavior = TextServer.OVERRUN_TRIM_WORD_ELLIPSIS + b.text = "%s (%d players)" % [i.name, i.players_online] + # TODO: Implement fallback address correctly + if i.version[0] != Multiplayer.VERSION_MAJOR or i.version[1] > Multiplayer.VERSION_MINOR: + b.disabled = true + b.pressed.connect(connect_to.bind(i.address[0])) + server_list.add_child(b) func update_server_list_loading(status: bool): server_list_loading.visible = status @@ -127,3 +129,7 @@ func _on_uri_text_changed(new_text): func _on_back_pressed(): exit() + +func _menu_exit(): + ServerList.stop() + super() diff --git a/client/menu/rating/rating.tscn b/client/menu/rating/rating.tscn index b12d1470..69edba88 100644 --- a/client/menu/rating/rating.tscn +++ b/client/menu/rating/rating.tscn @@ -120,7 +120,7 @@ alignment = 1 [node name="Close" type="Button" parent="MarginContainer/PanelContainer/VBoxContainer/HBoxContainer"] layout_mode = 2 -text = "Accept" +text = "c.menu.rating.accept" [node name="StarTimer" type="Timer" parent="."] wait_time = 0.5 diff --git a/client/project.godot b/client/project.godot index d1e85f05..d931a1b0 100644 --- a/client/project.godot +++ b/client/project.godot @@ -24,7 +24,7 @@ Server="*res://server.gd" Sound="*res://audio/sound.tscn" DisableWrongJoypads="*res://disable_wrong_joypads.gd" InputManager="*res://menu/settings/input/input_manager.gd" -ServerList="*res://server_list.tscn" +ServerList="*res://server_list.gd" [display] diff --git a/client/server_list.gd b/client/server_list.gd index f509a34e..43cfc15c 100644 --- a/client/server_list.gd +++ b/client/server_list.gd @@ -1,5 +1,6 @@ # Hurry Curry! - a game about cooking # 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 @@ -18,24 +19,78 @@ extends Node signal update_loading(status: bool) signal update_server_list(list: Array) -var current_list := [] +enum Registry { + MDNS = 0, + GLOBAL = 1, +} + +const MDNS_URL: String = "http://127.0.0.1:27033/v1/list" +const HEADERS: Array[String] = [ + "Accept: application/json", + "User-Agent: Hurry Curry! %s" % Global.VERSION + ] + +var current_list: Array[Array] = [[], []] var loading := false +var mdns := HTTPRequest.new() +var reg := HTTPRequest.new() -@onready var req: HTTPRequest = $HTTPRequest +var thread: Thread +var pid: int + +var mdns_timer := Timer.new() +var reg_timer := Timer.new() +# after 30 minutes we stop fetching results to reduce server load +var timeout := Timer.new() + +func _ready() -> void: + add_child(mdns) + add_child(reg) + mdns_timer.wait_time = 5. + mdns_timer.one_shot = false + mdns_timer.timeout.connect(fetch_server_list.bind(Registry.MDNS)) + add_child(mdns_timer) + reg_timer.wait_time = 60. + reg_timer.one_shot = false + reg_timer.timeout.connect(fetch_server_list.bind(Registry.GLOBAL)) + add_child(reg_timer) + timeout.wait_time = 60. * 30. + timeout.timeout.connect(func(): + stop() + ) + add_child(timeout) + mdns.request_completed.connect(_on_request_completed.bind(Registry.MDNS)) + reg.request_completed.connect(_on_request_completed.bind(Registry.GLOBAL)) + if Global.get_setting("online.use_discovery"): + thread = Thread.new() + thread.start(func(): + # SAFETY: reading/writing arrays/dictionaries is allowed as long as + # the size is not changed. + # cf.: https://docs.godotengine.org/en/4.3/tutorials/performance/thread_safe_apis.html#gdscript-arrays-dictionaries + var res = OS.create_process(get_discovery_path(), [], true) + # SAFETY: since this is not read until the thread stops, this should + # probably be safe without synchronisation :) + pid = res + ) + +static func get_discovery_path() -> String: + var path: String = Global.get_setting("online.discovery_binary") + if path != "": + return path + else: + return "hurrycurry-discovery" + +func fetch_server_list(registry: Registry) -> void: + match registry: + Registry.MDNS: + mdns.request(MDNS_URL, HEADERS) + Registry.GLOBAL: + reg.request(Global.get_setting("online.registry_url") + "/v1/list", HEADERS) -func fetch_server_list(): - if loading: - push_warning("Server list is already loading") - return loading = true update_loading.emit(true) - req.request_completed.connect(_on_request_completed) - req.request("https://hurrycurry-registry.metamuffin.org/v1/list", [ - "Accept: application/json", - "User-Agent: Hurry Curry! %s" % Global.VERSION - ]) -func _on_request_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray): +func _on_request_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray, registry: Registry): loading = false update_loading.emit(false) if result != 0: @@ -45,5 +100,28 @@ func _on_request_completed(result: int, _response_code: int, _headers: PackedStr if json == null: push_error("Server list response invalid") return - current_list = json - update_server_list.emit(json) + current_list[registry] = json + update_server_list.emit(current_list) + +func start() -> void: + timeout.stop() + timeout.start() + if Global.get_setting("online.use_discovery"): + mdns_timer.start() + fetch_server_list(Registry.MDNS) + if Global.get_setting("online.use_registry"): + reg_timer.start() + fetch_server_list(Registry.GLOBAL) + +func stop() -> void: + timeout.stop() + mdns_timer.stop() + reg_timer.stop() + +func one_shot() -> void: + start() + stop() + +func _exit_tree(): + if thread != null: thread.wait_to_finish() + if pid != null: OS.kill(pid) diff --git a/client/server_list.tscn b/client/server_list.tscn deleted file mode 100644 index f43da77f..00000000 --- a/client/server_list.tscn +++ /dev/null @@ -1,8 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://3p61jpqt7acp"] - -[ext_resource type="Script" path="res://server_list.gd" id="1_a8xqo"] - -[node name="ServerList" type="Node"] -script = ExtResource("1_a8xqo") - -[node name="HTTPRequest" type="HTTPRequest" parent="."] diff --git a/client/settings.gd b/client/settings.gd index 667ffa41..eddc5207 100644 --- a/client/settings.gd +++ b/client/settings.gd @@ -70,6 +70,13 @@ static func get_root(): ToggleSetting.new("upnp", false), ToggleSetting.new("mdns", false), ToggleSetting.new("register", false), + ]), + SettingsCategory.new("online", [ + # TODO: make this opt-in + ToggleSetting.new("use_registry", true), + TextSetting.new("registry_url", "https://hurrycurry-registry.metamuffin.org/"), + ToggleSetting.new("use_discovery", true), + TextSetting.new("discovery_binary", ""), ]) ]) diff --git a/locale/ar.ini b/locale/ar.ini index 519c4fa3..101cc36b 100644 --- a/locale/ar.ini +++ b/locale/ar.ini @@ -155,7 +155,7 @@ c.credits.models=النماذج c.credits.sounds=الاصوات c.settings.gameplay.setup_completed=تم الانتهاء من الإعداد الأولي. (إزيلوا علامة الإختيار وأعدوا التشغيل لإعادة الدخول) unknown622=يجب عليكم ملء جميع الحقول. -unknown626=حسنا +c.menu.rating.accept=حسنا c.settings.gameplay.hints_started=بدأ البرنامج التعليمي unknown732= unknown736= diff --git a/locale/de.ini b/locale/de.ini index 8011953a..00f1db2c 100644 --- a/locale/de.ini +++ b/locale/de.ini @@ -156,7 +156,7 @@ unknown538=Menü-Knopf unknown551=Nicht verfügbar c.setup.uniform.value=Frisur {0} unknown622=Sie müssen alle verlangten Felder ausfüllen. -unknown626=Akzeptieren +c.menu.rating.accept=Akzeptieren unknown732=Zurück unknown736=Nächstes unknown740=Beitreten / Zuschauen diff --git a/locale/en.ini b/locale/en.ini index ea798258..b2e8c6d0 100644 --- a/locale/en.ini +++ b/locale/en.ini @@ -3,18 +3,18 @@ c.chat.write_message=Write messsage c.credits.developed_by=developed by c.credits.models=Models c.credits.sounds=Sounds -c.credits.translations=Translations c.credits.thanks=Thank You For Playing c.credits.title=Hurry Curry! - a game about cooking +c.credits.translations=Translations c.error.cannot_cancel_no_game=Cannot cancel game since no game is running. +c.error.empty_username=Username cannot be empty. 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.server=Error from server: {0} c.error.version_mismatch=Server and client versions do not match. Server: {0}.{1}, Client: {2}.{3}.%nAre you sure the game is up to date? c.error.websocket.unavailable=unavailable c.error.websocket=WebSocket closed with code: {0}, reason {1}. Clean: {2} c.error=Error -c.error.server=Error from server: {0} -c.error.empty_username=Username cannot be empty. c.hint.boost=Press {0} 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 {0} to pick up items and to interact with tools @@ -51,30 +51,31 @@ c.menu.play.quick_connect=Quick Connect c.menu.play.server=Server c.menu.play=Play c.menu.quit=Quit +c.menu.rating.accept=Accept c.menu.settings=Settings -c.score.poor=Poor service c.score.acceptable=Acceptable service -c.score.good=Good service -c.score.excellent=Excellent service c.score.completed=Completed +c.score.excellent=Excellent service c.score.failed=Failed +c.score.good=Good service c.score.points_par=You collected {0} points c.score.points=Points +c.score.poor=Poor service c.score.time_remaining=Time remaining c.settings.apply=Save & Apply 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.gameplay.accessible_movement=Accessible movement controls +c.settings.gameplay.first_person=Enable first-person mode (reduces playability) +c.settings.gameplay.hints_started=Hints started 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_disabled=Disable tutorial -c.settings.gameplay.hints_started=Hints started c.settings.gameplay.usernames=Show username tags -c.settings.gameplay.accessible_movement=Accessible movement controls -c.settings.gameplay.first_person=Enable first-person mode (reduces playability) c.settings.gameplay=Gameplay c.settings.graphics.aa.disabled=Disabled c.settings.graphics.aa.fx=FXAA @@ -137,6 +138,11 @@ 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.online.discovery_binary=mDNS discovery binary path +c.settings.online.registry_url=Registry URL +c.settings.online.use_discovery=Use mDNS discovery +c.settings.online.use_registry=Use global server registry +c.settings.online=Online c.settings.server.binary_path=Server binary path c.settings.server.data_path=Server data directory path c.settings.server.mdns=Local server discoverability @@ -156,78 +162,72 @@ 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 -c.setup.contract_title=EMPLOYMENT CONTRACT -c.setup.contract_desc=This is a binding contract between you (the employee) and Musterfoods Ltd. (the employer) for working as a chef or waiter. -c.setup.name=1. [b]Name of the Employee[/b] Please fill out your name. Other chefs can see your name on your name tag. -c.setup.position=2. [b]Employment Position[/b] -c.setup.position.value=Chef / Waiting Staff -c.setup.uniform=3. [b]Working Uniform.[/b] You must always have one of the following hairstyles. -c.setup.experience=4. [b]Experience.[/b] Do you have any prior job experience, or would you like us to show you around the kitchen? -c.setup.experience.skip=Skip tutorial -c.setup.duties=5. [b]Duties.[/b] It is your duty to serve customers the meal or item that they request.%n c.setup.additional_terms=6. [b]Additional Terms.[/b] You shall not duplicate plates. (That is [u]NOT[/u] possible!)%n -c.setup.compensation=7. [b]Compensation.[/b] You will be compensated monthly for your work. c.setup.compensation.salary.prefix=The salary is -c.setup.compensation.salary=$ 0.00 c.setup.compensation.salary.suffix=per month -c.setup.frank_signature=F. Miller +c.setup.compensation.salary=$ 0.00 +c.setup.compensation=7. [b]Compensation.[/b] You will be compensated monthly for your work. +c.setup.contract_desc=This is a binding contract between you (the employee) and Musterfoods Ltd. (the employer) for working as a chef or waiter. +c.setup.contract_title=EMPLOYMENT CONTRACT +c.setup.duties=5. [b]Duties.[/b] It is your duty to serve customers the meal or item that they request.%n +c.setup.experience.skip=Skip tutorial +c.setup.experience=4. [b]Experience.[/b] Do you have any prior job experience, or would you like us to show you around the kitchen? c.setup.frank_signature.desc=Signature of the Employer:%nMusterfoods Ltd.%nFrank Miller, Head of HR -c.setup.user_signature=Click to sign +c.setup.frank_signature=F. Miller +c.setup.name=1. [b]Name of the Employee[/b] Please fill out your name. Other chefs can see your name on your name tag. +c.setup.position.value=Chef / Waiting Staff +c.setup.position=2. [b]Employment Position[/b] +c.setup.uniform.value=Hairstyle {0} +c.setup.uniform=3. [b]Working Uniform.[/b] You must always have one of the following hairstyles. c.setup.user_signature.desc=Signature of the Employee:%n%n%n +c.setup.user_signature=Click to sign +s.bot.frank=Frank Miller s.bot.simple=Simple chef s.bot.waiter=Waiter -s.bot.frank=Frank Miller -s.tutorial.prevent_burning=Take this before it burns -s.tutorial.take_now=Take this item quickly! -s.tutorial.active=Interact here for {0}s +s.campaign.condition.stars=Reach at least {0} stars in {1} +s.campaign.list_helper=- {0}%n - {1} +s.campaign.unlock_condition=To unlock: %n%n{0} +s.error.already_interacting=already interacting +s.error.conn_too_many_players=Players-per-connection limit exceeded. +s.error.customer_interact=You shall not interact with customers. +s.error.interacting_too_far=interacting too far from player +s.error.map_load=Map failed to load: {0} +s.error.no_player=Player does not exist. +s.error.no_tile=Tile does not exist. +s.error.packet_not_supported=Packet not supported in this session. +s.error.packet_sender_invalid=Packet sent to a player that is not owned by this connection. +s.error.self_interact=Interacting with yourself. This is impossible. +s.replay.cannot_join=Replays cannot be joined. +s.state.abort_no_players=Game was aborted due to a lack of players. +s.state.game_aborted=Game was aborted by {0}. +s.state.overflow_resubscribe=Lagging behind. Some clientbound packets were dropped. +s.tutorial.accept_order=Approach the customer take their order s.tutorial.active_cuttingboard=Cut the item to slices here +s.tutorial.active=Interact here for {0}s s.tutorial.clear_tile=Clear this tile s.tutorial.error=Tutorial code handle this recipe yet. s.tutorial.finished=Tutorial finished! s.tutorial.hold_interact=Hold interact s.tutorial.interact_empty=Interact with an empty counter -s.tutorial.interact=Interact here s.tutorial.interact_plate=Add the item to this plate +s.tutorial.interact=Interact here s.tutorial.pickup=Take this item. +s.tutorial.prevent_burning=Take this before it burns s.tutorial.put_away=Put away this item for later s.tutorial.put_on=Place on {0} -s.tutorial.take=Take {0} from here s.tutorial.serve=Serve the meal here +s.tutorial.take_now=Take this item quickly! +s.tutorial.take=Take {0} from here s.tutorial.wait_finish=... -s.tutorial.accept_order=Approach the customer take their order -s.replay.cannot_join=Replays cannot be joined. -s.campaign.unlock_condition=To unlock: %n%n{0} -s.campaign.list_helper=- {0}%n - {1} -s.campaign.condition.stars=Reach at least {0} stars in {1} -s.state.abort_no_players=Game was aborted due to a lack of players. -s.state.game_aborted=Game was aborted by {0}. -s.state.overflow_resubscribe=Lagging behind. Some clientbound packets were dropped. -s.error.conn_too_many_players=Players-per-connection limit exceeded. -s.error.packet_sender_invalid=Packet sent to a player that is not owned by this connection. -s.error.no_player=Player does not exist. -s.error.no_tile=Tile does not exist. -s.error.already_interacting=already interacting -s.error.interacting_too_far=interacting too far from player -s.error.self_interact=Interacting with yourself. This is impossible. -s.error.customer_interact=You shall not interact with customers. -s.error.packet_not_supported=Packet not supported in this session. -s.error.map_load=Map failed to load: {0} unknown33=Automatic unknown336=Return to Main Menu -unknown37=Enabled -unknown41=Disabled -unknown460=+ -unknown464=- unknown476=SHIFT unknown484=left stick unknown488=SPACE unknown514=arrow keys unknown518=right stick unknown551=unavailable -c.setup.uniform.value=Hairstyle {0} unknown622=You must fill out all requested fields. -unknown626=Accept unknown732=Previous unknown736=Next -unknown740=Join / Spectate unknown752=Scroll down diff --git a/locale/es.ini b/locale/es.ini index ecff4105..63e00217 100644 --- a/locale/es.ini +++ b/locale/es.ini @@ -156,7 +156,7 @@ unknown538=Botón de menú unknown551=Servidor (No disponible) c.setup.uniform.value=Peinado {0} unknown622=Debes completar todos los requisitos. -unknown626=Aceptar +c.menu.rating.accept=Aceptar unknown732= unknown736= unknown740=Observar diff --git a/locale/eu.ini b/locale/eu.ini index 5364555a..4e032f16 100644 --- a/locale/eu.ini +++ b/locale/eu.ini @@ -155,7 +155,7 @@ 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 +c.menu.rating.accept=Onartu c.settings.gameplay.hints_started=Tutoriala hasi da unknown732=Aurrekoa unknown736=Hurrengoa diff --git a/locale/fi.ini b/locale/fi.ini index f1eb1966..46106fa4 100644 --- a/locale/fi.ini +++ b/locale/fi.ini @@ -155,7 +155,7 @@ c.credits.models= c.credits.sounds= c.settings.gameplay.setup_completed= unknown622= -unknown626= +c.menu.rating.accept= c.settings.gameplay.hints_started= unknown732= unknown736= diff --git a/locale/fr.ini b/locale/fr.ini index cc31c0fa..60d33420 100644 --- a/locale/fr.ini +++ b/locale/fr.ini @@ -155,7 +155,7 @@ 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 +c.menu.rating.accept=Accepter c.settings.gameplay.hints_started=Tutoriel commencé unknown732= unknown736= diff --git a/locale/he.ini b/locale/he.ini index 02fe7003..65ac6192 100644 --- a/locale/he.ini +++ b/locale/he.ini @@ -155,7 +155,7 @@ c.credits.models=מודלים c.credits.sounds= c.settings.gameplay.setup_completed=אתחול ראשוני נגמר. (הורד סימון והדלק מחדש על מנת להכנס מחדש) unknown622=אנא מלאו את כל השדות הנדרשים. -unknown626=אשר +c.menu.rating.accept=אשר c.settings.gameplay.hints_started=הדרכה התחילה unknown732= unknown736= diff --git a/locale/ja.ini b/locale/ja.ini index 47124221..1513517a 100644 --- a/locale/ja.ini +++ b/locale/ja.ini @@ -155,7 +155,7 @@ c.credits.models=モデル c.credits.sounds=サウンド c.settings.gameplay.setup_completed=初期設定完了。(チェックを外して再起動して) unknown622=要求されたフィールドをすべて入力する必要があります。 -unknown626=アクセプト +c.menu.rating.accept=アクセプト c.settings.gameplay.hints_started=チュートリアルを開始 unknown732= unknown736= diff --git a/locale/nl.ini b/locale/nl.ini index fb7d93ac..d6cab726 100644 --- a/locale/nl.ini +++ b/locale/nl.ini @@ -160,7 +160,7 @@ unknown538 = Menuknop unknown551 = niet beschikbaar unknown568 = Haarstijl: {0} unknown622 = Vul alle vereiste velden in. -unknown626 = Accepteren +c.menu.rating.accept = Accepteren unknown732 = Vorige unknown736 = Volgende unknown740 = Deelnemen/Toeschouwen diff --git a/locale/pl.ini b/locale/pl.ini index 4e106afc..7b65bb06 100644 --- a/locale/pl.ini +++ b/locale/pl.ini @@ -155,7 +155,7 @@ 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ź +c.menu.rating.accept=Zatwierdź c.settings.gameplay.hints_started=Tutorial rozpoczęty unknown732= unknown736= diff --git a/locale/pt.ini b/locale/pt.ini index f1eb1966..46106fa4 100644 --- a/locale/pt.ini +++ b/locale/pt.ini @@ -155,7 +155,7 @@ c.credits.models= c.credits.sounds= c.settings.gameplay.setup_completed= unknown622= -unknown626= +c.menu.rating.accept= c.settings.gameplay.hints_started= unknown732= unknown736= diff --git a/locale/tr.ini b/locale/tr.ini index f1eb1966..46106fa4 100644 --- a/locale/tr.ini +++ b/locale/tr.ini @@ -155,7 +155,7 @@ c.credits.models= c.credits.sounds= c.settings.gameplay.setup_completed= unknown622= -unknown626= +c.menu.rating.accept= c.settings.gameplay.hints_started= unknown732= unknown736= diff --git a/locale/zh_Hans.ini b/locale/zh_Hans.ini index 2374fe56..dab96be7 100644 --- a/locale/zh_Hans.ini +++ b/locale/zh_Hans.ini @@ -156,7 +156,7 @@ unknown538=菜单按钮 unknown551=不可用 c.setup.uniform.value=发型 {0} unknown622=您必须填写所有要求的字段。 -unknown626=接受 +c.menu.rating.accept=接受 unknown732=上一个 unknown736=下一个 unknown740=加入/旁观 diff --git a/locale/zh_Hant.ini b/locale/zh_Hant.ini index c4f36618..2d88f417 100644 --- a/locale/zh_Hant.ini +++ b/locale/zh_Hant.ini @@ -155,10 +155,10 @@ c.credits.models=模型 c.credits.sounds=聲音 c.settings.gameplay.setup_completed=初始設定完成。(取消勾選並重新啟動以重新進入) unknown622=你必須填寫所有要求的欄位。 -unknown626=接受 -c.settings.gameplay.hints_started=提示已開始 unknown732=上一個 unknown736=下一個 +c.menu.rating.accept=接受 +c.settings.gameplay.hints_started=教程已啟動 unknown740=旁觀 unknown752=向下滾動 c.menu.ingame.leave = 離開遊戲 |