├── Docs ├── menu.gif ├── media_types.png ├── core_per_game.png ├── settings_log.png ├── setup_sort_games.png ├── layout_menu_fixed.png ├── settings_first_run.png ├── layout_menu_original.png ├── setup_sort_platform.png ├── setup_sort_playlist.png ├── layout_collection_fixed.png ├── layout_collection_group.png ├── layout_collection_original.png ├── settings_data_source_add.png ├── settings_personalization.png ├── setup_launchbox_import_add.png ├── setup_ppsspp_edit_emulator.png ├── setup_xbsx2_edit_emulator.png ├── settings_data_source_choose.png ├── setup_dolphin_edit_emulator.png ├── setup_launchbox_import_copy.png ├── setup_retroarch_quit_hotkey.png ├── layout_collection_stretch_fill.png ├── settings_data_source_activate.png ├── setup_duckstation_edit_emulator.png ├── setup_launchbox_import_emulator.png ├── setup_launchbox_import_platform.png ├── setup_retrixgold_edit_emulator.png ├── setup_retroarch_edit_emulator.png ├── setup_xeniacanary_edit_emulator.png ├── layout_collection_stretch_uniform.png ├── setup_ppsspp_associated_platforms.png ├── setup_xbsx2_associated_platforms.png ├── setup_dolphin_associated_platforms.png ├── setup_retroarch_associated_platforms.png ├── setup_duckstation_associated_platforms.png ├── setup_retrixgold_associated_platforms.png ├── setup_xeniacanary_associated_platforms.png ├── layout_collection_stretch_uniform_to_fill.png ├── setup_multiple_data_sources_flash_content.png ├── setup_multiple_data_sources_flash_content_2.png ├── setup_multiple_data_sources_flash_content_4.png ├── setup_multiple_data_sources_flash_content_5.png ├── setup_multiple_data_sources_settings_activate.png ├── setup_multiple_data_sources_settings_activated.png ├── setup_multiple_data_sources_settings_unavailable.png ├── v1.5 │ └── RetroPass.xml ├── v1.6 │ └── RetroPass.xml ├── SettingsLogging.md ├── SetupPPSSPP.md ├── SetupRetriXGold.md ├── SetupDuckStation.md ├── SetupDolphin.md ├── SetupXBSX2.md ├── SetupXeniaCanary.md ├── SetupLaunchBox.md ├── SetupRetroArch.md ├── SetupLaunchBoxSorting.md ├── SetupLaunchBoxImport.md ├── SettingsDataSources.md ├── SettingsPersonalization.md ├── SetupEmulationStation.md └── SetupMultipleDataSources.md ├── RetroPass ├── Assets │ ├── empty.png │ ├── StoreLogo.backup.png │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── LockScreenLogo.scale-200.png │ ├── SplashScreen.scale-100.png │ ├── SplashScreen.scale-125.png │ ├── SplashScreen.scale-150.png │ ├── SplashScreen.scale-200.png │ ├── SplashScreen.scale-400.png │ ├── SplashScreenDefault-100.png │ ├── SplashScreenDefault-125.png │ ├── SplashScreenDefault-150.png │ ├── SplashScreenDefault-200.png │ ├── SplashScreenDefault-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png │ └── Square44x44Logo.altform-lightunplated_targetsize-256.png ├── Resources │ ├── SearchBackgroundDark_128.png │ ├── SearchBackgroundLight_128.png │ └── Themes │ │ └── ThemeDefault │ │ └── CommonDefault.xaml.cs ├── PlaylistItem.cs ├── App.xaml ├── PlayLaterControl.xaml.cs ├── Properties │ ├── AssemblyInfo.cs │ └── Default.rd.xml ├── SettingsPages │ ├── SettingsLogPage.xaml.cs │ ├── SettingsLogPage.xaml │ ├── SettingsPage.xaml.cs │ ├── SettingsAddDataSourcePage.xaml.cs │ ├── SettingsPage.xaml │ ├── SettingsDataSourcePage.xaml │ ├── SettingsDataSourcePage.xaml.cs │ ├── SettingsPersonalizationPage.xaml.cs │ ├── SettingsAddDataSourcePage.xaml │ └── SettingsPersonalizationPage.xaml ├── Utils.cs ├── ThemeManager.cs ├── PlayLaterControl.xaml ├── StorageUtils.cs ├── LogPage.xaml ├── Package.appxmanifest ├── Platform.cs ├── Playlist.cs ├── FocusControl.xaml ├── UrlSchemeGenerator.cs ├── DataSource.cs ├── LogPage.xaml.cs ├── FocusControl.xaml.cs ├── SettingsPage.xaml.cs ├── App.xaml.cs ├── ThumbnailCache.cs ├── PlaylistPlayLater.cs ├── GameCollectionPage.xaml └── SearchPage.xaml ├── AUTHORS.md ├── Temp └── Job.md ├── .gitattributes ├── RetroPass.sln ├── .github └── workflows │ └── main.yml ├── README.md └── .gitignore /Docs/menu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/menu.gif -------------------------------------------------------------------------------- /Docs/media_types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/media_types.png -------------------------------------------------------------------------------- /Docs/core_per_game.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/core_per_game.png -------------------------------------------------------------------------------- /Docs/settings_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/settings_log.png -------------------------------------------------------------------------------- /Docs/setup_sort_games.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_sort_games.png -------------------------------------------------------------------------------- /Docs/layout_menu_fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_menu_fixed.png -------------------------------------------------------------------------------- /Docs/settings_first_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/settings_first_run.png -------------------------------------------------------------------------------- /RetroPass/Assets/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/empty.png -------------------------------------------------------------------------------- /Docs/layout_menu_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_menu_original.png -------------------------------------------------------------------------------- /Docs/setup_sort_platform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_sort_platform.png -------------------------------------------------------------------------------- /Docs/setup_sort_playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_sort_playlist.png -------------------------------------------------------------------------------- /Docs/layout_collection_fixed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_collection_fixed.png -------------------------------------------------------------------------------- /Docs/layout_collection_group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_collection_group.png -------------------------------------------------------------------------------- /Docs/layout_collection_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_collection_original.png -------------------------------------------------------------------------------- /Docs/settings_data_source_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/settings_data_source_add.png -------------------------------------------------------------------------------- /Docs/settings_personalization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/settings_personalization.png -------------------------------------------------------------------------------- /Docs/setup_launchbox_import_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_launchbox_import_add.png -------------------------------------------------------------------------------- /Docs/setup_ppsspp_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_ppsspp_edit_emulator.png -------------------------------------------------------------------------------- /Docs/setup_xbsx2_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_xbsx2_edit_emulator.png -------------------------------------------------------------------------------- /Docs/settings_data_source_choose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/settings_data_source_choose.png -------------------------------------------------------------------------------- /Docs/setup_dolphin_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_dolphin_edit_emulator.png -------------------------------------------------------------------------------- /Docs/setup_launchbox_import_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_launchbox_import_copy.png -------------------------------------------------------------------------------- /Docs/setup_retroarch_quit_hotkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_retroarch_quit_hotkey.png -------------------------------------------------------------------------------- /RetroPass/Assets/StoreLogo.backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/StoreLogo.backup.png -------------------------------------------------------------------------------- /Docs/layout_collection_stretch_fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_collection_stretch_fill.png -------------------------------------------------------------------------------- /Docs/settings_data_source_activate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/settings_data_source_activate.png -------------------------------------------------------------------------------- /Docs/setup_duckstation_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_duckstation_edit_emulator.png -------------------------------------------------------------------------------- /Docs/setup_launchbox_import_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_launchbox_import_emulator.png -------------------------------------------------------------------------------- /Docs/setup_launchbox_import_platform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_launchbox_import_platform.png -------------------------------------------------------------------------------- /Docs/setup_retrixgold_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_retrixgold_edit_emulator.png -------------------------------------------------------------------------------- /Docs/setup_retroarch_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_retroarch_edit_emulator.png -------------------------------------------------------------------------------- /Docs/setup_xeniacanary_edit_emulator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_xeniacanary_edit_emulator.png -------------------------------------------------------------------------------- /RetroPass/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /RetroPass/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /RetroPass/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /Docs/layout_collection_stretch_uniform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_collection_stretch_uniform.png -------------------------------------------------------------------------------- /Docs/setup_ppsspp_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_ppsspp_associated_platforms.png -------------------------------------------------------------------------------- /Docs/setup_xbsx2_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_xbsx2_associated_platforms.png -------------------------------------------------------------------------------- /Docs/setup_dolphin_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_dolphin_associated_platforms.png -------------------------------------------------------------------------------- /Docs/setup_retroarch_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_retroarch_associated_platforms.png -------------------------------------------------------------------------------- /RetroPass/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreenDefault-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreenDefault-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreenDefault-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreenDefault-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreenDefault-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreenDefault-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreenDefault-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreenDefault-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/SplashScreenDefault-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/SplashScreenDefault-400.png -------------------------------------------------------------------------------- /Docs/setup_duckstation_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_duckstation_associated_platforms.png -------------------------------------------------------------------------------- /Docs/setup_retrixgold_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_retrixgold_associated_platforms.png -------------------------------------------------------------------------------- /Docs/setup_xeniacanary_associated_platforms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_xeniacanary_associated_platforms.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /RetroPass/Assets/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /Docs/layout_collection_stretch_uniform_to_fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/layout_collection_stretch_uniform_to_fill.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_flash_content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_flash_content.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /RetroPass/Resources/SearchBackgroundDark_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Resources/SearchBackgroundDark_128.png -------------------------------------------------------------------------------- /RetroPass/Resources/SearchBackgroundLight_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Resources/SearchBackgroundLight_128.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_flash_content_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_flash_content_2.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_flash_content_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_flash_content_4.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_flash_content_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_flash_content_5.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_settings_activate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_settings_activate.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_settings_activated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_settings_activated.png -------------------------------------------------------------------------------- /Docs/setup_multiple_data_sources_settings_unavailable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/Docs/setup_multiple_data_sources_settings_unavailable.png -------------------------------------------------------------------------------- /RetroPass/PlaylistItem.cs: -------------------------------------------------------------------------------- 1 | namespace RetroPass 2 | { 3 | public class PlaylistItem 4 | { 5 | public Playlist playlist { get; set; } 6 | public Game game; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | # RetroPass authors 2 | 3 | ## Development 4 | retropassdev 5 | SirMangler 6 | 𝔇𝔞𝔫𝔭142 7 | 8 | # Testing, QA 9 | JoKu 10 | Danp142 11 | John Birdflu -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/retropassdev/RetroPass/HEAD/RetroPass/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /Docs/v1.5/RetroPass.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | LaunchBox 6 | ./LaunchBox 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Docs/v1.6/RetroPass.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Removable Drive 6 | LaunchBox 7 | ./LaunchBox 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Docs/SettingsLogging.md: -------------------------------------------------------------------------------- 1 | # Settings - Logging 2 | 3 | ![](/Docs/settings_log.png) 4 | 5 | 1. Go to Settings -> Logging and check **Enable Logging**. 6 | 2. Quit RetroPass and start it again. 7 | 3. Go to Settings -> Logging. 8 | 4. View log, scroll up and down and notice yellow warning and red error log entries. 9 | 5. Log file is also generated in the local RetroPass folder on Xbox which you can access through Xbox Device Portal. 10 | 11 | Make sure to **turn off** logging after troubleshooting, because writing to a log file slows down app performance. 12 | -------------------------------------------------------------------------------- /Docs/SetupPPSSPP.md: -------------------------------------------------------------------------------- 1 | # PPSSPP 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. Application Path doesn't have to point to real application. It's enough to just input **ppsspp**. 8 | 9 | ![](/Docs/setup_ppsspp_edit_emulator.png) 10 | 11 | 4. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with PPSPP. If "Default Emulator" is not checked, then RetroArch is used instead. 12 | 13 | ![](/Docs/setup_ppsspp_associated_platforms.png) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Docs/SetupRetriXGold.md: -------------------------------------------------------------------------------- 1 | # RetriX Gold 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. Don't worry about the Application Path parameter. It's enough to just input **RetriX.UWP.exe** 8 | 9 | ![](/Docs/setup_retrixgold_edit_emulator.png) 10 | 11 | 4. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with RetriX Gold. If "Default Emulator" is not checked, then RetroArch is used instead. 12 | 13 | ![](/Docs/setup_retrixgold_associated_platforms.png) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Docs/SetupDuckStation.md: -------------------------------------------------------------------------------- 1 | # DuckStation 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. Application Path doesn't have to point to real application. It's enough to just input **duckstation**. 8 | 9 | ![](/Docs/setup_duckstation_edit_emulator.png) 10 | 11 | 4. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with DuckStation. If "Default Emulator" is not checked, then RetroArch is used instead. 12 | 13 | ![](/Docs/setup_duckstation_associated_platforms.png) 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Temp/Job.md: -------------------------------------------------------------------------------- 1 | ## Request from retropassdev: I'm currently looking for a job. 2 | 3 | Some details about my qualification: 4 | 5 | - over a decade of experience with Unity in various areas of the engine 6 | - 1 year of experience with Unreal Engine 5 rendering pipeline 7 | - contributed to more than 5 released products/games of small to moderate size 8 | - comfortable with C, C++, C# languages 9 | 10 | Looking for: 11 | 12 | - preferably, a serious full time job opportunity or 13 | - a contract work of significant duration, 3 months minimum 14 | 15 | If you need a mid-senior programmer/game developer, contact me at retropassdev@gmail.com 16 | 17 | Thank you,
18 | retropassdev 19 | -------------------------------------------------------------------------------- /Docs/SetupDolphin.md: -------------------------------------------------------------------------------- 1 | # Dolphin 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. Application Path doesn't have to point to real application. It's enough to just input something like: 8 | * **dolphin.exe** 9 | * **/random_path/dolphin.exe** 10 | 11 |
![](/Docs/setup_dolphin_edit_emulator.png) 12 | 13 | 4. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with Dolphin. If "Default Emulator" is not checked, then RetroArch is used instead. 14 | 15 | ![](/Docs/setup_dolphin_associated_platforms.png) 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /RetroPass/App.xaml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Docs/SetupXBSX2.md: -------------------------------------------------------------------------------- 1 | # XBSX2 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. Application Path doesn't have to point to real application. It's enough to just input something like: 8 | * **xbsx2.exe** 9 | * **/random_path/xbsx2.exe** 10 | * **pcsx2.exe** 11 | * **/random_path/pcsx2.exe** 12 | 13 | 14 |
![](/Docs/setup_xbsx2_edit_emulator.png) 15 | 16 | 4. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with XBSX2. If "Default Emulator" is not checked, then RetroArch is used instead. 17 | 18 | ![](/Docs/setup_xbsx2_associated_platforms.png) 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Docs/SetupXeniaCanary.md: -------------------------------------------------------------------------------- 1 | # Xenia Canary 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. Application Path doesn't have to point to real application. It's enough to just input: 8 | * **xenia-canary.exe** 9 | * **/random_path/xenia-canary.exe** 10 | * **xeniacanary.exe** 11 | * **/random_path/xeniacanary.exe** 12 | 13 |
![](/Docs/setup_xeniacanary_edit_emulator.png) 14 | 15 | 4. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with Xenia Canary. If "Default Emulator" is not checked, then RetroArch is used instead. 16 | 17 | ![](/Docs/setup_xeniacanary_associated_platforms.png) 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /RetroPass/Resources/Themes/ThemeDefault/CommonDefault.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Runtime.InteropServices.WindowsRuntime; 6 | using Windows.Foundation; 7 | using Windows.Foundation.Collections; 8 | using Windows.UI.Xaml; 9 | using Windows.UI.Xaml.Controls; 10 | using Windows.UI.Xaml.Controls.Primitives; 11 | using Windows.UI.Xaml.Data; 12 | using Windows.UI.Xaml.Input; 13 | using Windows.UI.Xaml.Media; 14 | using Windows.UI.Xaml.Navigation; 15 | 16 | // The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 17 | 18 | namespace RetroPass.Resources.Themes.ThemeDefault 19 | { 20 | /// 21 | /// An empty page that can be used on its own or navigated to within a Frame. 22 | /// 23 | public sealed partial class CommonDefault 24 | { 25 | public CommonDefault() 26 | { 27 | this.InitializeComponent(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /RetroPass/PlayLaterControl.xaml.cs: -------------------------------------------------------------------------------- 1 | using Windows.UI.Xaml; 2 | using Windows.UI.Xaml.Controls; 3 | 4 | // The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236 5 | 6 | namespace RetroPass 7 | { 8 | public sealed partial class PlayLaterControl : UserControl 9 | { 10 | public PlayLaterControl() 11 | { 12 | this.InitializeComponent(); 13 | } 14 | 15 | public void UpdatePlayLaterControl(PlaylistItem playlistItem, PlaylistPlayLater playlistPlayLater) 16 | { 17 | if (playlistPlayLater != null && playlistItem != null) 18 | { 19 | OverlayPlayLater.Visibility = Visibility.Visible; 20 | 21 | if (playlistPlayLater.GameExists(playlistItem)) 22 | { 23 | StatusText.Text = "Remove from Play later"; 24 | } 25 | else 26 | { 27 | StatusText.Text = "Add to Play later"; 28 | } 29 | } 30 | else 31 | { 32 | OverlayPlayLater.Visibility = Visibility.Collapsed; 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Docs/SetupLaunchBox.md: -------------------------------------------------------------------------------- 1 | # Setup with LaunchBox 2 | 3 | 1. **IMPORTANT!!!** Install LaunchBox **directly to external storage**. If you install LaunchBox to a folder on your PC instead and then move it to external storage, configuration will be invalid and you'll get an empty library in RetroPass. 4 | 1. Configure any of the following emulators in LaunchBox: 5 | - [RetroArch](/Docs/SetupRetroArch.md) 6 | - [RetriX Gold](/Docs/SetupRetriXGold.md) 7 | - [Dolphin](/Docs/SetupDolphin.md) 8 | - [XBSX2](/Docs/SetupXBSX2.md) 9 | - [Xenia Canary](/Docs/SetupXeniaCanary.md) 10 | - [PPSSPP](/Docs/SetupPPSSPP.md) 11 | - [DuckStation](/Docs/SetupDuckStation.md) 12 | 1. [Import games](/Docs/SetupLaunchBoxImport.md). 13 | 1. If you want to specify the order of your playlists, platforms and games, you can do so by checking the [LaunchBox playlists, platforms and games sorting](/Docs/SetupLaunchBoxSorting.md) section. 14 | 1. At this point setup is finished. Connect external storage to Xbox and start RetroPass. Follow [Add DataSource](/Docs/SettingsDataSources.md) section. 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /RetroPass/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // General Information about an assembly is controlled through the following 5 | // set of attributes. Change these attribute values to modify the information 6 | // associated with an assembly. 7 | [assembly: AssemblyTitle("RetroPass")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("RetroPass")] 12 | [assembly: AssemblyCopyright("Copyright © 2021")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // Version information for an assembly consists of the following four values: 17 | // 18 | // Major Version 19 | // Minor Version 20 | // Build Number 21 | // Revision 22 | // 23 | // You can specify all the values or you can default the Build and Revision Numbers 24 | // by using the '*' as shown below: 25 | // [assembly: AssemblyVersion("1.0.*")] 26 | [assembly: AssemblyVersion("1.0.0.0")] 27 | [assembly: AssemblyFileVersion("1.0.0.0")] 28 | [assembly: ComVisible(false)] -------------------------------------------------------------------------------- /Docs/SetupRetroArch.md: -------------------------------------------------------------------------------- 1 | # RetroArch 2 | 3 | ## Setup with LaunchBox 4 | 5 | 1. Open LaunchBox 6 | 2. Go to **Tools -> Manage... -> Emulators** 7 | 3. Click **Add** to add an emulator. 8 | 4. In **Emulator Name** dropdown choose **Retroarch**. 9 | 5. **Application Path** doesn't have to point to real application. It's enough to just input **retroarch**. 10 | 11 | ![](/Docs/setup_retroarch_edit_emulator.png) 12 | 13 | 6. Click **Associated Platforms**, and make sure "Default Emulator" checkbox is checked for platforms which should be started with Retroarch. 14 | 15 | ![](/Docs/setup_retroarch_associated_platforms.png) 16 | 17 | 7. Optionally, if you need to set up a different core for a game, go to Launchbox, select the game, open "Edit Metadata/Media" and modify command line under Emulation. 18 | 19 | ![](/Docs/core_per_game.png) 20 | 21 | 8. For seamless experience, it is recommended to setup a hotkey for quitting RetroArch. When content is started from RetroPass, once user exits RetroArch either with the hotkey or through the menu, it will immediately return to RetroPass. 22 | 23 | ![](/Docs/setup_retroarch_quit_hotkey.png) -------------------------------------------------------------------------------- /RetroPass/SettingsPages/SettingsLogPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.Storage; 3 | using Windows.UI.Xaml; 4 | using Windows.UI.Xaml.Controls; 5 | using Windows.UI.Xaml.Navigation; 6 | 7 | namespace RetroPass.SettingsPages 8 | { 9 | public sealed partial class SettingsLogPage : Page 10 | { 11 | public SettingsLogPage() 12 | { 13 | this.InitializeComponent(); 14 | } 15 | 16 | protected override void OnNavigatedTo(NavigationEventArgs e) 17 | { 18 | EnableLoggingCheckBox.IsChecked = (bool)ApplicationData.Current.LocalSettings.Values[App.SettingsLoggingEnabled]; 19 | base.OnNavigatedTo(e); 20 | } 21 | 22 | private async void EnableLoggingCheckBox_Checked(object sender, RoutedEventArgs e) 23 | { 24 | ApplicationData.Current.LocalSettings.Values[App.SettingsLoggingEnabled] = true; 25 | await LogPage.SetLogging(); 26 | 27 | LogFrame.Navigate(typeof(LogPage)); 28 | } 29 | 30 | private async void EnableLoggingCheckBox_Unchecked(object sender, RoutedEventArgs e) 31 | { 32 | ApplicationData.Current.LocalSettings.Values[App.SettingsLoggingEnabled] = false; 33 | await LogPage.SetLogging(); 34 | LogFrame.Content = null; 35 | } 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /RetroPass/Utils.cs: -------------------------------------------------------------------------------- 1 | using Windows.UI.Xaml.Media; 2 | using Windows.UI.Xaml; 3 | 4 | namespace RetroPass 5 | { 6 | public class Utils 7 | { 8 | public static T FindChild(DependencyObject parent, string childName) where T : DependencyObject 9 | { 10 | if (parent == null) return null; 11 | T foundChild = null; 12 | int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 13 | 14 | for (int i = 0; i < childrenCount; i++) 15 | { 16 | var child = VisualTreeHelper.GetChild(parent, i); 17 | T childType = child as T; 18 | 19 | if (childType == null) 20 | { 21 | foundChild = FindChild(child, childName); 22 | if (foundChild != null) break; 23 | } 24 | else if (!string.IsNullOrEmpty(childName)) 25 | { 26 | var frameworkElement = child as FrameworkElement; 27 | if (frameworkElement != null && frameworkElement.Name == childName) 28 | { 29 | foundChild = (T)child; 30 | break; 31 | } 32 | 33 | foundChild = FindChild(child, childName); 34 | if (foundChild != null) break; 35 | } 36 | else 37 | { 38 | foundChild = (T)child; 39 | break; 40 | } 41 | } 42 | 43 | return foundChild; 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /RetroPass/SettingsPages/SettingsLogPage.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Docs/SetupLaunchBoxSorting.md: -------------------------------------------------------------------------------- 1 | # LaunchBox playlists, platforms and games sorting 2 | 3 | ## Playlists and platforms sorting 4 | 5 | If you wish to override default alphabetic sorting of **platforms and playlists**, provide **Sort Title** parameter. For example, in the following screenshots: 6 | - **Pinball** playlist **Sort Title** is set to **1** 7 | - **Nintendo Entertainment System** platform **Sort Title** is set to **2** 8 | 9 | When imported in RetroPass, **Pinball** is shown first, **Nintendo Entertainment System** second, followed by all the other playlists and platforms shown in alphabetical order. For example, if **Pinball** playlist **Sort Title** is set to **B_Pinball**, it is sorted with other playlists that start with the letter **B**. 10 |
11 |
12 | ![](/Docs/setup_sort_playlist.png) 13 |
14 |
15 | ![](/Docs/setup_sort_platform.png) 16 | 17 | ## Games sorting 18 | If you wish to override default alphabetic sorting of **games** within a platform playlist, provide **Sort Title** parameter in **Edit Game** dialog. For example: 19 | - **Lotus Turbo Challenge 2** in **Amiga** platform playlist normally shows under games starting with L letter. Setting **Sort Title** to **000_Lotus_Turbo_Challenge_2** will show it as first or one of the first games in the **Amiga** platform playlist. 20 | 21 | ![](/Docs/setup_sort_games.png) 22 | -------------------------------------------------------------------------------- /RetroPass/Properties/Default.rd.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Docs/SetupLaunchBoxImport.md: -------------------------------------------------------------------------------- 1 | # Setup with LaunchBox - Import Games 2 | 3 | 1. Open LaunchBox 4 | 1. Go to **Tools -> Import -> Rom Files...** 5 | 1. Click **Add Folder** or **Add Files** 6 | 7 | ![](/Docs/setup_launchbox_import_add.png) 8 | 9 | 1. Choose a platform for which you are importing games. 10 | 11 | ![](/Docs/setup_launchbox_import_platform.png) 12 | 13 | 1. Choose an emulator configured in step 2. 14 | 15 | ![](/Docs/setup_launchbox_import_emulator.png) 16 | 17 | 1. Choose to copy or move files into LaunchBox games folder 18 | 19 | ![](/Docs/setup_launchbox_import_copy.png) 20 | 21 | 1. **IMPORTANT!!!** When importing your games, LaunchBox asks you to select which media type to download. If you are using LaunchBox just to configure RetroPass, there is no need to download all the media types because RetroPass needs only a subset. It will speed up your setup process and it will make less burden on LaunchBox database. You only need to check these media types: 22 | - "Box - Front" 23 | - "Screenshot - Game Title" 24 | - "Screenshot - Gameplay" 25 | - "Screenshot - Game Select" 26 | - "Video" 27 | 28 |
![](/Docs/media_types.png) 29 | 1. After content is imported, Click **Finish**. 30 | 1. At this point setup is finished. Connect external storage to Xbox and start RetroPass. Follow [Add DataSource](/Docs/SettingsDataSources.md) section. -------------------------------------------------------------------------------- /Docs/SettingsDataSources.md: -------------------------------------------------------------------------------- 1 | # Settings - Sources 2 | 3 | 1. If you didn't set up RetroPass before, you need to add a data source. 4 | 5 | ![](/Docs/settings_first_run.png) 6 | 7 | 1. Navigate to your LaunchBox or EmulationStation directory on external storage an click **Select** button. 8 | 9 | ![](/Docs/settings_data_source_choose.png) 10 | 11 | 1. Set the name of this data source and click **Add** button 12 | 13 | ![](/Docs/settings_data_source_add.png) 14 | 15 | 1. RetroPass configuration file is automatically saved and added to the list of data sources. If your external drive is not formated to NTFS, configuration file might not be saved properly and in that case, you will need to create RetroPass.xml file manually. 16 | 17 | ![](/Docs/settings_data_source_activate.png) 18 | 1. Click **Activate** button and then Back 19 | 1. You should see a list of platforms and content. 20 | 21 | **Delete Cache** deletes all cached thumbnails, but also removes data sources that are **Unavailable**. 22 | 23 | 24 | ## Advanced Setup - Multiple Data Sources 25 | 26 | RetroPass can be configured with more than one LaunchBox or EmulationStation data source. Here are a few example scenarios where you might find this setup useful: 27 | * You would like to connect two or more external storages. You have one USB stick that doesn't have enough free space and contains only a subset of your games. You also have a larger SSD where you keep the rest of your game collection. 28 | * You have a single SSD where you keep all your games. You would like to separate those into two data sources. One data source contains all your games and another one only games which are appropriate for players of all ages. 29 | 30 | For more information go to [Setup multiple data sources](/Docs/SetupMultipleDataSources.md) 31 | -------------------------------------------------------------------------------- /RetroPass/ThemeManager.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using Windows.Storage; 6 | using Windows.Storage.Search; 7 | using Windows.UI.Xaml; 8 | using Windows.UI.Xaml.Controls; 9 | using Windows.UI.Xaml.Markup; 10 | 11 | namespace RetroPass 12 | { 13 | public class ThemeManager 14 | { 15 | public bool IsInitialized { get; private set; } 16 | public ElementTheme CurrentMode { get; private set; } 17 | public Action ThemeInitialization_Finished; 18 | 19 | private static ThemeManager instance = null; 20 | 21 | public static ThemeManager Instance 22 | { 23 | get 24 | { 25 | if (instance == null) 26 | { 27 | instance = new ThemeManager(); 28 | } 29 | return instance; 30 | } 31 | } 32 | 33 | public IEnumerable GetModeNames() 34 | { 35 | return Enum.GetNames(typeof(ElementTheme)); 36 | } 37 | 38 | public void Init() 39 | { 40 | ChangeMode(ApplicationData.Current.LocalSettings.Values[App.SettingsMode] as string); 41 | IsInitialized = true; 42 | ThemeInitialization_Finished?.Invoke(); 43 | } 44 | 45 | public void ChangeMode(string mode) 46 | { 47 | if (Enum.GetNames(typeof(ElementTheme)).Contains(mode)) 48 | { 49 | ElementTheme requestedMode = (ElementTheme)Enum.Parse(typeof(ElementTheme), mode); 50 | 51 | //if the mode is different from current mode and string value matches 52 | if (Window.Current.Content is FrameworkElement frameworkElement && frameworkElement.RequestedTheme != requestedMode) 53 | { 54 | frameworkElement.RequestedTheme = requestedMode; 55 | CurrentMode = requestedMode; 56 | ApplicationData.Current.LocalSettings.Values[App.SettingsMode] = mode; 57 | } 58 | } 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /RetroPass/PlayLaterControl.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 29 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /RetroPass/StorageUtils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.IO; 4 | using System.Threading.Tasks; 5 | using Windows.Storage; 6 | 7 | namespace RetroPass 8 | { 9 | public class StorageUtils 10 | { 11 | public static async Task GetFileAsync(StorageFolder storageFolder, string fileName) 12 | { 13 | try 14 | { 15 | Trace.TraceInformation("StorageUtils: GetFileAsync: {0} {1}", storageFolder.Path, fileName); 16 | var file = await storageFolder.GetFileAsync(fileName); 17 | return file; 18 | } 19 | catch (Exception e) 20 | { 21 | Trace.TraceError("StorageUtils: GetFileAsync FAIL: {0} {1}", storageFolder.Path, fileName); 22 | Trace.TraceError(e.Message); 23 | return null; 24 | } 25 | } 26 | 27 | public static async Task GetFileFromPathAsync(string path) 28 | { 29 | try 30 | { 31 | Trace.TraceInformation("StorageUtils: GetFolderFromPathAsync: {0}", path); 32 | var file = await StorageFile.GetFileFromPathAsync(path); 33 | return file; 34 | } 35 | catch (Exception e) 36 | { 37 | Trace.TraceError("StorageUtils: GetFolderFromPathAsync FAIL: {0}", path); 38 | Trace.TraceError(e.Message); 39 | return null; 40 | } 41 | } 42 | 43 | public static async Task GetFolderFromPathAsync(string path) 44 | { 45 | try 46 | { 47 | Trace.TraceInformation("StorageUtils: GetFolderFromPathAsync: {0}", path); 48 | var folder = await StorageFolder.GetFolderFromPathAsync(path); 49 | return folder; 50 | } 51 | catch (Exception e) 52 | { 53 | 54 | Trace.TraceError("StorageUtils: GetFolderFromPathAsync FAIL: {0}", path); 55 | Trace.TraceError(e.Message); 56 | return null; 57 | } 58 | } 59 | 60 | public static string NormalizePath(string path) 61 | { 62 | return Path.GetFullPath(new Uri(path).LocalPath) 63 | .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) 64 | .ToUpperInvariant(); 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Docs/SettingsPersonalization.md: -------------------------------------------------------------------------------- 1 | # Settings - Personalization 2 | 3 | ![](/Docs/settings_personalization.png) 4 | 5 | - **Mode** - Choose light or dark mode for UI. 6 | * **System** - use default Xbox theme 7 | * **Dark** - override Xbox theme, use dark mode 8 | * **Light** - override Xbox theme, use light mode 9 | - **Main Page Layout** 10 | * **Fixed** - Predefined width and height of items on the main page. 11 |
![](/Docs/layout_menu_fixed.png) 12 | * **Original Aspect** - Variable width, predefined height. The list becomes horizontally scrollable, up to 5 items. 13 | ![](/Docs/layout_menu_original.png) 14 | - **Collection Page Layout** 15 | * **Fixed** - Predefined width and height of items on platform collection page. 16 |
![](/Docs/layout_collection_fixed.png) 17 | * **Original Aspect** - Variable width, predefined height, variable space between items. The number of items in a row is automatically determined by the width of the first image in the collection. 18 | ![](/Docs/layout_collection_original.png) 19 | * **Group Aspect** - Variable width, predefined height, fixed space between items. The number of items in a row is predefined by the aspect ratio, utilizing row space as best as possible. In general, Group Aspect may display the same or more images in a row when compared to Original Aspect. 20 | ![](/Docs/layout_collection_group.png) 21 | - **Collection Image Stretch** 22 | * **Uniform** - Fill by width, preserving aspect ratio. It can result in some empty space at the bottom of the area if the image aspect ratio is not the same as item aspect ratio. 23 |
![](/Docs/layout_collection_stretch_uniform.png) 24 | * **Fill** - Fill the whole area. Changes image aspect ratio. Images may look stretched. 25 | ![](/Docs/layout_collection_stretch_fill.png) 26 | * **Uniform To Fill** - Fill the whole area, preserving aspect ratio. Images may be zoomed in, cropping edge parts. 27 | ![](/Docs/layout_collection_stretch_uniform_to_fill.png) 28 | - **Auto Play Video** - If checked, automatically plays a video when content is selected. 29 | - **Play Full Screen Video** - If checked, plays larger game video. 30 | - **Mute Video** 31 | * **None** - Never mute video. 32 | * **On Auto Play** - Mute video only on auto play. If video is paused and then started manually, it plays the sound. 33 | * **Always** - Always mute video. 34 | 35 | -------------------------------------------------------------------------------- /RetroPass/LogPage.xaml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 31 | 32 | 33 | 35 | 36 | 37 | 38 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /RetroPass/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | RetroPass 11 | RetroPass 12 | Assets\StoreLogo.png 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | retropass 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /RetroPass/SettingsPages/SettingsPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using RetroPass.SettingsPages; 2 | using Windows.ApplicationModel; 3 | using Windows.UI.Core; 4 | using Windows.UI.Xaml; 5 | using Windows.UI.Xaml.Navigation; 6 | using Windows.UI.Xaml.Controls; 7 | 8 | namespace RetroPass 9 | { 10 | public sealed partial class SettingsPage : Page 11 | { 12 | DataSourceManager dataSourceManager; 13 | string AppVersion { get; set; } 14 | 15 | public SettingsPage() 16 | { 17 | var version = Package.Current.Id.Version; 18 | 19 | AppVersion = string.Format("v{0}.{1}.{2}", version.Major, version.Minor, version.Build); 20 | InitializeComponent(); 21 | Loaded += SettingsPage_Loaded; 22 | } 23 | 24 | private void SettingsPage_Loaded(object sender, RoutedEventArgs e) 25 | { 26 | //remove shadow on navigation view 27 | SplitView content = Utils.FindChild(NavigationViewSettings, "RootSplitView"); 28 | if (content != null) 29 | { 30 | content.Pane.Translation = new System.Numerics.Vector3(0, 0, 0); 31 | } 32 | } 33 | 34 | //on windows, windows key + backspace 35 | private void OnBackRequested(object sender, BackRequestedEventArgs e) 36 | { 37 | if (Frame.CanGoBack) 38 | { 39 | Frame.GoBack(); 40 | e.Handled = true; 41 | } 42 | } 43 | 44 | protected override void OnNavigatedTo(NavigationEventArgs e) 45 | { 46 | dataSourceManager = e.Parameter as DataSourceManager; 47 | SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested; 48 | base.OnNavigatedTo(e); 49 | //select sources as default 50 | NavigationViewSettings.SelectedItem = NavigationViewSettings.MenuItems[0]; 51 | } 52 | 53 | protected override void OnNavigatedFrom(NavigationEventArgs e) 54 | { 55 | SystemNavigationManager.GetForCurrentView().BackRequested -= OnBackRequested; 56 | base.OnNavigatedFrom(e); 57 | } 58 | 59 | private void NavigationViewSettings_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args) 60 | { 61 | var item = args.SelectedItem as NavigationViewItem; 62 | string navTo = item.Tag.ToString(); 63 | 64 | if (navTo != null) 65 | { 66 | switch (navTo) 67 | { 68 | case "SettingsPageDataSource": 69 | ContentFrame.Navigate(typeof(SettingsDataSourcePage), dataSourceManager); 70 | break; 71 | 72 | case "SettingsPagePersonalization": 73 | ContentFrame.Navigate(typeof(SettingsPersonalizationPage)); 74 | break; 75 | 76 | case "SettingsPageLogging": 77 | ContentFrame.Navigate(typeof(SettingsLogPage)); 78 | break; 79 | } 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /RetroPass.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.28307.1525 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RetroPass", "RetroPass\RetroPass.csproj", "{674D331B-19AD-4E76-8D83-0F0473BC4F22}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|ARM = Debug|ARM 11 | Debug|ARM64 = Debug|ARM64 12 | Debug|x64 = Debug|x64 13 | Debug|x86 = Debug|x86 14 | Release|ARM = Release|ARM 15 | Release|ARM64 = Release|ARM64 16 | Release|x64 = Release|x64 17 | Release|x86 = Release|x86 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|ARM.ActiveCfg = Debug|ARM 21 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|ARM.Build.0 = Debug|ARM 22 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|ARM.Deploy.0 = Debug|ARM 23 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|ARM64.ActiveCfg = Debug|ARM64 24 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|ARM64.Build.0 = Debug|ARM64 25 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|ARM64.Deploy.0 = Debug|ARM64 26 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|x64.ActiveCfg = Debug|x64 27 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|x64.Build.0 = Debug|x64 28 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|x64.Deploy.0 = Debug|x64 29 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|x86.ActiveCfg = Debug|x86 30 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|x86.Build.0 = Debug|x86 31 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Debug|x86.Deploy.0 = Debug|x86 32 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|ARM.ActiveCfg = Release|ARM 33 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|ARM.Build.0 = Release|ARM 34 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|ARM.Deploy.0 = Release|ARM 35 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|ARM64.ActiveCfg = Release|ARM64 36 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|ARM64.Build.0 = Release|ARM64 37 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|ARM64.Deploy.0 = Release|ARM64 38 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|x64.ActiveCfg = Release|x64 39 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|x64.Build.0 = Release|x64 40 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|x64.Deploy.0 = Release|x64 41 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|x86.ActiveCfg = Release|x86 42 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|x86.Build.0 = Release|x86 43 | {674D331B-19AD-4E76-8D83-0F0473BC4F22}.Release|x86.Deploy.0 = Release|x86 44 | EndGlobalSection 45 | GlobalSection(SolutionProperties) = preSolution 46 | HideSolutionNode = FALSE 47 | EndGlobalSection 48 | GlobalSection(ExtensibilityGlobals) = postSolution 49 | SolutionGuid = {DF7679BD-8D27-4C56-B7FD-3BA4EACA5A1E} 50 | EndGlobalSection 51 | EndGlobal 52 | -------------------------------------------------------------------------------- /RetroPass/Platform.cs: -------------------------------------------------------------------------------- 1 | using System.Xml.Serialization; 2 | using Windows.Storage; 3 | 4 | namespace RetroPass 5 | { 6 | public class Platform 7 | { 8 | public enum EEmulatorType 9 | { 10 | retroarch, 11 | rgx, 12 | xbsx2, 13 | dolphin, 14 | xenia, 15 | xeniacanary, 16 | ppsspp, 17 | duckstation, 18 | } 19 | public string Name { get; set; } 20 | public string SourceName { get; set; } 21 | public EEmulatorType EmulatorType { get; set; } 22 | public string BoxFrontPath { get; set; } 23 | public string ScreenshotGameTitlePath { get; set; } 24 | public string ScreenshotGameplayPath { get; set; } 25 | public string ScreenshotGameSelectPath { get; set; } 26 | public string VideoPath { get; set; } 27 | 28 | [XmlIgnoreAttribute] 29 | public StorageFolder BoxFrontFolder { get; set; } 30 | 31 | public void SetEmulatorType(string emulatorPath) 32 | { 33 | /*if((string.IsNullOrEmpty(emulatorPath) == false && emulatorPath.Contains("retroarch", System.StringComparison.InvariantCultureIgnoreCase)) 34 | { 35 | EmulatorType = EEmulatorType.retroarch; 36 | } 37 | else */ 38 | if (string.IsNullOrEmpty(emulatorPath) == false && 39 | (emulatorPath.Contains("pcsx2", System.StringComparison.CurrentCultureIgnoreCase) || 40 | emulatorPath.Contains("xbsx2", System.StringComparison.CurrentCultureIgnoreCase)) 41 | ) 42 | { 43 | EmulatorType = EEmulatorType.xbsx2; 44 | } 45 | else if (string.IsNullOrEmpty(emulatorPath) == false && emulatorPath.Contains("retrix", System.StringComparison.CurrentCultureIgnoreCase)) 46 | { 47 | EmulatorType = EEmulatorType.rgx; 48 | } 49 | else if (string.IsNullOrEmpty(emulatorPath) == false && emulatorPath.Contains("dolphin", System.StringComparison.CurrentCultureIgnoreCase)) 50 | { 51 | EmulatorType = EEmulatorType.dolphin; 52 | } 53 | else if (string.IsNullOrEmpty(emulatorPath) == false && 54 | (emulatorPath.Contains("xenia-canary", System.StringComparison.CurrentCultureIgnoreCase) || 55 | emulatorPath.Contains("xeniacanary", System.StringComparison.CurrentCultureIgnoreCase)) 56 | ) 57 | { 58 | EmulatorType = EEmulatorType.xeniacanary; 59 | } 60 | else if (string.IsNullOrEmpty(emulatorPath) == false && emulatorPath.Contains("xenia", System.StringComparison.CurrentCultureIgnoreCase)) 61 | { 62 | EmulatorType = EEmulatorType.xenia; 63 | } 64 | else if (string.IsNullOrEmpty(emulatorPath) == false && emulatorPath.Contains("ppsspp", System.StringComparison.CurrentCultureIgnoreCase)) 65 | { 66 | EmulatorType = EEmulatorType.ppsspp; 67 | } 68 | else if (string.IsNullOrEmpty(emulatorPath) == false && emulatorPath.Contains("duckstation", System.StringComparison.CurrentCultureIgnoreCase)) 69 | { 70 | EmulatorType = EEmulatorType.duckstation; 71 | } 72 | else 73 | { 74 | //let it just be default retroarch 75 | EmulatorType = EEmulatorType.retroarch; 76 | } 77 | } 78 | 79 | public Platform Copy() 80 | { 81 | return (Platform)this.MemberwiseClone(); 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /RetroPass/Playlist.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Collections.ObjectModel; 3 | using System.Linq; 4 | using Windows.Storage; 5 | 6 | namespace RetroPass 7 | { 8 | public class Playlist 9 | { 10 | public string Name { get; set; } 11 | public ObservableCollection PlaylistItems { get; set; } = new ObservableCollection(); 12 | public ObservableCollection PlaylistItemsLandingPage { get; set; } = new ObservableCollection(); 13 | 14 | public PlaylistItem AddPlaylistItem(Game game) 15 | { 16 | PlaylistItem playlistItem = new PlaylistItem(); 17 | playlistItem.playlist = this; 18 | playlistItem.game = game; 19 | PlaylistItems.Add(playlistItem); 20 | return playlistItem; 21 | } 22 | 23 | public void ClearLastPlayedSettings() 24 | { 25 | ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 26 | localSettings.Values["LastPlayed" + Name] = ""; 27 | } 28 | 29 | public void UpdateGamesLandingPage() 30 | { 31 | //ClearLandingPage(); 32 | 33 | PlaylistItemsLandingPage.Clear(); 34 | 35 | List games = PlaylistItems.Take(5).ToList(); 36 | List lastPlayedGames = new List(); 37 | //check if there are some already played 38 | ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 39 | 40 | string lastPlayedStr = (string)localSettings.Values["LastPlayed" + Name]; 41 | 42 | if (string.IsNullOrEmpty(lastPlayedStr) == false) 43 | { 44 | string[] lastPlayed = lastPlayedStr.Split(";;;"); 45 | 46 | foreach (var title in lastPlayed) 47 | { 48 | PlaylistItem game = PlaylistItems.FirstOrDefault(t => t.game.Title == title); 49 | if (game != null) 50 | { 51 | lastPlayedGames.Add(game); 52 | } 53 | } 54 | } 55 | 56 | games = lastPlayedGames.Concat(games).Distinct().Take(5).ToList(); 57 | 58 | for (int i = 0; i < games.Count; i++) 59 | { 60 | //add item if there is none 61 | PlaylistItemsLandingPage.Add(games[i]); 62 | } 63 | } 64 | 65 | public void SetLastPlayed(PlaylistItem playlist) 66 | { 67 | List lastPlayedGames = new List(); 68 | 69 | ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings; 70 | string lastPlayedStr = (string)localSettings.Values["LastPlayed" + Name]; 71 | 72 | if (string.IsNullOrEmpty(lastPlayedStr) == false) 73 | { 74 | lastPlayedGames.AddRange(lastPlayedStr.Split(";;;")); 75 | lastPlayedGames.Insert(0, playlist.game.Title); 76 | lastPlayedGames = lastPlayedGames.Distinct().Take(5).ToList(); 77 | } 78 | else 79 | { 80 | lastPlayedGames.Insert(0, playlist.game.Title); 81 | } 82 | 83 | lastPlayedStr = string.Join(";;;", lastPlayedGames.ToArray()); 84 | localSettings.Values["LastPlayed" + Name] = lastPlayedStr; 85 | 86 | UpdateGamesLandingPage(); 87 | } 88 | 89 | public void Sort() 90 | { 91 | List sorted = PlaylistItems.OrderBy(t => t.game.Title).ToList(); 92 | for (int i = 0; i < sorted.Count(); i++) 93 | { 94 | PlaylistItems.Move(PlaylistItems.IndexOf(sorted[i]), i); 95 | } 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Docs/SetupEmulationStation.md: -------------------------------------------------------------------------------- 1 | # Setup with Emulation Station 2 | 3 | If you do not wish to use LaunchBox, it is also possible to create Emulation Station compatible metadata source. 4 | 5 | 1. Setup and configure Emulation Station to work with RetroArch, preferably directly on external storage. 6 | 7 | 2. Download all images, descriptions and videos. There are various scrapers that can download assets from various databases and output to Emulation Station gamelist.xml files 8 | 9 | 3. [Download](/Docs/v1.6/RetroPass.xml) Retropass configuration file and copy it to the root of external storage. 10 | 11 | 4. Edit **RetroPass.xml** configuration file. 12 | 13 | **\** points to Emulation Station directory on the external storage. Do not put absolute path like "E:\EmulationStation", because when external storage is plugged into Xbox, it might be recognized under a different letter. For example, if EmulationStation folder is in the root of external storage, then it should be configured like this: 14 | 15 | ```XML 16 | 17 | 18 | 19 | Games 20 | EmulationStation 21 | ./EmulationStation 22 | 23 | 24 | 25 | ``` 26 | 27 | 5. Check that **es_systems.cfg** file exists somewhere in the Emulation Station directory and that it has valid systems defined. i.e. 28 | - Ignore **\** property, it doesn't have to be properly set. 29 | - Make sure that **\** property for each system is properly configured. Paths are not important, as long as the core name is properly specified. RetroPass ignores everything in the command line except the core name. It knows how to properly pass it to RetroArch. 30 | - **\** is what is actually displayed in RetroPass as the name of the system. 31 | - In the example below, only relevant properties are shown: 32 | 33 | ```XML 34 | 35 | nes 36 | Nintendo Entertainment System 37 | -L %HOME%\\systems\nestopia_libretro.dll 38 | nes 39 | 40 | ``` 41 | 6. Setup **gamelist.xml** for every system: 42 | - **gamelist.xml** must be in its own directory which equals system's **\** defined in **es_systems.cfg**. For example, based on the example in step 3, it is expected that for NES, it should be **/nes/gamelist.xml**. 43 | - All paths defined in **\**, **\**, **\**, **\