diff --git a/rpcs3/Emu/Io/Skylander.cpp b/rpcs3/Emu/Io/Skylander.cpp index 098c4b7c59..b4a0a1605f 100644 --- a/rpcs3/Emu/Io/Skylander.cpp +++ b/rpcs3/Emu/Io/Skylander.cpp @@ -630,7 +630,7 @@ bool sky_portal::remove_skylander(u8 sky_num) thesky.queued_status.push(2); thesky.queued_status.push(0); thesky.sky_file.close(); - ui_skylanders[thesky.ui_slot] = std::nullopt; + ::at32(ui_skylanders, thesky.ui_slot) = std::nullopt; thesky.ui_slot = 0xFF; return true; } @@ -646,7 +646,7 @@ u8 sky_portal::load_skylander(u8 ui_slot, u8* buf, fs::file in_file) u8 found_slot = 0xFF; // mimics spot retaining on the portal - for (u8 i = 0; i < 8; i++) + for (u8 i = 0; i < MAX_SKYLANDERS; i++) { if ((skylanders[i].status & 1) == 0) { @@ -665,7 +665,7 @@ u8 sky_portal::load_skylander(u8 ui_slot, u8* buf, fs::file in_file) ensure(found_slot != 0xFF); - ui_skylanders[ui_slot] = std::make_tuple(found_slot, reinterpret_cast&>(buf[0x10]), reinterpret_cast&>(buf[0x1C])); + ::at32(ui_skylanders, ui_slot) = std::make_tuple(found_slot, reinterpret_cast&>(buf[0x10]), reinterpret_cast&>(buf[0x1C])); skylander& thesky = skylanders[found_slot]; memcpy(thesky.data.data(), buf, thesky.data.size()); thesky.sky_file = std::move(in_file); @@ -678,9 +678,10 @@ u8 sky_portal::load_skylander(u8 ui_slot, u8* buf, fs::file in_file) return found_slot; } -std::optional> sky_portal::get_skylander(u8 ui_slot) +std::optional> sky_portal::get_skylander(u8 ui_slot) const { - return ui_skylanders[ui_slot]; + //std::lock_guard lock(sky_mutex); + return ::at32(ui_skylanders, ui_slot); } usb_device_skylander::usb_device_skylander(const std::array& location) @@ -777,7 +778,7 @@ void usb_device_skylander::control_transfer(u8 bmRequestType, u8 bRequest, u16 w ensure(buf_size == 3 || buf_size == 32); const u8 sky_num = buf[1] & 0xF; - ensure(sky_num < 8); + ensure(sky_num < MAX_SKYLANDERS); const u8 block = buf[2]; ensure(block < 0x40); @@ -813,7 +814,7 @@ void usb_device_skylander::control_transfer(u8 bmRequestType, u8 bRequest, u16 w ensure(buf_size == 19 || buf_size == 32); const u8 sky_num = buf[1] & 0xF; - ensure(sky_num < 8); + ensure(sky_num < MAX_SKYLANDERS); const u8 block = buf[2]; ensure(block < 0x40); diff --git a/rpcs3/Emu/Io/Skylander.h b/rpcs3/Emu/Io/Skylander.h index 6200c27cbd..540e222e02 100644 --- a/rpcs3/Emu/Io/Skylander.h +++ b/rpcs3/Emu/Io/Skylander.h @@ -5,6 +5,8 @@ #include #include +constexpr auto MAX_SKYLANDERS = 8; + struct skylander { fs::file sky_file; @@ -31,17 +33,19 @@ public: bool remove_skylander(u8 sky_num); u8 load_skylander(u8 ui_slot, u8* buf, fs::file in_file); - std::optional> get_skylander(u8 ui_slot); + std::optional> get_skylander(u8 ui_slot) const; + + bool is_active() const { return activated; } protected: shared_mutex sky_mutex; - bool activated = true; + bool activated = false; u8 interrupt_counter = 0; u8 r = 0, g = 0, b = 0; - skylander skylanders[8]; - std::optional> ui_skylanders[8]; + std::array skylanders {}; + std::array>, MAX_SKYLANDERS> ui_skylanders {}; }; extern sky_portal g_skyportal; diff --git a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp index 1e2f3909f8..d9bc49bf88 100644 --- a/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp +++ b/rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_main_menu.cpp @@ -10,6 +10,7 @@ #include "Emu/System.h" #include "Emu/system_config.h" #include "Emu/Cell/Modules/sceNpTrophy.h" +#include "Emu/Io/Skylander.h" extern atomic_t g_user_asked_for_recording; @@ -97,20 +98,23 @@ namespace rsx }); } - add_item(home_menu::fa_icon::usb, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_USB_DEVICES), [](pad_button btn) -> page_navigation + if (g_skyportal.is_active()) { - if (btn != pad_button::cross) return page_navigation::stay; - - rsx_log.notice("User selected devices in home menu"); - Emu.CallFromMainThread([]() + add_item(home_menu::fa_icon::usb, get_localized_string(localized_string_id::HOME_MENU_SETTINGS_SKYLANDER_MANAGER), [](pad_button btn) -> page_navigation { - if (auto manager = g_fxo->try_get()) + if (btn != pad_button::cross) return page_navigation::stay; + + rsx_log.notice("User selected devices in home menu"); + Emu.CallFromMainThread([]() { - manager->create()->show(); - } + if (auto manager = g_fxo->try_get()) + { + manager->create()->show(); + } + }); + return page_navigation::stay; }); - return page_navigation::stay; - }); + } add_item(home_menu::fa_icon::screenshot, get_localized_string(localized_string_id::HOME_MENU_SCREENSHOT), [](pad_button btn) -> page_navigation { diff --git a/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp b/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp index 8b118d5d4c..8a09999a6b 100644 --- a/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/USBDevices/overlay_skylander_dialog.cpp @@ -15,48 +15,17 @@ namespace rsx static std::string last_skylander_path = ""; - skylander_dialog::skylander_list_entry::skylander_list_entry(std::string name) + skylander_dialog::skylander_list_entry::skylander_list_entry(std::string_view name) { std::unique_ptr label_text = std::make_unique