diff --git a/common/audio_manager/scripts/audio_manager.gd b/common/audio_manager/scripts/audio_manager.gd index 6fa8366..2bfddc0 100644 --- a/common/audio_manager/scripts/audio_manager.gd +++ b/common/audio_manager/scripts/audio_manager.gd @@ -235,7 +235,7 @@ func _ready(): player.stop() fetch_default_volumes() - # setup_players_bus() + setup_players_bus() settings.sound_changed.connect( func(_s) : setup_players_bus() ) diff --git a/gui/game/tutorial/scripts/tutorial.gd b/gui/game/tutorial/scripts/tutorial.gd index 5a31950..d7b49ad 100644 --- a/gui/game/tutorial/scripts/tutorial.gd +++ b/gui/game/tutorial/scripts/tutorial.gd @@ -5,28 +5,36 @@ const STEP_SCENE = preload("res://gui/game/tutorial/step_gui/step_gui.tscn") signal succeded -var indicators : Array[InGameIndicator] -var player : Player -var region : Region -var game_gui : GameGui +var indicators: Array[InGameIndicator] +var player: Player +var region: Region +var game_gui: GameGui var success = false -@onready var steps : Array[Step] = [ +@onready var steps: Array[Step] = [ Step.new( - "MOVE_WITH_RIGHT_CLICK_OR_WASD", - (func (): + tr("MOVE_WITH_RIGHT_CLICK_OR_WASD").format({ + "W": get_action_key_name("move_up"), + "A": get_action_key_name("move_left"), + "S": get_action_key_name("move_down"), + "D": get_action_key_name("move_right") + }), + (func(): return player.global_position.distance_to(region.data.player_spawn) > 30) ), Step.new( - "CHANGE_ZOOM_WITH_Z_X", - (func (): + tr("CHANGE_ZOOM_WITH_Z_X").format({ + "Z": get_action_key_name("zoom_in"), + "X": get_action_key_name("zoom_out") + }), + (func(): return GameInfo.settings_data.zoom != 1.), - (func (): GameInfo.game_data.player_data.inventory.add_item(Detector.new())) + (func(): GameInfo.game_data.player_data.inventory.add_item(Detector.new())) ), Step.new( "SELECT_ITEM_WITH_SCROLL_CLICK_OR_NUMBER", - (func (): + (func(): return player.data.inventory.current_item_ind != player.data.inventory.tools.size()) ), Step.new( @@ -36,14 +44,14 @@ var success = false ), Step.new( "USE_YOUR_DETECTOR_TO_FIND_THE_BATTERY", - (func (): + (func(): return player.position.distance_to(Vector2.ZERO) < 600) ), Step.new( "RECHARGE_IN_THE_RECHARGE_STATION", - (func (): + (func(): return region and region.data and not region.data.in_passing_day_animation and region.data.day != 1), - (func (): + (func(): game_gui.show_energy() game_gui.show_help() game_gui.help.display_energy_tutorial() @@ -52,7 +60,7 @@ var success = false ), Step.new( "DIG_A_TALION_VEIN_WITH_SHOVEL", - (func (): + (func(): for e in region.entity_container.get_children(): if e is ItemObject and e.item is Seed: return true @@ -60,21 +68,23 @@ var success = false ), Step.new( "TAKE_A_SEED_BY_CLICKING_ON_IT", - (func (): + (func(): return player.data.inventory.seeds.find_custom( - func(i:Item): return i is Seed + func(i: Item): return i is Seed ) != -1) ), Step.new( - "DROP_SEED_WITH_KEY", - (func (): + tr("DROP_SEED_WITH_KEY").format({ + "Q": get_action_key_name("drop") + }), + (func(): return ( Input.is_action_pressed("drop")) ) ), Step.new( "PLANT_SEED_IN_FERTILE_ZONE", - (func (): + (func(): for e in region.entity_container.get_children(): if e is Plant: game_gui.help.display_plant_info_tutorial(e.card_info()) @@ -83,13 +93,13 @@ var success = false ), Step.new( "WAIT_FOR_THE_PLANT_MATURATION", - (func (): + (func(): return region and region.data and not region.data.in_passing_day_animation and region.data.get_score() != 0), - (func (): GameInfo.game_data.player_data.inventory.add_item(Fork.new())) + (func(): GameInfo.game_data.player_data.inventory.add_item(Fork.new())) ), Step.new( "HARVEST_A_MATURE_PLANT", - (func (): + (func(): for e in region.entity_container.get_children(): if e is Plant and e.harvested: return true @@ -97,20 +107,20 @@ var success = false ), Step.new( "TAKE_HARVESTED_SEEDS", - (func (): + (func(): for s in player.data.inventory.seeds: if s is Seed and len(s.plant_mutations) > 0: game_gui.help.display_mutations_tutorial(s.card_info()) return true return false), - (func (): + (func(): await game_gui.help.tutorial_passed game_gui.show_progress_bar() game_gui.help.display_plant_point_tutorial()) ), Step.new( "HAVE_3_PLANT_POINTS_SIMULTANEOUSLY", - (func (): return region.data.get_score() >= 3) + (func(): return region.data.get_score() >= 3) ), ] @@ -141,7 +151,7 @@ func _process(_d): for i in len(steps): var step := steps[i] var step_gui := %Steps.get_children()[i] as TutorialStepGui - step_gui.visible = i == 0 or steps[i-1].succeeded + step_gui.visible = i == 0 or steps[i - 1].succeeded if step_gui.visible: var old_succeeded = step.succeeded step.update_succeeded() @@ -162,16 +172,15 @@ func finish_tutorial(): SteamConnection.unlock_achievement(SteamConnection.ACH_FINISH_TUTORIAL) class Step: - - var text : String : get = get_text - var is_step_over_callable : Callable - var on_succeeded : Callable + var text: String: get = get_text + var is_step_over_callable: Callable + var on_succeeded: Callable var succeeded = false func _init( - _text : String = "", - _is_step_over_callable : Callable = (func():return false), - _on_succeeded : Callable = (func():return false) + _text: String = "", + _is_step_over_callable: Callable = (func(): return false), + _on_succeeded: Callable = (func(): return false) ): text = _text is_step_over_callable = _is_step_over_callable @@ -186,3 +195,24 @@ class Step: if succeeded: on_succeeded.call() return succeeded + +func get_action_key_name(action_name: String) -> String: + var events: Array[InputEvent] = InputMap.action_get_events(action_name) + + var saved_remapped_input = null + var existing_remapped_id: int = GameInfo.settings_data.action_remapped.find(action_name) + if existing_remapped_id != -1: + saved_remapped_input = GameInfo.settings_data.input_remapped[existing_remapped_id] + + var event: InputEvent = null + if saved_remapped_input: + event = saved_remapped_input + else: + event = null if events.size() == 0 else events[0] + + var input_name: String = "UNASSIGNED" if event == null else event.as_text() + if event is InputEventKey: + var keycode = DisplayServer.keyboard_get_keycode_from_physical(event.physical_keycode) + input_name = OS.get_keycode_string(keycode) + + return input_name diff --git a/gui/menu/controls/scripts/input_group.gd b/gui/menu/controls/scripts/input_group.gd index 97602c0..f96c620 100644 --- a/gui/menu/controls/scripts/input_group.gd +++ b/gui/menu/controls/scripts/input_group.gd @@ -8,54 +8,57 @@ var event : InputEvent = null var is_remapping := false @export var action_name : String : - set(v): - action_name = v - var events : Array[InputEvent] = InputMap.action_get_events(action_name) - var saved_remapped_input = get_remapped_input() - if saved_remapped_input : - event = saved_remapped_input - else : - event = null if events.size() == 0 else events[0] - update() + set(v): + action_name = v + var events : Array[InputEvent] = InputMap.action_get_events(action_name) + var saved_remapped_input = get_remapped_input() + if saved_remapped_input : + event = saved_remapped_input + else : + event = null if events.size() == 0 else events[0] + update() func update(): - %Text.text = action_name.to_upper() - var input_name = "UNASSIGNED" if event == null else event.as_text() - if input_name.length() > MAX_INPUT_NAME: - input_name = input_name.substr(0,MAX_INPUT_NAME) + "..." - %Button.text = input_name - # (%Button as Button).add_theme_color_override("font_color", Color.RED if ) + %Text.text = action_name.to_upper() + var input_name: String = "UNASSIGNED" if event == null else event.as_text() + if event is InputEventKey: + var keycode = DisplayServer.keyboard_get_keycode_from_physical(event.physical_keycode) + input_name = OS.get_keycode_string(keycode) + if input_name.length() > MAX_INPUT_NAME: + input_name = input_name.substr(0,MAX_INPUT_NAME) + "..." + %Button.text = input_name + # (%Button as Button).add_theme_color_override("font_color", Color.RED if ) func _input(new_event): - if is_remapping: - if ( - new_event is InputEventKey or (new_event is InputEventMouseButton and new_event.is_pressed()) - ): - is_remapping = false - event = new_event - save_remapped_input(event) - GameInfo.update_inputs() - update() + if is_remapping: + if ( + new_event is InputEventKey or (new_event is InputEventMouseButton and new_event.is_pressed()) + ): + is_remapping = false + event = new_event + save_remapped_input(event) + GameInfo.update_inputs() + update() func get_remapped_input() -> InputEvent: - var existing_remapped_id : int = GameInfo.settings_data.action_remapped.find(action_name) + var existing_remapped_id : int = GameInfo.settings_data.action_remapped.find(action_name) - if existing_remapped_id != -1: - return GameInfo.settings_data.input_remapped[existing_remapped_id] - - return null + if existing_remapped_id != -1: + return GameInfo.settings_data.input_remapped[existing_remapped_id] + + return null func save_remapped_input(e : InputEvent = event): - var existing_remapped_id : int = GameInfo.settings_data.action_remapped.find(action_name) + var existing_remapped_id : int = GameInfo.settings_data.action_remapped.find(action_name) - if existing_remapped_id != -1: - GameInfo.settings_data.action_remapped.remove_at(existing_remapped_id) - GameInfo.settings_data.input_remapped.remove_at(existing_remapped_id) - - GameInfo.settings_data.action_remapped.push_back(action_name) - GameInfo.settings_data.input_remapped.push_back(e) + if existing_remapped_id != -1: + GameInfo.settings_data.action_remapped.remove_at(existing_remapped_id) + GameInfo.settings_data.input_remapped.remove_at(existing_remapped_id) + + GameInfo.settings_data.action_remapped.push_back(action_name) + GameInfo.settings_data.input_remapped.push_back(e) func _on_button_button_down(): - if !is_remapping: - is_remapping = true - %Button.text = "PRESS_KEY" + if !is_remapping: + is_remapping = true + %Button.text = "PRESS_KEY" diff --git a/translation/game/gui.csv b/translation/game/gui.csv index 200c225..c7abe2e 100644 --- a/translation/game/gui.csv +++ b/translation/game/gui.csv @@ -137,12 +137,12 @@ OPEN,Open,Ouvrir %s_SEED,%s Seed,Graine de %s PLANT_%s_MUST_BE_USED_IN_DECONTAMINATED_ZONE,Plant [b]%s[/b]. Must be used in the fertile zone.,Plante [b]%s[/b]. Doit être utilisée dans la zone fertile. PLANT_%s,Plant [b]%s[/b],Planter [b]%s[/b] -MOVE_WITH_RIGHT_CLICK_OR_WASD,"Move with right click or WASD","Déplace-toi avec le clic droit ou ZQSD" +MOVE_WITH_RIGHT_CLICK_OR_WASD,"Move with right click or {W}{A}{S}{D}","Déplace-toi avec clic droit ou {W}{A}{S}{D}" INTERACT_WITH_LEFT_CLICK,"Interact with left click","Interagis avec le clic gauche" -CHANGE_ZOOM_WITH_Z_X,"Change the zoom with Z and X","Changez le zoom avec W et X" +CHANGE_ZOOM_WITH_Z_X,"Change the zoom with {Z} and {X}","Changez le zoom avec {Z} et {X}" SELECT_ITEM_WITH_SCROLL_CLICK_OR_NUMBER,"Select an item in your toolbar with the mouse wheel or by clicking on it","Sélectionne un item dans ta barre d'outil en utilisant la molette ou en cliquant dessus" LEFT_CLICK_TO_USE_ITEMS,"Use an item with left click","Utilise un item avec le clic gauche" -DROP_SEED_WITH_KEY,"Drop current item with Q","Lâche l'item sélectionné avec A" +DROP_SEED_WITH_KEY,"Drop current item with {Q}","Lâche l'item sélectionné avec {Q}" USE_YOUR_DETECTOR_TO_FIND_THE_BATTERY,Use your [b]Detector[/b] to find the [b]Recharge station[/b],Utilise ton [b]Détecteur[/b] pour trouver la [b]Station de recharge[/b] RECHARGE_IN_THE_RECHARGE_STATION,Recharge on the [b]Recharge station[/b] to pass the day,Se recharger sur la [b]Station de recharge[/b] pour passer la journée TAKE_A_SEED_BY_CLICKING_ON_IT,Take a [b]Seed[/b] by clicking or moving over it,Prend une [b]Graine[/b] en cliquant ou en passant dessus