Просмотр исходного кода

yuzu: Add button to boot mii edit from firmware

german77 2 лет назад
Родитель
Сommit
bb4ae5ee53
3 измененных файлов с 52 добавлено и 1 удалено
  1. 42 0
      src/yuzu/main.cpp
  2. 2 0
      src/yuzu/main.h
  3. 8 1
      src/yuzu/main.ui

+ 42 - 0
src/yuzu/main.cpp

@@ -1551,6 +1551,7 @@ void GMainWindow::ConnectMenuEvents() {
     // Tools
     // Tools
     connect_menu(ui->action_Rederive, std::bind(&GMainWindow::OnReinitializeKeys, this,
     connect_menu(ui->action_Rederive, std::bind(&GMainWindow::OnReinitializeKeys, this,
                                                 ReinitializeKeyBehavior::Warning));
                                                 ReinitializeKeyBehavior::Warning));
+    connect_menu(ui->action_Load_Mii_Edit, &GMainWindow::OnMiiEdit);
     connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
     connect_menu(ui->action_Capture_Screenshot, &GMainWindow::OnCaptureScreenshot);
 
 
     // TAS
     // TAS
@@ -1590,6 +1591,8 @@ void GMainWindow::UpdateMenuState() {
     }
     }
 
 
     multiplayer_state->UpdateNotificationStatus();
     multiplayer_state->UpdateNotificationStatus();
+
+    ui->action_Load_Mii_Edit->setEnabled(CheckFirmwarePresence());
 }
 }
 
 
 void GMainWindow::OnDisplayTitleBars(bool show) {
 void GMainWindow::OnDisplayTitleBars(bool show) {
@@ -4134,6 +4137,27 @@ void GMainWindow::OnToggleStatusBar() {
     statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked());
     statusBar()->setVisible(ui->action_Show_Status_Bar->isChecked());
 }
 }
 
 
+void GMainWindow::OnMiiEdit() {
+    constexpr u64 MiiEditId = 0x0100000000001009ull;
+    auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
+    if (!bis_system) {
+        QMessageBox::warning(this, tr("No firmware available"),
+                             tr("Please install the firmware to use the Mii editor."));
+        return;
+    }
+
+    auto mii_applet_nca = bis_system->GetEntry(MiiEditId, FileSys::ContentRecordType::Program);
+    if (!mii_applet_nca) {
+        QMessageBox::warning(this, tr("Mii Edit Applet"),
+                             tr("Mii editor is not available. Please reinstall firmware."));
+        return;
+    }
+
+    const auto filename = QString::fromStdString((mii_applet_nca->GetFullPath()));
+    UISettings::values.roms_path = QFileInfo(filename).path();
+    BootGame(filename);
+}
+
 void GMainWindow::OnCaptureScreenshot() {
 void GMainWindow::OnCaptureScreenshot() {
     if (emu_thread == nullptr || !emu_thread->IsRunning()) {
     if (emu_thread == nullptr || !emu_thread->IsRunning()) {
         return;
         return;
@@ -4540,6 +4564,8 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {
     if (behavior == ReinitializeKeyBehavior::Warning) {
     if (behavior == ReinitializeKeyBehavior::Warning) {
         game_list->PopulateAsync(UISettings::values.game_dirs);
         game_list->PopulateAsync(UISettings::values.game_dirs);
     }
     }
+
+    UpdateMenuState();
 }
 }
 
 
 bool GMainWindow::CheckSystemArchiveDecryption() {
 bool GMainWindow::CheckSystemArchiveDecryption() {
@@ -4561,6 +4587,22 @@ bool GMainWindow::CheckSystemArchiveDecryption() {
     return mii_nca->GetRomFS().get() != nullptr;
     return mii_nca->GetRomFS().get() != nullptr;
 }
 }
 
 
+bool GMainWindow::CheckFirmwarePresence() {
+    constexpr u64 MiiEditId = 0x0100000000001009ull;
+
+    auto bis_system = system->GetFileSystemController().GetSystemNANDContents();
+    if (!bis_system) {
+        return false;
+    }
+
+    auto mii_applet_nca = bis_system->GetEntry(MiiEditId, FileSys::ContentRecordType::Program);
+    if (!mii_applet_nca) {
+        return false;
+    }
+
+    return true;
+}
+
 bool GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed, u64 program_id,
 bool GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed, u64 program_id,
                                         u64* selected_title_id, u8* selected_content_record_type) {
                                         u64* selected_title_id, u8* selected_content_record_type) {
     using ContentInfo = std::pair<FileSys::TitleType, FileSys::ContentRecordType>;
     using ContentInfo = std::pair<FileSys::TitleType, FileSys::ContentRecordType>;

+ 2 - 0
src/yuzu/main.h

@@ -365,6 +365,7 @@ private slots:
     void ResetWindowSize720();
     void ResetWindowSize720();
     void ResetWindowSize900();
     void ResetWindowSize900();
     void ResetWindowSize1080();
     void ResetWindowSize1080();
+    void OnMiiEdit();
     void OnCaptureScreenshot();
     void OnCaptureScreenshot();
     void OnReinitializeKeys(ReinitializeKeyBehavior behavior);
     void OnReinitializeKeys(ReinitializeKeyBehavior behavior);
     void OnLanguageChanged(const QString& locale);
     void OnLanguageChanged(const QString& locale);
@@ -409,6 +410,7 @@ private:
     void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
     void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
     bool CheckDarkMode();
     bool CheckDarkMode();
     bool CheckSystemArchiveDecryption();
     bool CheckSystemArchiveDecryption();
+    bool CheckFirmwarePresence();
     void ConfigureFilesystemProvider(const std::string& filepath);
     void ConfigureFilesystemProvider(const std::string& filepath);
 
 
     QString GetTasStateDescription() const;
     QString GetTasStateDescription() const;

+ 8 - 1
src/yuzu/main.ui

@@ -150,6 +150,8 @@
     <addaction name="action_Rederive"/>
     <addaction name="action_Rederive"/>
     <addaction name="action_Verify_installed_contents"/>
     <addaction name="action_Verify_installed_contents"/>
     <addaction name="separator"/>
     <addaction name="separator"/>
+    <addaction name="action_Load_Mii_Edit"/>
+    <addaction name="separator"/>
     <addaction name="action_Capture_Screenshot"/>
     <addaction name="action_Capture_Screenshot"/>
     <addaction name="menuTAS"/>
     <addaction name="menuTAS"/>
    </widget>
    </widget>
@@ -217,7 +219,7 @@
   </action>
   </action>
   <action name="action_Verify_installed_contents">
   <action name="action_Verify_installed_contents">
    <property name="text">
    <property name="text">
-    <string>Verify installed contents</string>
+    <string>&amp;Verify Installed Contents</string>
    </property>
    </property>
   </action>
   </action>
   <action name="action_About">
   <action name="action_About">
@@ -368,6 +370,11 @@
     <string>&amp;Capture Screenshot</string>
     <string>&amp;Capture Screenshot</string>
    </property>
    </property>
   </action>
   </action>
+  <action name="action_Load_Mii_Edit">
+    <property name="text">
+      <string>Open &amp;Mii Editor</string>
+    </property>
+  </action>
   <action name="action_Configure_Tas">
   <action name="action_Configure_Tas">
    <property name="text">
    <property name="text">
     <string>&amp;Configure TAS...</string>
     <string>&amp;Configure TAS...</string>