From f883718b238e6897635201a67ca11537ce197510 Mon Sep 17 00:00:00 2001 From: Florin9doi Date: Sun, 25 Jan 2026 00:33:29 +0200 Subject: [PATCH] USB: Complete Summonride figures - Support the last 3 riders discovered by @RipleyTom - Simplify the creator dialog --- rpcs3/Emu/Cell/lv2/sys_usbd.cpp | 3 +- rpcs3/rpcs3qt/kamen_rider_dialog.cpp | 243 ++++++++++----------------- rpcs3/rpcs3qt/kamen_rider_dialog.h | 2 +- 3 files changed, 93 insertions(+), 155 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp index dffd211aed..64f27227d3 100644 --- a/rpcs3/Emu/Cell/lv2/sys_usbd.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_usbd.cpp @@ -247,8 +247,9 @@ private: // uDraw GameTablet {0x20D6, 0xCB17, 0xCB17, "uDraw GameTablet", nullptr, nullptr}, - // DVB-T + // TV Tuners {0x1415, 0x0003, 0x0003, "PlayTV SCEH-0036", nullptr, nullptr}, + // {0x054c, 0x04b2, 0x04b2, "Torne CECH-ZD1 J", nullptr, nullptr}, // PSP Devices {0x054C, 0x01C8, 0x01C8, "PSP Type A", nullptr, nullptr}, diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp index 53fd2e07e0..20202a68f2 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.cpp +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.cpp @@ -16,85 +16,84 @@ #include kamen_rider_dialog* kamen_rider_dialog::inst = nullptr; -std::array>, UI_FIG_NUM> kamen_rider_dialog::figure_slots = {}; +std::array>, UI_FIG_NUM> kamen_rider_dialog::figure_slots = {}; QString last_kamen_rider_path; -static const std::map, const std::string> list_kamen_riders = { - // Character ID [0x1b], ERC type [0x1a], Figure type [0x19] - {{0x10, 0x01, 0x10}, "Kamen Rider Drive (Wind)"}, - {{0x10, 0x01, 0x20}, "Kamen Rider Drive (Water)"}, - {{0x10, 0x01, 0x30}, "Kamen Rider Drive (Fire)"}, - {{0x10, 0x01, 0x40}, "Kamen Rider Drive (Light)"}, - {{0x10, 0x01, 0x50}, "Kamen Rider Drive (Dark)"}, - {{0x20, 0x01, 0x00}, "Kamen Rider Drive - Type Wild"}, - {{0x20, 0x02, 0x00}, "Kamen Rider Drive - Type Wild Gyasha Ver"}, - // {{ , , }, "Kamen Rider Drive - Type Speed Flare"}, - // {{ , , }, "Kamen Rider Drive - Type Technic"}, // 1.05 update - {{0x11, 0x01, 0x10}, "Kamen Rider Gaim (Wind)"}, - {{0x11, 0x01, 0x20}, "Kamen Rider Gaim (Water)"}, - {{0x21, 0x01, 0x00}, "Kamen Rider Gaim - Jimber Lemon Arms"}, - {{0x21, 0x02, 0x00}, "Kamen Rider Gaim - Kachidoki Arms"}, - {{0x21, 0x03, 0x00}, "Kamen Rider Gaim - Kiwami Arms"}, - {{0x12, 0x01, 0x20}, "Kamen Rider Wizard (Water)"}, - {{0x12, 0x01, 0x30}, "Kamen Rider Wizard (Fire)"}, - {{0x22, 0x01, 0x00}, "Kamen Rider Wizard - Infinity Style"}, - {{0x22, 0x02, 0x00}, "Kamen Rider Wizard - All Dragon"}, - {{0x22, 0x03, 0x00}, "Kamen Rider Wizard - Infinity Gold Dragon"}, - {{0x13, 0x01, 0x40}, "Kamen Rider Fourze (Light)"}, - {{0x23, 0x01, 0x00}, "Kamen Rider Fourze - Magnet States"}, - {{0x23, 0x02, 0x00}, "Kamen Rider Fourze - Cosmic States"}, - {{0x23, 0x03, 0x00}, "Kamen Rider Fourze - Meteor Nadeshiko Fusion States"}, - {{0x14, 0x01, 0x20}, "Kamen Rider OOO (Water)"}, - {{0x24, 0x01, 0x00}, "Kamen Rider OOO - Super Tatoba Combo"}, - {{0x24, 0x02, 0x00}, "Kamen Rider OOO - Putotyra Combo"}, - {{0x24, 0x04, 0x00}, "Kamen Rider OOO - Tajadol Combo"}, - {{0x15, 0x01, 0x10}, "Kamen Rider W (Double) (Wind)"}, - {{0x25, 0x01, 0x00}, "Kamen Rider W (Double) - Cyclone Joker Extreme"}, - {{0x25, 0x02, 0x00}, "Kamen Rider W (Double) - Cyclone Joker Gold Extreme"}, - {{0x25, 0x03, 0x00}, "Kamen Rider W (Double) - Fang Joker"}, - {{0x16, 0x01, 0x50}, "Kamen Rider Decade (Dark)"}, - {{0x26, 0x01, 0x00}, "Kamen Rider Decade - Complete Form"}, - {{0x26, 0x02, 0x00}, "Kamen Rider Decade - Strongest Complete Form"}, - {{0x26, 0x03, 0x00}, "Kamen Rider Decade - Final Form"}, - {{0x17, 0x01, 0x50}, "Kamen Rider Kiva (Dark)"}, - {{0x27, 0x01, 0x00}, "Kamen Rider Kiva - Dogabaki Form"}, - {{0x27, 0x02, 0x00}, "Kamen Rider Kiva - Emperor Form"}, - {{0x18, 0x01, 0x40}, "Kamen Rider Den-O (Light)"}, - {{0x28, 0x01, 0x00}, "Kamen Rider Den-O - Super Climax Form"}, - {{0x28, 0x02, 0x00}, "Kamen Rider Den-O - Liner Form"}, - {{0x28, 0x03, 0x00}, "Kamen Rider Den-O - Climax Form"}, - {{0x19, 0x01, 0x30}, "Kamen Rider Kabuto (Fire)"}, - {{0x29, 0x01, 0x00}, "Kamen Rider Kabuto - Hyper Form"}, - {{0x29, 0x02, 0x00}, "Kamen Rider Kabuto - Masked Form"}, - {{0x1a, 0x01, 0x30}, "Kamen Rider Hibiki (Fire)"}, - {{0x2a, 0x01, 0x00}, "Kamen Rider Hibiki - Kurenai"}, - {{0x2a, 0x02, 0x00}, "Kamen Rider Hibiki - Armed"}, - {{0x1b, 0x01, 0x50}, "Kamen Rider Blade (Dark)"}, - {{0x2b, 0x01, 0x00}, "Kamen Rider Blade - Joker Form"}, - {{0x2b, 0x02, 0x00}, "Kamen Rider Blade - King Form"}, - {{0x1c, 0x01, 0x50}, "Kamen Rider Faiz (Dark)"}, - {{0x2c, 0x01, 0x00}, "Kamen Rider Faiz - Axel Form"}, - {{0x2c, 0x02, 0x00}, "Kamen Rider Faiz - Blaster Form"}, - {{0x1d, 0x01, 0x10}, "Kamen Rider Ryuki (Wind)"}, - {{0x2d, 0x01, 0x00}, "Kamen Rider Ryuki - Dragreder"}, - {{0x2d, 0x02, 0x00}, "Kamen Rider Ryuki - Survive"}, - {{0x1e, 0x01, 0x20}, "Kamen Rider Agito (Water)"}, - {{0x2e, 0x01, 0x00}, "Kamen Rider Agito - Shining Form"}, - {{0x2e, 0x02, 0x00}, "Kamen Rider Agito - Burning Form"}, - {{0x1f, 0x01, 0x40}, "Kamen Rider Kuuga (Light)"}, - {{0x2f, 0x01, 0x00}, "Kamen Rider Kuuga - Ultimate Form"}, - {{0x2f, 0x02, 0x00}, "Kamen Rider Kuuga - Amazing Mighty"}, +static const std::map list_kamen_riders = { + {0x10'01'10'10, "Kamen Rider Drive (Wind)"}, + {0x10'01'20'10, "Kamen Rider Drive (Water)"}, + {0x10'01'30'10, "Kamen Rider Drive (Fire)"}, + {0x10'01'40'10, "Kamen Rider Drive (Light)"}, + {0x10'01'50'10, "Kamen Rider Drive (Dark)"}, + {0x20'01'00'10, "Kamen Rider Drive - Type Wild"}, + {0x20'02'00'10, "Kamen Rider Drive - Type Wild Gyasha Ver"}, + {0x20'03'00'11, "Kamen Rider Drive - Type Technic"}, + {0x20'06'00'10, "Kamen Rider Drive - Type Speed Flare"}, + {0x11'01'10'10, "Kamen Rider Gaim (Wind)"}, + {0x11'01'20'10, "Kamen Rider Gaim (Water)"}, + {0x21'01'00'10, "Kamen Rider Gaim - Jimber Lemon Arms"}, + {0x21'02'00'10, "Kamen Rider Gaim - Kachidoki Arms"}, + {0x21'03'00'10, "Kamen Rider Gaim - Kiwami Arms"}, + {0x12'01'20'10, "Kamen Rider Wizard (Water)"}, + {0x12'01'30'10, "Kamen Rider Wizard (Fire)"}, + {0x22'01'00'10, "Kamen Rider Wizard - Infinity Style"}, + {0x22'02'00'10, "Kamen Rider Wizard - All Dragon"}, + {0x22'03'00'10, "Kamen Rider Wizard - Infinity Gold Dragon"}, + {0x13'01'40'10, "Kamen Rider Fourze (Light)"}, + {0x23'01'00'10, "Kamen Rider Fourze - Magnet States"}, + {0x23'02'00'10, "Kamen Rider Fourze - Cosmic States"}, + {0x23'03'00'10, "Kamen Rider Fourze - Meteor Nadeshiko Fusion States"}, + {0x14'01'20'10, "Kamen Rider OOO (Water)"}, + {0x24'01'00'10, "Kamen Rider OOO - Super Tatoba Combo"}, + {0x24'02'00'10, "Kamen Rider OOO - Putotyra Combo"}, + {0x24'04'00'10, "Kamen Rider OOO - Tajadol Combo"}, + {0x15'01'10'10, "Kamen Rider W (Double) (Wind)"}, + {0x25'01'00'10, "Kamen Rider W (Double) - Cyclone Joker Extreme"}, + {0x25'02'00'10, "Kamen Rider W (Double) - Cyclone Joker Gold Extreme"}, + {0x25'03'00'10, "Kamen Rider W (Double) - Fang Joker"}, + {0x16'01'50'10, "Kamen Rider Decade (Dark)"}, + {0x26'01'00'10, "Kamen Rider Decade - Complete Form"}, + {0x26'02'00'10, "Kamen Rider Decade - Strongest Complete Form"}, + {0x26'03'00'10, "Kamen Rider Decade - Final Form"}, + {0x17'01'50'10, "Kamen Rider Kiva (Dark)"}, + {0x27'01'00'10, "Kamen Rider Kiva - Dogabaki Form"}, + {0x27'02'00'10, "Kamen Rider Kiva - Emperor Form"}, + {0x18'01'40'10, "Kamen Rider Den-O (Light)"}, + {0x28'01'00'10, "Kamen Rider Den-O - Super Climax Form"}, + {0x28'02'00'10, "Kamen Rider Den-O - Liner Form"}, + {0x28'03'00'10, "Kamen Rider Den-O - Climax Form"}, + {0x19'01'30'10, "Kamen Rider Kabuto (Fire)"}, + {0x29'01'00'10, "Kamen Rider Kabuto - Hyper Form"}, + {0x29'02'00'10, "Kamen Rider Kabuto - Masked Form"}, + {0x1a'01'30'10, "Kamen Rider Hibiki (Fire)"}, + {0x2a'01'00'10, "Kamen Rider Hibiki - Kurenai"}, + {0x2a'02'00'10, "Kamen Rider Hibiki - Armed"}, + {0x1b'01'50'10, "Kamen Rider Blade (Dark)"}, + {0x2b'01'00'10, "Kamen Rider Blade - Joker Form"}, + {0x2b'02'00'10, "Kamen Rider Blade - King Form"}, + {0x1c'01'50'10, "Kamen Rider Faiz (Dark)"}, + {0x2c'01'00'10, "Kamen Rider Faiz - Axel Form"}, + {0x2c'02'00'10, "Kamen Rider Faiz - Blaster Form"}, + {0x1d'01'10'10, "Kamen Rider Ryuki (Wind)"}, + {0x2d'01'00'10, "Kamen Rider Ryuki - Dragreder"}, + {0x2d'02'00'10, "Kamen Rider Ryuki - Survive"}, + {0x1e'01'20'10, "Kamen Rider Agito (Water)"}, + {0x2e'01'00'10, "Kamen Rider Agito - Shining Form"}, + {0x2e'02'00'10, "Kamen Rider Agito - Burning Form"}, + {0x1f'01'40'10, "Kamen Rider Kuuga (Light)"}, + {0x2f'01'00'10, "Kamen Rider Kuuga - Ultimate Form"}, + {0x2f'02'00'10, "Kamen Rider Kuuga - Amazing Mighty"}, - {{0x31, 0x01, 0x00}, "Kamen Rider Baron"}, - {{0x31, 0x02, 0x00}, "Kamen Rider Zangetsu Shin"}, - {{0x32, 0x01, 0x00}, "Kamen Rider Beast"}, - {{0x33, 0x01, 0x00}, "Kamen Rider Meteor"}, - {{0x34, 0x01, 0x00}, "Kamen Rider Birth"}, - {{0x35, 0x01, 0x00}, "Kamen Rider Accel"}, - {{0x36, 0x01, 0x00}, "Kamen Rider Diend"}, - {{0x36, 0x02, 0x00}, "Kamen Rider Shocker Combatman"}, - {{0x39, 0x01, 0x00}, "Kamen Rider Gatack"}, - // {{ , , }, "Kamen Rider Mach"}, // 01.05 update + {0x30'01'00'11, "Kamen Rider Mach"}, + {0x31'01'00'10, "Kamen Rider Baron"}, + {0x31'02'00'10, "Kamen Rider Zangetsu Shin"}, + {0x32'01'00'10, "Kamen Rider Beast"}, + {0x33'01'00'10, "Kamen Rider Meteor"}, + {0x34'01'00'10, "Kamen Rider Birth"}, + {0x35'01'00'10, "Kamen Rider Accel"}, + {0x36'01'00'10, "Kamen Rider Diend"}, + {0x36'02'00'10, "Kamen Rider Shocker Combatman"}, + {0x39'01'00'10, "Kamen Rider Gatack"}, }; static u32 kamen_rider_crc32(const std::array& buffer) @@ -154,21 +153,18 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) { setWindowTitle(tr("Kamen Rider Creator")); setObjectName("kamen_rider_creator"); - setMinimumSize(QSize(500, 150)); + setMinimumSize(QSize(500, 100)); QVBoxLayout* vbox_panel = new QVBoxLayout(); QComboBox* combo_figlist = new QComboBox(); QStringList filterlist; - for (const auto& [entry, figure_name] : list_kamen_riders) + for (const auto& [fig_id, figure_name] : list_kamen_riders) { - const auto& [character_id, erc_type, figure_type] = entry; - const uint qvar = (character_id << 16) | (erc_type << 8) | figure_type; QString name = QString::fromStdString(figure_name); - combo_figlist->addItem(name, QVariant(qvar)); + combo_figlist->addItem(name, QVariant(fig_id)); filterlist << std::move(name); } - combo_figlist->addItem(tr("--Unknown--"), QVariant(0xFFFFFFFF)); combo_figlist->setEditable(true); combo_figlist->setInsertPolicy(QComboBox::NoInsert); combo_figlist->model()->sort(0, Qt::AscendingOrder); @@ -178,33 +174,8 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) co_compl->setCompletionMode(QCompleter::PopupCompletion); co_compl->setFilterMode(Qt::MatchContains); combo_figlist->setCompleter(co_compl); - vbox_panel->addWidget(combo_figlist); - QFrame* line = new QFrame(); - line->setFrameShape(QFrame::HLine); - line->setFrameShadow(QFrame::Sunken); - vbox_panel->addWidget(line); - - QHBoxLayout* hbox_idvar = new QHBoxLayout(); - QLabel* label_id = new QLabel(tr("Character:")); - QLabel* label_erc = new QLabel(tr("ERC:")); - QLabel* label_fig = new QLabel(tr("Figure:")); - QLineEdit* edit_id = new QLineEdit("0"); - QLineEdit* edit_erc = new QLineEdit("0"); - QLineEdit* edit_fig = new QLineEdit("0"); - QRegularExpressionValidator* rxv = new QRegularExpressionValidator(QRegularExpression("\\d*"), this); - edit_id->setValidator(rxv); - edit_erc->setValidator(rxv); - edit_fig->setValidator(rxv); - hbox_idvar->addWidget(label_id); - hbox_idvar->addWidget(edit_id); - hbox_idvar->addWidget(label_erc); - hbox_idvar->addWidget(edit_erc); - hbox_idvar->addWidget(label_fig); - hbox_idvar->addWidget(edit_fig); - vbox_panel->addLayout(hbox_idvar); - QHBoxLayout* hbox_buttons = new QHBoxLayout(); QPushButton* btn_create = new QPushButton(tr("Create"), this); QPushButton* btn_cancel = new QPushButton(tr("Cancel"), this); @@ -215,52 +186,18 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) setLayout(vbox_panel); - connect(combo_figlist, &QComboBox::currentIndexChanged, [=](int index) - { - const u32 fig_info = combo_figlist->itemData(index).toUInt(); - if (fig_info != 0xFFFFFFFF) - { - const u8 character_id = (fig_info >> 16) & 0xff; - const u8 erc_type = (fig_info >> 8) & 0xff; - const u8 figure_type = fig_info & 0xff; - - edit_id->setText(QString::number(character_id)); - edit_erc->setText(QString::number(erc_type)); - edit_fig->setText(QString::number(figure_type)); - } - }); - connect(btn_create, &QAbstractButton::clicked, this, [=, this]() { - bool ok_character = false, ok_erc = false, ok_fig = false; - const u8 character_id = edit_id->text().toUShort(&ok_character); - if (!ok_character) - { - QMessageBox::warning(this, tr("Error converting value"), tr("ID entered is invalid!"), QMessageBox::Ok); - return; - } - const u8 erc_type = edit_erc->text().toUShort(&ok_erc); - if (!ok_erc) - { - QMessageBox::warning(this, tr("Error converting value"), tr("ERC entered is invalid!"), QMessageBox::Ok); - return; - } - const u8 figure_type = edit_fig->text().toUShort(&ok_fig); - if (!ok_fig) - { - QMessageBox::warning(this, tr("Error converting value"), tr("Figure entered is invalid!"), QMessageBox::Ok); - return; - } - + const u32 fig_id = combo_figlist->itemData(combo_figlist->currentIndex()).toUInt(); QString predef_name = last_kamen_rider_path; - const auto found_fig = list_kamen_riders.find(std::make_tuple(character_id, erc_type, figure_type)); + const auto found_fig = list_kamen_riders.find(fig_id); if (found_fig != list_kamen_riders.cend()) { predef_name += QString::fromStdString(found_fig->second + ".bin"); } else { - predef_name += QString("Unknown(%1 %2 %3).bin").arg(character_id).arg(erc_type).arg(figure_type); + predef_name += QString("Unknown (%1).bin").arg(fig_id); } file_path = QFileDialog::getSaveFileName(this, tr("Create Kamen Rider File"), predef_name, tr("Kamen Rider Object (*.bin);;All Files (*)")); @@ -294,7 +231,9 @@ kamen_rider_creator_dialog::kamen_rider_creator_dialog(QWidget* parent) buf[7] = 0x89; buf[8] = 0x44; buf[10] = 0xc2; - std::array figure_data = {u8(dist(mt)), 0x03, 0x00, 0x00, 0x01, 0x0e, 0x0a, 0x0a, 0x10, figure_type, erc_type, character_id}; + std::array figure_data = {static_cast(dist(mt)), 0x03, 0x00, 0x00, 0x01, 0x0e, 0x0a, 0x0a, + static_cast(fig_id & 0xff), static_cast((fig_id >> 8) & 0xff), + static_cast((fig_id >> 16) & 0xff), static_cast((fig_id >> 24) & 0xff)}; write_to_ptr>(figure_data.data(), 0xC, kamen_rider_crc32(figure_data)); memcpy(&buf[16], figure_data.data(), figure_data.size()); fig_file.write(buf.data(), buf.size()); @@ -401,7 +340,7 @@ void kamen_rider_dialog::clear_kamen_rider(u8 slot) { if (const auto& slot_infos = ::at32(figure_slots, slot)) { - const auto& [cur_slot, character_id, erc_type, figure_type] = slot_infos.value(); + const auto& [cur_slot, fig_id] = slot_infos.value(); g_ridergate.remove_figure(cur_slot); figure_slots[slot] = {}; update_edits(); @@ -448,12 +387,10 @@ void kamen_rider_dialog::load_kamen_rider_path(u8 slot, const QString& path) clear_kamen_rider(slot); - u8 character_id = data[0x1b]; - u8 erc_type = data[0x1a]; - u8 figure_type = data[0x19]; + u32 fig_id = data[0x18] | (data[0x19] << 8) | (data[0x1a] << 16) | (data[0x1b] << 24); u8 portal_slot = g_ridergate.load_figure(data, std::move(fig_file)); - figure_slots[slot] = std::tuple(portal_slot, character_id, erc_type, figure_type); + figure_slots[slot] = std::pair(portal_slot, fig_id); update_edits(); } @@ -465,15 +402,15 @@ void kamen_rider_dialog::update_edits() QString display_string; if (const auto& sd = figure_slots[i]) { - const auto& [portal_slot, character_id, erc_type, figure_type] = sd.value(); - const auto found_fig = list_kamen_riders.find(std::make_tuple(character_id, erc_type, figure_type)); + const auto& [portal_slot, fig_id] = sd.value(); + const auto found_fig = list_kamen_riders.find(fig_id); if (found_fig != list_kamen_riders.cend()) { display_string = QString::fromStdString(found_fig->second); } else { - display_string = QString(tr("Unknown (Character:%1 ERC:%2 Figure:%3)")).arg(character_id).arg(erc_type).arg(figure_type); + display_string = QString(tr("Unknown (%1)")).arg(fig_id); } } else diff --git a/rpcs3/rpcs3qt/kamen_rider_dialog.h b/rpcs3/rpcs3qt/kamen_rider_dialog.h index 3b6dc69e51..9f872d7bc2 100644 --- a/rpcs3/rpcs3qt/kamen_rider_dialog.h +++ b/rpcs3/rpcs3qt/kamen_rider_dialog.h @@ -42,7 +42,7 @@ protected: protected: std::array edit_kamen_riders{}; - static std::array>, UI_FIG_NUM> figure_slots; + static std::array>, UI_FIG_NUM> figure_slots; private: static kamen_rider_dialog* inst;