From 37069e2f8e34b8dd8f5dc5249d74bdb1ea12cf16 Mon Sep 17 00:00:00 2001 From: SuperSamus <40663462+SuperSamus@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:20:26 +0100 Subject: [PATCH] [jak2] Fix "Select controller" (#3191) Co-authored-by: Martino Fontana --- game/kernel/common/kmachine.cpp | 12 ++++++++++-- game/system/hid/input_manager.cpp | 7 +++++++ game/system/hid/input_manager.h | 1 + goal_src/jak2/kernel-defs.gc | 1 + goal_src/jak2/pc/progress/progress-static-pc.gc | 8 ++++---- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/game/kernel/common/kmachine.cpp b/game/kernel/common/kmachine.cpp index 8e5751f809..4875e8bf71 100644 --- a/game/kernel/common/kmachine.cpp +++ b/game/kernel/common/kmachine.cpp @@ -664,7 +664,14 @@ u64 pc_get_controller_count() { return 0; } -void pc_get_controller(u32 controller_id, u32 port) { +u64 pc_get_controller_index(u32 port) { + if (Display::GetMainDisplay()) { + return Display::GetMainDisplay()->get_input_manager()->get_controller_index(port); + } + return 0; +} + +void pc_set_controller(u32 controller_id, u32 port) { if (Display::GetMainDisplay()) { Display::GetMainDisplay()->get_input_manager()->set_controller_for_port(controller_id, port); } @@ -913,7 +920,8 @@ void init_common_pc_port_functions( make_func_symbol_func("pc-get-controller-name", (void*)pc_get_controller_name); make_func_symbol_func("pc-get-current-bind", (void*)pc_get_current_bind); make_func_symbol_func("pc-get-controller-count", (void*)pc_get_controller_count); - make_func_symbol_func("pc-set-controller!", (void*)pc_get_controller); + make_func_symbol_func("pc-get-controller-index", (void*)pc_get_controller_index); + make_func_symbol_func("pc-set-controller!", (void*)pc_set_controller); make_func_symbol_func("pc-set-keyboard-enabled!", (void*)pc_set_keyboard_enabled); make_func_symbol_func("pc-set-mouse-options!", (void*)pc_set_mouse_options); make_func_symbol_func("pc-set-mouse-camera-sens!", (void*)pc_set_mouse_camera_sens); diff --git a/game/system/hid/input_manager.cpp b/game/system/hid/input_manager.cpp index 589a3dd217..87f7401d99 100644 --- a/game/system/hid/input_manager.cpp +++ b/game/system/hid/input_manager.cpp @@ -323,6 +323,13 @@ std::string InputManager::get_current_bind(const int port, return binding_info.front().host_name; } +int InputManager::get_controller_index(const int port) { + if (m_controller_port_mapping.find(port) == m_controller_port_mapping.end()) { + return 0; + } + return m_controller_port_mapping.at(port); +} + void InputManager::set_controller_for_port(const int controller_id, const int port) { if (controller_id < (int)m_available_controllers.size()) { // Reset inputs as this device won't be able to be read from again! diff --git a/game/system/hid/input_manager.h b/game/system/hid/input_manager.h index 5a7d4bf6d3..ea306ddc3f 100644 --- a/game/system/hid/input_manager.h +++ b/game/system/hid/input_manager.h @@ -86,6 +86,7 @@ class InputManager { const bool buttons, const int input_idx, const bool analog_for_minimum); + int get_controller_index(const int port); void set_controller_for_port(const int controller_id, const int port); bool controller_has_led(const int port); bool controller_has_rumble(const int port); diff --git a/goal_src/jak2/kernel-defs.gc b/goal_src/jak2/kernel-defs.gc index 67cf2f3c5a..b03db70a85 100644 --- a/goal_src/jak2/kernel-defs.gc +++ b/goal_src/jak2/kernel-defs.gc @@ -181,6 +181,7 @@ (define-extern pc-waiting-for-bind? (function symbol)) (define-extern pc-set-waiting-for-bind! (function int symbol symbol int none)) (define-extern pc-stop-waiting-for-bind! (function none)) +(define-extern pc-get-controller-index (function int int)) (define-extern pc-set-controller! (function int int none)) (define-extern pc-set-keyboard-enabled! (function symbol none)) (define-extern pc-set-mouse-options! (function symbol symbol symbol none)) diff --git a/goal_src/jak2/pc/progress/progress-static-pc.gc b/goal_src/jak2/pc/progress/progress-static-pc.gc index 82073ed96a..bd1fd8bd8d 100644 --- a/goal_src/jak2/pc/progress/progress-static-pc.gc +++ b/goal_src/jak2/pc/progress/progress-static-pc.gc @@ -134,8 +134,8 @@ This gives us more freedom to write code how we want. :get-item-label-fn (lambda ((index int)) (pc-get-controller-name index *pc-cpp-temp-string*) *pc-cpp-temp-string*) - :get-item-index-fn (lambda () 0) - :on-confirm (lambda ((index int)) (pc-set-controller! 0 index))) + :get-item-index-fn (lambda () (pc-get-controller-index 0)) + :on-confirm (lambda ((index int)) (pc-set-controller! index 0))) (new 'static 'menu-generic-boolean-option :name (text-id progress-vibration) :should-disable? (lambda () (not (pc-current-controller-has-rumble?))) @@ -391,8 +391,8 @@ This gives us more freedom to write code how we want. :get-item-label-fn (lambda ((index int)) (pc-get-controller-name index *pc-cpp-temp-string*) *pc-cpp-temp-string*) - :get-item-index-fn (lambda () 0) - :on-confirm (lambda ((index int)) (pc-set-controller! 0 index))) + :get-item-index-fn (lambda () (pc-get-controller-index 0)) + :on-confirm (lambda ((index int)) (pc-set-controller! index 0))) (new 'static 'menu-generic-boolean-option :name (text-id progress-vibration) :should-disable? (lambda () (not (pc-current-controller-has-rumble?)))