diff --git a/common/game_data/scripts/settings_data.gd b/common/game_data/scripts/settings_data.gd index 76fa45c..4b8fcc5 100644 --- a/common/game_data/scripts/settings_data.gd +++ b/common/game_data/scripts/settings_data.gd @@ -43,4 +43,9 @@ const AVAILABLE_LANGUAGES_LABEL = [ @export var full_screen : bool = false : set(v): full_screen = v - video_changed.emit(self) \ No newline at end of file + video_changed.emit(self) + +#region ------------------ Controls ------------------ + +@export var action_remapped : Array[String] = [] +@export var input_remapped : Array[InputEvent] = [] \ No newline at end of file diff --git a/common/game_info/game_info.gd b/common/game_info/game_info.gd index 4333ab3..2314f4b 100644 --- a/common/game_info/game_info.gd +++ b/common/game_info/game_info.gd @@ -49,25 +49,26 @@ func restart_game_data(): func _init(): load_game_data() load_settings_data() - update_language_settings(settings_data) - update_video_settings(settings_data) + update_language_settings() + update_video_settings() settings_data.language_changed.connect(_on_settings_language_changed) settings_data.video_changed.connect(_on_settings_video_changed) - func _on_settings_video_changed(s : SettingsData): update_video_settings(s) func _on_settings_language_changed(s : SettingsData): update_language_settings(s) -func update_language_settings(s : SettingsData): +func update_language_settings(s : SettingsData = settings_data): TranslationServer.set_locale(s.language) -func update_video_settings(s : SettingsData): +func update_video_settings(s : SettingsData = settings_data): DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED) -func update_input(action : String, old_event : InputEvent, event : InputEvent): - InputMap.action_erase_event(action, old_event) - InputMap.action_add_event(action, event) +func update_inputs(s : SettingsData = settings_data): + for i in range(len(s.input_remapped)): + InputMap.action_erase_events(s.action_remapped[i]) + InputMap.action_add_event(s.action_remapped[i], s.input_remapped[i]) + print("Update %s action to %s" % [s.action_remapped[i], s.input_remapped[i].as_text()]) diff --git a/common/scene_manager/scripts/scene_manager.gd b/common/scene_manager/scripts/scene_manager.gd index dc40256..14a0fbd 100644 --- a/common/scene_manager/scripts/scene_manager.gd +++ b/common/scene_manager/scripts/scene_manager.gd @@ -62,6 +62,7 @@ func change_scene(scene_id : String, with_loading = true): current_scene_node.show() Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if scene.mouse_captured else Input.MOUSE_MODE_VISIBLE + GameInfo.update_inputs() if with_loading: LoadingScreen.hide_loading_screen() diff --git a/gui/menu/controls/scripts/input_group.gd b/gui/menu/controls/scripts/input_group.gd index b802e36..97602c0 100644 --- a/gui/menu/controls/scripts/input_group.gd +++ b/gui/menu/controls/scripts/input_group.gd @@ -11,7 +11,11 @@ var is_remapping := false set(v): action_name = v var events : Array[InputEvent] = InputMap.action_get_events(action_name) - event = null if events.size() == 0 else events[0] + 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(): @@ -28,10 +32,29 @@ func _input(new_event): new_event is InputEventKey or (new_event is InputEventMouseButton and new_event.is_pressed()) ): is_remapping = false - GameInfo.update_input(action_name, event, new_event) 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) + + 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) + + 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