diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000000..7242192251 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,40 @@ +# This is a basic workflow to help you get started with Actions + +name: Windows CI + +# Controls when the action will run. Triggers the workflow on push or pull request +# events but only for the master branch +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + build: + # The type of runner that the job will run on + runs-on: windows-2022 + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + # Submoudle + - name: Checkout Submodles + run: git submodule update --init --recursive + # Setup MSBuild For Later Usage + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v1.0.2 + with: + vs-version: '16.6.2' + # Run MSBuild + - name: Build Solution + run: msbuild "D:\a\dolphin-mpn-src\dolphin-mpn-src\Source\dolphin-emu.sln" /verbosity:minimal /property:Configuration=Release /property:Platform=x64 + # Upload Artifact + - name: Upload Build Artifact + uses: actions/upload-artifact@v2 + with: + name: DolphinMPN-win32 + path: D:\a\dolphin-mpn-src\dolphin-mpn-src\Binary\x64 diff --git a/Data/Sys/GameSettings/GMPE01.ini b/Data/Sys/GameSettings/GMPE01.ini index 1cd20fde22..b77cbb6231 100644 --- a/Data/Sys/GameSettings/GMPE01.ini +++ b/Data/Sys/GameSettings/GMPE01.ini @@ -123,6 +123,11 @@ $QOL - Automatically Advance Text Boxes [gamemasterplc] 04044A90 60000000 *Automatically scrolls the text boxes without pushing A +$QOL - Disable Advance on Results [gamemasterplc] +20446468 4182FF60 +04446468 4BFFFF60 +E2000001 80008000 + $QOL - Faster Boot Time [Ralf] 04056168 38607FFF *Automatically advance through the initial cutscences. @@ -429,3 +434,18 @@ $Minigame: Take a Breather - Mash Only L [gamemasterplc] 044207f0 38600000 e2000001 80008000 *Mash just L in the minigame Take a Breather. + +$Minigame Replacement - Bowser's Bigger Blast ➜ Chain Chomp Fever [Nora] +2818fd2c 00000027 +0218fd2c 00000025 +e2000001 80008000 + +$Minigame Replacement - Dungeon Duos ➜ The Great Deflate [Nora] +2818fd2c 0000001F +0218fd2c 00000018 +e2000001 80008000 + +$Minigame Replacement - Three Throw ➜ Mr. Blizzard's Brigade [Nora] +2818fd2c 00000009 +0218fd2c 0000000B +e2000001 80008000 diff --git a/Data/Sys/GameSettings/GP5E01.ini b/Data/Sys/GameSettings/GP5E01.ini index 39f95bb068..256ae9d2b8 100644 --- a/Data/Sys/GameSettings/GP5E01.ini +++ b/Data/Sys/GameSettings/GP5E01.ini @@ -474,6 +474,11 @@ A81F019C 7C001838 E0000000 80008000 *Automatically scrolls the text boxes without pushing A +$QOL - Disable Advance on Results [gamemasterplc] +20478F28 4182F754 +04478F1C 48000010 +E2000001 80008000 + $QOL - Faster Boot Time [gamemasterplc] F6000001 80008180 38610030 38800002 @@ -858,6 +863,11 @@ $Minigame Replacement - Scaldin' Cauldron ➜ Rain of Fire [gamemasterplc] 0222A4C4 0000003A E2000001 80008000 +$Minigame Replacement - Submarathon ➜ Defuse or Lose +2822a4c4 0000002F +0222a4c4 00000028 +e2000001 80008000 + $Minigame Replacement - Vicious Vending ➜ Coin Cache [gamemasterplc] 2822a4c4 00000017 0222a4c4 0000000f diff --git a/Data/Sys/GameSettings/GP6E01.ini b/Data/Sys/GameSettings/GP6E01.ini index 36948b9335..47eb810071 100644 --- a/Data/Sys/GameSettings/GP6E01.ini +++ b/Data/Sys/GameSettings/GP6E01.ini @@ -466,6 +466,11 @@ e2000001 80008000 E2000001 80008000 *Automatically advance through the initial cutscences. +$QOL - Disable Advance on Results [gamemasterplc] +20503FB0 41820054 +04503FB0 48000054 +E2000001 80008000 + $QOL - Increased Board Speed [Celerizer] 041556d4 7d170e70 042c31b4 41f00000 diff --git a/Data/Sys/GameSettings/GP7E01.ini b/Data/Sys/GameSettings/GP7E01.ini index 2686dc68f9..37ab3225a7 100644 --- a/Data/Sys/GameSettings/GP7E01.ini +++ b/Data/Sys/GameSettings/GP7E01.ini @@ -597,6 +597,11 @@ e2000001 80008000 e2000001 80008000 *Automatically advance through the initial cutscences. +$QOL - Disable Advance on Results [gamemasterplc] +204DF310 41820050 +044DF310 48000050 +E2000001 80008000 + $QOL - Increased Board Speed [gamemasterplc] 04160ad8 38030002 041604b0 38c0000a @@ -1033,6 +1038,13 @@ c21d8ed0 00000007 041d8f68 3aa00028 *(X) -> 40 Coins, 10 Coins -> 40 Coins, Half Coins -> 40 Coins, 2 Stars -> 1 Star +$Mechanics - Improved Duel Results #2 [Airsola +C21D8ED0 00000003 +2C030003 40820008 +38600001 7C711B78 +60000000 00000000 +*(X) -> 1/2 Coins + $Mechanics - Last 5 Turns Event Is Always x3 Coins on Spaces [gamemasterplc] 042311A8 38000000 diff --git a/Data/Sys/Maps/GFZE01.map b/Data/Sys/Maps/GFZE01.map deleted file mode 100644 index 464dba3610..0000000000 --- a/Data/Sys/Maps/GFZE01.map +++ /dev/null @@ -1,41 +0,0 @@ -.text -80003488 000000b8 80003488 0 __fill_mem -80003540 00000050 80003540 0 memcpy -8006cff8 0000004c 8006cff8 0 .LoadQuantizers -8006d044 0000002c 8006d044 0 .kill_infinites_helper -8006d070 00000018 8006d070 0 .kill_infinites -8006d088 0000002c 8006d088 0 .rsqrt -8006d0b4 00000034 8006d0b4 0 .sqrt_internal_fz -8006d0e8 00000030 8006d0e8 0 .rsqrt_internal_fz -8006d118 00000070 8006d118 0 .sqrt_fz -8006d188 00000030 8006d188 0 .wrapping_once_fp_lookup -8006d1b8 00000064 8006d1b8 0 .weird2 -8006d1c4 00000058 8006d1c4 0 .into_weird2 -8006d21c 00000030 8006d21c 0 .lookup_some_float_in_table_with_neg_wrap -8006d24c 00000184 8006d24c 0 .atan2 -8006d3d0 0000009c 8006d3d0 0 .asin_fz -8006d46c 000000c8 8006d46c 0 .acos_fz -8006d534 00000070 8006d534 0 .evil_vec_cosine -8006d5f0 00000078 8006d5f0 0 .evil_vec_setlength -8006d668 00000094 8006d668 0 .evil_vec_something -8006d6fc 0000005c 8006d6fc 0 .func -8006d784 0000002c 8006d784 0 .load_strange_matrix1 -8006d7b0 0000002c 8006d7b0 0 .load_strange_matrix2 -8006d7f4 0000003c 8006d7f4 0 .some_strange_destination -8006db30 00000044 8006db30 0 .push_matrix_3x3? -8006db74 00000038 8006db74 0 .write_top_3x3_matrix -8006dbe4 0000003c 8006dbe4 0 .read_current_3x3_matrix -8006dc20 00000014 8006dc20 0 .pop_matrix_stack -8006e424 00000074 8006e424 0 .weird_param_in_p1_p2 -8006e978 000001d4 8006e978 0 zz_006e978_ -8006eb4c 000001c0 8006eb4c 0 zz_006eb4c_ -8006f6a8 000000cc 8006f6a8 0 .z_last_skum_function -800798f0 000000ec 800798f0 0 __div2u -800799dc 00000138 800799dc 0 __div2i -80079b14 000000e0 80079b14 0 __mod2u -80079bf8 0000010c 80079bf8 0 __mod2i -80079d04 00000024 80079d04 0 __shl2i -80079d28 00000024 80079d28 0 __shr2u -80079d4c 00000028 80079d4c 0 __shr2i -8008596c 00000310 8008596c 0 big_matrix_trickery -80088538 00000020 80088538 0 zz_0088538_ diff --git a/Data/Sys/Maps/GMBE8P.map b/Data/Sys/Maps/GMBE8P.map deleted file mode 100644 index 7cbab7e984..0000000000 --- a/Data/Sys/Maps/GMBE8P.map +++ /dev/null @@ -1,34 +0,0 @@ -.text -800031f0 0000001c 800031f0 0 load_sp_rtoc -80007034 0000004c 80007034 0 .LoadQuantizers -80007080 00000030 80007080 0 .LoadInfinitiesEtc -800070b0 00000038 800070b0 0 .rsqrt -800070ec 00000040 800070ec 0 .sqrt_internal_needs_cr1 -8000712c 00000040 8000712c 0 .rsqrt_internal_needs_cr1 -800071e0 00000030 800071e0 0 .wrapping_once_fp_lookup -80007210 00000064 80007210 0 .weird2 -80007274 00000030 80007274 0 .lookup_some_float_in_table_with_neg_wrap -800072a4 00000180 800072a4 0 .atan2 -80007424 000000b8 80007424 0 .calls_sqrt -800074dc 0000005c 800074dc 0 .func -80007538 0000002c 80007538 0 .load_strange_matrix1 -80007564 0000002c 80007564 0 .load_strange_matrix3 -80007590 0000002c 80007590 0 .load_strange_matrix2 -80007834 00000044 80007834 0 .push_matrix_3x3? -80007878 00000038 80007878 0 .read_top_3x3matrix -800078b0 00000038 800078b0 0 .write_top_3x3_matrix -800078e8 0000003c 800078e8 0 .read_current_3x3_matrix -80007924 00000014 80007924 0 .pop_matrix_stack -80007a50 00000170 80007a50 0 .mult_matrix? -80007ecc 000000bc 80007ecc 0 .weird_vector_op_status_in_cr2 -80007f88 00000074 80007f88 0 .weird_param_in_p1_p2 -800080fc 00000078 800080fc 0 .evil_normalize -80008174 00000078 80008174 0 .evil_vec_setlength -800081ec 00000070 800081ec 0 .evil_vec_cosine -80008538 000000f0 80008538 0 .calls_evil1 -8000875c 00000088 8000875c 0 .another_caller -800087e4 0000008c 800087e4 0 .another_caller2 -80008d30 000001b4 80008d30 0 .another_caller3 -80036544 000001b4 80036544 0 .fctiwi_weird2 -8003dd1c 00000110 8003dd1c 0 .fctwi_weird -80043b48 000005bc 80043b48 0 .fctwi_weird3 diff --git a/Data/Sys/Themes/Mario Party Netplay/classic.png b/Data/Sys/Themes/Mario Party Netplay/classic.png new file mode 100644 index 0000000000..823adf588b Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/classic.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/config.png b/Data/Sys/Themes/Mario Party Netplay/config.png new file mode 100644 index 0000000000..60f2f5bba3 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/config.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/config@2x.png b/Data/Sys/Themes/Mario Party Netplay/config@2x.png new file mode 100644 index 0000000000..3ae361e4bd Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/config@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/fullscreen.png b/Data/Sys/Themes/Mario Party Netplay/fullscreen.png new file mode 100644 index 0000000000..f054b2e26a Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/fullscreen.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/fullscreen@2x.png b/Data/Sys/Themes/Mario Party Netplay/fullscreen@2x.png new file mode 100644 index 0000000000..b4c9a67a86 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/fullscreen@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/gradient.png b/Data/Sys/Themes/Mario Party Netplay/gradient.png new file mode 100644 index 0000000000..563aa98187 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/gradient.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/graphics.png b/Data/Sys/Themes/Mario Party Netplay/graphics.png new file mode 100644 index 0000000000..1368bfa583 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/graphics.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/graphics@2x.png b/Data/Sys/Themes/Mario Party Netplay/graphics@2x.png new file mode 100644 index 0000000000..9d5b7ef99d Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/graphics@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/open.png b/Data/Sys/Themes/Mario Party Netplay/open.png new file mode 100644 index 0000000000..be511045c6 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/open.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/open@2x.png b/Data/Sys/Themes/Mario Party Netplay/open@2x.png new file mode 100644 index 0000000000..74bf96edb6 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/open@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/pause.png b/Data/Sys/Themes/Mario Party Netplay/pause.png new file mode 100644 index 0000000000..d86c61bce2 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/pause.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/pause@2x.png b/Data/Sys/Themes/Mario Party Netplay/pause@2x.png new file mode 100644 index 0000000000..5e37d31f16 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/pause@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/play.png b/Data/Sys/Themes/Mario Party Netplay/play.png new file mode 100644 index 0000000000..24ff109725 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/play.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/play@2x.png b/Data/Sys/Themes/Mario Party Netplay/play@2x.png new file mode 100644 index 0000000000..66a3956d87 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/play@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/refresh.png b/Data/Sys/Themes/Mario Party Netplay/refresh.png new file mode 100644 index 0000000000..94effe6e9a Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/refresh.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/refresh@2x.png b/Data/Sys/Themes/Mario Party Netplay/refresh@2x.png new file mode 100644 index 0000000000..2c226637a7 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/refresh@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/screenshot.png b/Data/Sys/Themes/Mario Party Netplay/screenshot.png new file mode 100644 index 0000000000..e59a846f86 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/screenshot.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/screenshot@2x.png b/Data/Sys/Themes/Mario Party Netplay/screenshot@2x.png new file mode 100644 index 0000000000..cef81a14e8 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/screenshot@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/stop.png b/Data/Sys/Themes/Mario Party Netplay/stop.png new file mode 100644 index 0000000000..800dd355b1 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/stop.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/stop@2x.png b/Data/Sys/Themes/Mario Party Netplay/stop@2x.png new file mode 100644 index 0000000000..fac4444aa0 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/stop@2x.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/wifi.png b/Data/Sys/Themes/Mario Party Netplay/wifi.png new file mode 100644 index 0000000000..1c47de58e3 Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/wifi.png differ diff --git a/Data/Sys/Themes/Mario Party Netplay/wifi@2x.png b/Data/Sys/Themes/Mario Party Netplay/wifi@2x.png new file mode 100644 index 0000000000..cf0e9cdb7f Binary files /dev/null and b/Data/Sys/Themes/Mario Party Netplay/wifi@2x.png differ diff --git a/Data/Sys/Wii/btdinf.bak b/Data/Sys/Wii/btdinf.bak new file mode 100644 index 0000000000..8ad512e67d Binary files /dev/null and b/Data/Sys/Wii/btdinf.bak differ diff --git a/Data/Sys/Wii/clientca.pem b/Data/Sys/Wii/clientca.pem new file mode 100644 index 0000000000..b1321ea69d Binary files /dev/null and b/Data/Sys/Wii/clientca.pem differ diff --git a/Data/Sys/Wii/clientcakey.pem b/Data/Sys/Wii/clientcakey.pem new file mode 100644 index 0000000000..810c597d21 Binary files /dev/null and b/Data/Sys/Wii/clientcakey.pem differ diff --git a/Data/Sys/Wii/rootca.pem b/Data/Sys/Wii/rootca.pem new file mode 100644 index 0000000000..58e95b0640 Binary files /dev/null and b/Data/Sys/Wii/rootca.pem differ diff --git a/Data/Sys/Wii/shared1/00000000.app b/Data/Sys/Wii/shared1/00000000.app new file mode 100644 index 0000000000..58cd8e3ad0 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000000.app differ diff --git a/Data/Sys/Wii/shared1/00000001.app b/Data/Sys/Wii/shared1/00000001.app new file mode 100644 index 0000000000..25f846fb84 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000001.app differ diff --git a/Data/Sys/Wii/shared1/00000002.app b/Data/Sys/Wii/shared1/00000002.app new file mode 100644 index 0000000000..a2bf0d2344 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000002.app differ diff --git a/Data/Sys/Wii/shared1/00000003.app b/Data/Sys/Wii/shared1/00000003.app new file mode 100644 index 0000000000..b157517ad0 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000003.app differ diff --git a/Data/Sys/Wii/shared1/00000004.app b/Data/Sys/Wii/shared1/00000004.app new file mode 100644 index 0000000000..c05d8dc4df Binary files /dev/null and b/Data/Sys/Wii/shared1/00000004.app differ diff --git a/Data/Sys/Wii/shared1/00000005.app b/Data/Sys/Wii/shared1/00000005.app new file mode 100644 index 0000000000..4a114a5f0f Binary files /dev/null and b/Data/Sys/Wii/shared1/00000005.app differ diff --git a/Data/Sys/Wii/shared1/00000006.app b/Data/Sys/Wii/shared1/00000006.app new file mode 100644 index 0000000000..1d3e676ea6 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000006.app differ diff --git a/Data/Sys/Wii/shared1/00000007.app b/Data/Sys/Wii/shared1/00000007.app new file mode 100644 index 0000000000..0013676c29 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000007.app differ diff --git a/Data/Sys/Wii/shared1/00000008.app b/Data/Sys/Wii/shared1/00000008.app new file mode 100644 index 0000000000..08ea6d2037 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000008.app differ diff --git a/Data/Sys/Wii/shared1/00000009.app b/Data/Sys/Wii/shared1/00000009.app new file mode 100644 index 0000000000..d16acc346e Binary files /dev/null and b/Data/Sys/Wii/shared1/00000009.app differ diff --git a/Data/Sys/Wii/shared1/0000000a.app b/Data/Sys/Wii/shared1/0000000a.app new file mode 100644 index 0000000000..9acbb6bc03 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000000a.app differ diff --git a/Data/Sys/Wii/shared1/0000000b.app b/Data/Sys/Wii/shared1/0000000b.app new file mode 100644 index 0000000000..d2ed46d21f Binary files /dev/null and b/Data/Sys/Wii/shared1/0000000b.app differ diff --git a/Data/Sys/Wii/shared1/0000000c.app b/Data/Sys/Wii/shared1/0000000c.app new file mode 100644 index 0000000000..de029837c4 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000000c.app differ diff --git a/Data/Sys/Wii/shared1/0000000d.app b/Data/Sys/Wii/shared1/0000000d.app new file mode 100644 index 0000000000..05ec9f7d18 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000000d.app differ diff --git a/Data/Sys/Wii/shared1/0000000e.app b/Data/Sys/Wii/shared1/0000000e.app new file mode 100644 index 0000000000..11f26ff1d9 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000000e.app differ diff --git a/Data/Sys/Wii/shared1/0000000f.app b/Data/Sys/Wii/shared1/0000000f.app new file mode 100644 index 0000000000..61c88a32b4 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000000f.app differ diff --git a/Data/Sys/Wii/shared1/00000010.app b/Data/Sys/Wii/shared1/00000010.app new file mode 100644 index 0000000000..f5dbc2ef66 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000010.app differ diff --git a/Data/Sys/Wii/shared1/00000011.app b/Data/Sys/Wii/shared1/00000011.app new file mode 100644 index 0000000000..e8bb8cb50f Binary files /dev/null and b/Data/Sys/Wii/shared1/00000011.app differ diff --git a/Data/Sys/Wii/shared1/00000012.app b/Data/Sys/Wii/shared1/00000012.app new file mode 100644 index 0000000000..14e301e8ad Binary files /dev/null and b/Data/Sys/Wii/shared1/00000012.app differ diff --git a/Data/Sys/Wii/shared1/00000013.app b/Data/Sys/Wii/shared1/00000013.app new file mode 100644 index 0000000000..ed760791fc Binary files /dev/null and b/Data/Sys/Wii/shared1/00000013.app differ diff --git a/Data/Sys/Wii/shared1/00000014.app b/Data/Sys/Wii/shared1/00000014.app new file mode 100644 index 0000000000..0827106c9f Binary files /dev/null and b/Data/Sys/Wii/shared1/00000014.app differ diff --git a/Data/Sys/Wii/shared1/00000015.app b/Data/Sys/Wii/shared1/00000015.app new file mode 100644 index 0000000000..6832bf42cb Binary files /dev/null and b/Data/Sys/Wii/shared1/00000015.app differ diff --git a/Data/Sys/Wii/shared1/00000016.app b/Data/Sys/Wii/shared1/00000016.app new file mode 100644 index 0000000000..f53e4a2532 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000016.app differ diff --git a/Data/Sys/Wii/shared1/00000017.app b/Data/Sys/Wii/shared1/00000017.app new file mode 100644 index 0000000000..3b3cc533eb Binary files /dev/null and b/Data/Sys/Wii/shared1/00000017.app differ diff --git a/Data/Sys/Wii/shared1/00000018.app b/Data/Sys/Wii/shared1/00000018.app new file mode 100644 index 0000000000..428bada52c Binary files /dev/null and b/Data/Sys/Wii/shared1/00000018.app differ diff --git a/Data/Sys/Wii/shared1/00000019.app b/Data/Sys/Wii/shared1/00000019.app new file mode 100644 index 0000000000..009b2d3aa9 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000019.app differ diff --git a/Data/Sys/Wii/shared1/0000001a.app b/Data/Sys/Wii/shared1/0000001a.app new file mode 100644 index 0000000000..899c12d409 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000001a.app differ diff --git a/Data/Sys/Wii/shared1/0000001b.app b/Data/Sys/Wii/shared1/0000001b.app new file mode 100644 index 0000000000..1491637c85 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000001b.app differ diff --git a/Data/Sys/Wii/shared1/0000001c.app b/Data/Sys/Wii/shared1/0000001c.app new file mode 100644 index 0000000000..0c6322c0c8 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000001c.app differ diff --git a/Data/Sys/Wii/shared1/0000001d.app b/Data/Sys/Wii/shared1/0000001d.app new file mode 100644 index 0000000000..01c49a6a97 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000001d.app differ diff --git a/Data/Sys/Wii/shared1/0000001e.app b/Data/Sys/Wii/shared1/0000001e.app new file mode 100644 index 0000000000..b126d70ec5 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000001e.app differ diff --git a/Data/Sys/Wii/shared1/0000001f.app b/Data/Sys/Wii/shared1/0000001f.app new file mode 100644 index 0000000000..5e5a818ee7 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000001f.app differ diff --git a/Data/Sys/Wii/shared1/00000020.app b/Data/Sys/Wii/shared1/00000020.app new file mode 100644 index 0000000000..1d70634e7e Binary files /dev/null and b/Data/Sys/Wii/shared1/00000020.app differ diff --git a/Data/Sys/Wii/shared1/00000021.app b/Data/Sys/Wii/shared1/00000021.app new file mode 100644 index 0000000000..aad7420782 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000021.app differ diff --git a/Data/Sys/Wii/shared1/00000022.app b/Data/Sys/Wii/shared1/00000022.app new file mode 100644 index 0000000000..0dde63e114 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000022.app differ diff --git a/Data/Sys/Wii/shared1/00000023.app b/Data/Sys/Wii/shared1/00000023.app new file mode 100644 index 0000000000..0f31c1847e Binary files /dev/null and b/Data/Sys/Wii/shared1/00000023.app differ diff --git a/Data/Sys/Wii/shared1/00000024.app b/Data/Sys/Wii/shared1/00000024.app new file mode 100644 index 0000000000..9b32d1217f Binary files /dev/null and b/Data/Sys/Wii/shared1/00000024.app differ diff --git a/Data/Sys/Wii/shared1/00000025.app b/Data/Sys/Wii/shared1/00000025.app new file mode 100644 index 0000000000..fc4d9f02b0 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000025.app differ diff --git a/Data/Sys/Wii/shared1/00000026.app b/Data/Sys/Wii/shared1/00000026.app new file mode 100644 index 0000000000..bff287b8b3 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000026.app differ diff --git a/Data/Sys/Wii/shared1/00000027.app b/Data/Sys/Wii/shared1/00000027.app new file mode 100644 index 0000000000..c73e281db6 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000027.app differ diff --git a/Data/Sys/Wii/shared1/00000028.app b/Data/Sys/Wii/shared1/00000028.app new file mode 100644 index 0000000000..be9b0098b5 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000028.app differ diff --git a/Data/Sys/Wii/shared1/00000029.app b/Data/Sys/Wii/shared1/00000029.app new file mode 100644 index 0000000000..9d2d2fdb0b Binary files /dev/null and b/Data/Sys/Wii/shared1/00000029.app differ diff --git a/Data/Sys/Wii/shared1/0000002a.app b/Data/Sys/Wii/shared1/0000002a.app new file mode 100644 index 0000000000..309c530d2f Binary files /dev/null and b/Data/Sys/Wii/shared1/0000002a.app differ diff --git a/Data/Sys/Wii/shared1/0000002b.app b/Data/Sys/Wii/shared1/0000002b.app new file mode 100644 index 0000000000..026ad65a2a Binary files /dev/null and b/Data/Sys/Wii/shared1/0000002b.app differ diff --git a/Data/Sys/Wii/shared1/0000002c.app b/Data/Sys/Wii/shared1/0000002c.app new file mode 100644 index 0000000000..24d5103f91 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000002c.app differ diff --git a/Data/Sys/Wii/shared1/0000002d.app b/Data/Sys/Wii/shared1/0000002d.app new file mode 100644 index 0000000000..b0f766ca6d Binary files /dev/null and b/Data/Sys/Wii/shared1/0000002d.app differ diff --git a/Data/Sys/Wii/shared1/0000002e.app b/Data/Sys/Wii/shared1/0000002e.app new file mode 100644 index 0000000000..7c865791eb Binary files /dev/null and b/Data/Sys/Wii/shared1/0000002e.app differ diff --git a/Data/Sys/Wii/shared1/0000002f.app b/Data/Sys/Wii/shared1/0000002f.app new file mode 100644 index 0000000000..a3caade139 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000002f.app differ diff --git a/Data/Sys/Wii/shared1/00000030.app b/Data/Sys/Wii/shared1/00000030.app new file mode 100644 index 0000000000..8ebed8fb7e Binary files /dev/null and b/Data/Sys/Wii/shared1/00000030.app differ diff --git a/Data/Sys/Wii/shared1/00000031.app b/Data/Sys/Wii/shared1/00000031.app new file mode 100644 index 0000000000..1f9396facb Binary files /dev/null and b/Data/Sys/Wii/shared1/00000031.app differ diff --git a/Data/Sys/Wii/shared1/00000032.app b/Data/Sys/Wii/shared1/00000032.app new file mode 100644 index 0000000000..e01d65f2dc Binary files /dev/null and b/Data/Sys/Wii/shared1/00000032.app differ diff --git a/Data/Sys/Wii/shared1/00000033.app b/Data/Sys/Wii/shared1/00000033.app new file mode 100644 index 0000000000..a8257f1030 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000033.app differ diff --git a/Data/Sys/Wii/shared1/00000034.app b/Data/Sys/Wii/shared1/00000034.app new file mode 100644 index 0000000000..9818f33d71 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000034.app differ diff --git a/Data/Sys/Wii/shared1/00000035.app b/Data/Sys/Wii/shared1/00000035.app new file mode 100644 index 0000000000..b9c05ca0b1 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000035.app differ diff --git a/Data/Sys/Wii/shared1/00000036.app b/Data/Sys/Wii/shared1/00000036.app new file mode 100644 index 0000000000..735d53c4c1 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000036.app differ diff --git a/Data/Sys/Wii/shared1/00000037.app b/Data/Sys/Wii/shared1/00000037.app new file mode 100644 index 0000000000..884c274a58 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000037.app differ diff --git a/Data/Sys/Wii/shared1/00000038.app b/Data/Sys/Wii/shared1/00000038.app new file mode 100644 index 0000000000..4e04b8c271 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000038.app differ diff --git a/Data/Sys/Wii/shared1/00000039.app b/Data/Sys/Wii/shared1/00000039.app new file mode 100644 index 0000000000..843d273d62 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000039.app differ diff --git a/Data/Sys/Wii/shared1/0000003a.app b/Data/Sys/Wii/shared1/0000003a.app new file mode 100644 index 0000000000..42ec1278f1 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000003a.app differ diff --git a/Data/Sys/Wii/shared1/0000003b.app b/Data/Sys/Wii/shared1/0000003b.app new file mode 100644 index 0000000000..c7d01c5cac Binary files /dev/null and b/Data/Sys/Wii/shared1/0000003b.app differ diff --git a/Data/Sys/Wii/shared1/0000003c.app b/Data/Sys/Wii/shared1/0000003c.app new file mode 100644 index 0000000000..da3c37e42b Binary files /dev/null and b/Data/Sys/Wii/shared1/0000003c.app differ diff --git a/Data/Sys/Wii/shared1/0000003d.app b/Data/Sys/Wii/shared1/0000003d.app new file mode 100644 index 0000000000..ee607f0feb Binary files /dev/null and b/Data/Sys/Wii/shared1/0000003d.app differ diff --git a/Data/Sys/Wii/shared1/0000003e.app b/Data/Sys/Wii/shared1/0000003e.app new file mode 100644 index 0000000000..f122d8f2bd Binary files /dev/null and b/Data/Sys/Wii/shared1/0000003e.app differ diff --git a/Data/Sys/Wii/shared1/0000003f.app b/Data/Sys/Wii/shared1/0000003f.app new file mode 100644 index 0000000000..66f408a608 Binary files /dev/null and b/Data/Sys/Wii/shared1/0000003f.app differ diff --git a/Data/Sys/Wii/shared1/00000040.app b/Data/Sys/Wii/shared1/00000040.app new file mode 100644 index 0000000000..c566701f7f Binary files /dev/null and b/Data/Sys/Wii/shared1/00000040.app differ diff --git a/Data/Sys/Wii/shared1/00000041.app b/Data/Sys/Wii/shared1/00000041.app new file mode 100644 index 0000000000..2cea02bc5d Binary files /dev/null and b/Data/Sys/Wii/shared1/00000041.app differ diff --git a/Data/Sys/Wii/shared1/00000042.app b/Data/Sys/Wii/shared1/00000042.app new file mode 100644 index 0000000000..4cf1a0f5d4 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000042.app differ diff --git a/Data/Sys/Wii/shared1/00000043.app b/Data/Sys/Wii/shared1/00000043.app new file mode 100644 index 0000000000..c0912ea5e2 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000043.app differ diff --git a/Data/Sys/Wii/shared1/00000044.app b/Data/Sys/Wii/shared1/00000044.app new file mode 100644 index 0000000000..dde8744abb Binary files /dev/null and b/Data/Sys/Wii/shared1/00000044.app differ diff --git a/Data/Sys/Wii/shared1/00000045.app b/Data/Sys/Wii/shared1/00000045.app new file mode 100644 index 0000000000..0f484c3a6d Binary files /dev/null and b/Data/Sys/Wii/shared1/00000045.app differ diff --git a/Data/Sys/Wii/shared1/00000046.app b/Data/Sys/Wii/shared1/00000046.app new file mode 100644 index 0000000000..1e57197055 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000046.app differ diff --git a/Data/Sys/Wii/shared1/00000047.app b/Data/Sys/Wii/shared1/00000047.app new file mode 100644 index 0000000000..8649622dcb Binary files /dev/null and b/Data/Sys/Wii/shared1/00000047.app differ diff --git a/Data/Sys/Wii/shared1/00000048.app b/Data/Sys/Wii/shared1/00000048.app new file mode 100644 index 0000000000..952ba66fb1 Binary files /dev/null and b/Data/Sys/Wii/shared1/00000048.app differ diff --git a/Data/Sys/Wii/shared1/content.map b/Data/Sys/Wii/shared1/content.map new file mode 100644 index 0000000000..1767a7504d Binary files /dev/null and b/Data/Sys/Wii/shared1/content.map differ diff --git a/Data/Sys/Wii/shared2/ec/shopsetu.log b/Data/Sys/Wii/shared2/ec/shopsetu.log new file mode 100644 index 0000000000..4e4e493570 Binary files /dev/null and b/Data/Sys/Wii/shared2/ec/shopsetu.log differ diff --git a/Data/Sys/Wii/shared2/menu/FaceLib/RFL_DB.dat b/Data/Sys/Wii/shared2/menu/FaceLib/RFL_DB.dat new file mode 100644 index 0000000000..2991fa97bc Binary files /dev/null and b/Data/Sys/Wii/shared2/menu/FaceLib/RFL_DB.dat differ diff --git a/Data/Sys/Wii/shared2/menu/vc/settings.sav b/Data/Sys/Wii/shared2/menu/vc/settings.sav new file mode 100644 index 0000000000..6bb1bf4b5c Binary files /dev/null and b/Data/Sys/Wii/shared2/menu/vc/settings.sav differ diff --git a/Data/Sys/Wii/shared2/succession/shop.log b/Data/Sys/Wii/shared2/succession/shop.log new file mode 100644 index 0000000000..4e4e493570 Binary files /dev/null and b/Data/Sys/Wii/shared2/succession/shop.log differ diff --git a/Data/Sys/Wii/shared2/sys/SYSCONF b/Data/Sys/Wii/shared2/sys/SYSCONF new file mode 100644 index 0000000000..7772b3d53a Binary files /dev/null and b/Data/Sys/Wii/shared2/sys/SYSCONF differ diff --git a/Data/Sys/Wii/shared2/sys/net/02/config.dat b/Data/Sys/Wii/shared2/sys/net/02/config.dat new file mode 100644 index 0000000000..97fb42584d Binary files /dev/null and b/Data/Sys/Wii/shared2/sys/net/02/config.dat differ diff --git a/Data/Sys/Wii/sys/cert.sys b/Data/Sys/Wii/sys/cert.sys new file mode 100644 index 0000000000..32dd50ca02 Binary files /dev/null and b/Data/Sys/Wii/sys/cert.sys differ diff --git a/Data/Sys/Wii/sys/uid.sys b/Data/Sys/Wii/sys/uid.sys new file mode 100644 index 0000000000..bce5358b7a Binary files /dev/null and b/Data/Sys/Wii/sys/uid.sys differ diff --git a/Data/Sys/Wii/ticket/00000001/00000002.tik b/Data/Sys/Wii/ticket/00000001/00000002.tik new file mode 100644 index 0000000000..6f6465c04e Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000002.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000004.tik b/Data/Sys/Wii/ticket/00000001/00000004.tik new file mode 100644 index 0000000000..a3413b4bdb Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000004.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000009.tik b/Data/Sys/Wii/ticket/00000001/00000009.tik new file mode 100644 index 0000000000..664adadca3 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000009.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000000a.tik b/Data/Sys/Wii/ticket/00000001/0000000a.tik new file mode 100644 index 0000000000..64f1f9571b Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000000a.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000000b.tik b/Data/Sys/Wii/ticket/00000001/0000000b.tik new file mode 100644 index 0000000000..e580792ba7 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000000b.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000000c.tik b/Data/Sys/Wii/ticket/00000001/0000000c.tik new file mode 100644 index 0000000000..f053b9a181 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000000c.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000000d.tik b/Data/Sys/Wii/ticket/00000001/0000000d.tik new file mode 100644 index 0000000000..b615126656 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000000d.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000000e.tik b/Data/Sys/Wii/ticket/00000001/0000000e.tik new file mode 100644 index 0000000000..859bc49ce8 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000000e.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000000f.tik b/Data/Sys/Wii/ticket/00000001/0000000f.tik new file mode 100644 index 0000000000..31760fb1c7 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000000f.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000010.tik b/Data/Sys/Wii/ticket/00000001/00000010.tik new file mode 100644 index 0000000000..aec7672bfe Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000010.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000011.tik b/Data/Sys/Wii/ticket/00000001/00000011.tik new file mode 100644 index 0000000000..09e7b2758a Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000011.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000014.tik b/Data/Sys/Wii/ticket/00000001/00000014.tik new file mode 100644 index 0000000000..4e7d3c0d1b Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000014.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000015.tik b/Data/Sys/Wii/ticket/00000001/00000015.tik new file mode 100644 index 0000000000..7f6006a48b Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000015.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000016.tik b/Data/Sys/Wii/ticket/00000001/00000016.tik new file mode 100644 index 0000000000..ef1fecf18e Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000016.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000001c.tik b/Data/Sys/Wii/ticket/00000001/0000001c.tik new file mode 100644 index 0000000000..d85f5a98c1 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000001c.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000001e.tik b/Data/Sys/Wii/ticket/00000001/0000001e.tik new file mode 100644 index 0000000000..3ec871179b Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000001e.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000001f.tik b/Data/Sys/Wii/ticket/00000001/0000001f.tik new file mode 100644 index 0000000000..f4982f4b6f Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000001f.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000021.tik b/Data/Sys/Wii/ticket/00000001/00000021.tik new file mode 100644 index 0000000000..4d656e7c61 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000021.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000022.tik b/Data/Sys/Wii/ticket/00000001/00000022.tik new file mode 100644 index 0000000000..7c4aefe5e6 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000022.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000023.tik b/Data/Sys/Wii/ticket/00000001/00000023.tik new file mode 100644 index 0000000000..84e14bac90 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000023.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000024.tik b/Data/Sys/Wii/ticket/00000001/00000024.tik new file mode 100644 index 0000000000..162ef5422f Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000024.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000025.tik b/Data/Sys/Wii/ticket/00000001/00000025.tik new file mode 100644 index 0000000000..584b8b1828 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000025.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000026.tik b/Data/Sys/Wii/ticket/00000001/00000026.tik new file mode 100644 index 0000000000..dab9a7d009 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000026.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000032.tik b/Data/Sys/Wii/ticket/00000001/00000032.tik new file mode 100644 index 0000000000..b3ba0bdb35 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000032.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000033.tik b/Data/Sys/Wii/ticket/00000001/00000033.tik new file mode 100644 index 0000000000..1c1e0c7209 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000033.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000035.tik b/Data/Sys/Wii/ticket/00000001/00000035.tik new file mode 100644 index 0000000000..8fa5e36145 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000035.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000037.tik b/Data/Sys/Wii/ticket/00000001/00000037.tik new file mode 100644 index 0000000000..d9ae4a737f Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000037.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000038.tik b/Data/Sys/Wii/ticket/00000001/00000038.tik new file mode 100644 index 0000000000..4b03c7f239 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000038.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000039.tik b/Data/Sys/Wii/ticket/00000001/00000039.tik new file mode 100644 index 0000000000..12856cbd60 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000039.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000003c.tik b/Data/Sys/Wii/ticket/00000001/0000003c.tik new file mode 100644 index 0000000000..3b0367c5c3 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000003c.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/0000003d.tik b/Data/Sys/Wii/ticket/00000001/0000003d.tik new file mode 100644 index 0000000000..2bfd744951 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/0000003d.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000046.tik b/Data/Sys/Wii/ticket/00000001/00000046.tik new file mode 100644 index 0000000000..eaf1970e5d Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000046.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/000000de.tik b/Data/Sys/Wii/ticket/00000001/000000de.tik new file mode 100644 index 0000000000..e8e13b3d8a Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/000000de.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/000000df.tik b/Data/Sys/Wii/ticket/00000001/000000df.tik new file mode 100644 index 0000000000..4c21cb2440 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/000000df.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/000000f9.tik b/Data/Sys/Wii/ticket/00000001/000000f9.tik new file mode 100644 index 0000000000..d683b8188e Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/000000f9.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/000000fa.tik b/Data/Sys/Wii/ticket/00000001/000000fa.tik new file mode 100644 index 0000000000..463483d691 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/000000fa.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/000000fe.tik b/Data/Sys/Wii/ticket/00000001/000000fe.tik new file mode 100644 index 0000000000..96141fe988 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/000000fe.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000100.tik b/Data/Sys/Wii/ticket/00000001/00000100.tik new file mode 100644 index 0000000000..26c08b5168 Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000100.tik differ diff --git a/Data/Sys/Wii/ticket/00000001/00000101.tik b/Data/Sys/Wii/ticket/00000001/00000101.tik new file mode 100644 index 0000000000..84dde8306b Binary files /dev/null and b/Data/Sys/Wii/ticket/00000001/00000101.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48414241.tik b/Data/Sys/Wii/ticket/00010002/48414241.tik new file mode 100644 index 0000000000..126a358501 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48414241.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48414341.tik b/Data/Sys/Wii/ticket/00010002/48414341.tik new file mode 100644 index 0000000000..507277473f Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48414341.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48414641.tik b/Data/Sys/Wii/ticket/00010002/48414641.tik new file mode 100644 index 0000000000..124b4cbb67 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48414641.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48414645.tik b/Data/Sys/Wii/ticket/00010002/48414645.tik new file mode 100644 index 0000000000..d523183609 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48414645.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48414741.tik b/Data/Sys/Wii/ticket/00010002/48414741.tik new file mode 100644 index 0000000000..5678f21698 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48414741.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48414745.tik b/Data/Sys/Wii/ticket/00010002/48414745.tik new file mode 100644 index 0000000000..95768c576b Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48414745.tik differ diff --git a/Data/Sys/Wii/ticket/00010002/48415941.tik b/Data/Sys/Wii/ticket/00010002/48415941.tik new file mode 100644 index 0000000000..8204e3d1e2 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010002/48415941.tik differ diff --git a/Data/Sys/Wii/ticket/00010008/48414b45.tik b/Data/Sys/Wii/ticket/00010008/48414b45.tik new file mode 100644 index 0000000000..36fca763b6 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010008/48414b45.tik differ diff --git a/Data/Sys/Wii/ticket/00010008/48414c45.tik b/Data/Sys/Wii/ticket/00010008/48414c45.tik new file mode 100644 index 0000000000..17e0171864 Binary files /dev/null and b/Data/Sys/Wii/ticket/00010008/48414c45.tik differ diff --git a/Data/Sys/Wii/title/00000001/00000002/content/00000086.app b/Data/Sys/Wii/title/00000001/00000002/content/00000086.app new file mode 100644 index 0000000000..2ca083923b Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/content/00000086.app differ diff --git a/Data/Sys/Wii/title/00000001/00000002/content/00000087.app b/Data/Sys/Wii/title/00000001/00000002/content/00000087.app new file mode 100644 index 0000000000..3d5b853704 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/content/00000087.app differ diff --git a/Data/Sys/Wii/title/00000001/00000002/content/00000088.app b/Data/Sys/Wii/title/00000001/00000002/content/00000088.app new file mode 100644 index 0000000000..fa74534e45 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/content/00000088.app differ diff --git a/Data/Sys/Wii/title/00000001/00000002/content/title.tmd b/Data/Sys/Wii/title/00000001/00000002/content/title.tmd new file mode 100644 index 0000000000..e5c8b37271 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000002/data/cache.dat b/Data/Sys/Wii/title/00000001/00000002/data/cache.dat new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Data/Sys/Wii/title/00000001/00000002/data/cdb.vff b/Data/Sys/Wii/title/00000001/00000002/data/cdb.vff new file mode 100644 index 0000000000..6948771527 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/data/cdb.vff differ diff --git a/Data/Sys/Wii/title/00000001/00000002/data/iplsave.bin b/Data/Sys/Wii/title/00000001/00000002/data/iplsave.bin new file mode 100644 index 0000000000..68f90a042f Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/data/iplsave.bin differ diff --git a/Data/Sys/Wii/title/00000001/00000002/data/play_rec.dat b/Data/Sys/Wii/title/00000001/00000002/data/play_rec.dat new file mode 100644 index 0000000000..fd22bd9b40 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/data/play_rec.dat differ diff --git a/Data/Sys/Wii/title/00000001/00000002/data/setting.txt b/Data/Sys/Wii/title/00000001/00000002/data/setting.txt new file mode 100644 index 0000000000..3123b0e055 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/data/setting.txt differ diff --git a/Data/Sys/Wii/title/00000001/00000002/data/state.dat b/Data/Sys/Wii/title/00000001/00000002/data/state.dat new file mode 100644 index 0000000000..8c535a3726 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000002/data/state.dat differ diff --git a/Data/Sys/Wii/title/00000001/00000004/content/00000009.app b/Data/Sys/Wii/title/00000001/00000004/content/00000009.app new file mode 100644 index 0000000000..d51727ada5 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000004/content/00000009.app differ diff --git a/Data/Sys/Wii/title/00000001/00000004/content/title.tmd b/Data/Sys/Wii/title/00000001/00000004/content/title.tmd new file mode 100644 index 0000000000..bacb5c3505 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000004/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000009/content/00000004.app b/Data/Sys/Wii/title/00000001/00000009/content/00000004.app new file mode 100644 index 0000000000..017c530371 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000009/content/00000004.app differ diff --git a/Data/Sys/Wii/title/00000001/00000009/content/title.tmd b/Data/Sys/Wii/title/00000001/00000009/content/title.tmd new file mode 100644 index 0000000000..35ce690334 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000009/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000000a/content/00000001.app b/Data/Sys/Wii/title/00000001/0000000a/content/00000001.app new file mode 100644 index 0000000000..d9f2307795 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000a/content/00000001.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000a/content/title.tmd b/Data/Sys/Wii/title/00000001/0000000a/content/title.tmd new file mode 100644 index 0000000000..d2185cfa87 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000a/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000000b/content/0000000a.app b/Data/Sys/Wii/title/00000001/0000000b/content/0000000a.app new file mode 100644 index 0000000000..fb7f6de55a Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000b/content/0000000a.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000b/content/title.tmd b/Data/Sys/Wii/title/00000001/0000000b/content/title.tmd new file mode 100644 index 0000000000..d07d08d9b2 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000b/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000000c/content/00000006.app b/Data/Sys/Wii/title/00000001/0000000c/content/00000006.app new file mode 100644 index 0000000000..ced4d6292e Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000c/content/00000006.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000c/content/00000007.app b/Data/Sys/Wii/title/00000001/0000000c/content/00000007.app new file mode 100644 index 0000000000..ac25a76409 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000c/content/00000007.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000c/content/title.tmd b/Data/Sys/Wii/title/00000001/0000000c/content/title.tmd new file mode 100644 index 0000000000..8dfa706f5a Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000c/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000000d/content/0000000c.app b/Data/Sys/Wii/title/00000001/0000000d/content/0000000c.app new file mode 100644 index 0000000000..bc11d13f7c Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000d/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000d/content/0000000d.app b/Data/Sys/Wii/title/00000001/0000000d/content/0000000d.app new file mode 100644 index 0000000000..198e51b0b8 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000d/content/0000000d.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000d/content/title.tmd b/Data/Sys/Wii/title/00000001/0000000d/content/title.tmd new file mode 100644 index 0000000000..37650616e8 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000d/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000000e/content/0000000c.app b/Data/Sys/Wii/title/00000001/0000000e/content/0000000c.app new file mode 100644 index 0000000000..8023c5cbda Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000e/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000e/content/0000000d.app b/Data/Sys/Wii/title/00000001/0000000e/content/0000000d.app new file mode 100644 index 0000000000..6ab8fce630 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000e/content/0000000d.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000e/content/title.tmd b/Data/Sys/Wii/title/00000001/0000000e/content/title.tmd new file mode 100644 index 0000000000..6188063580 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000e/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000000f/content/00000003.app b/Data/Sys/Wii/title/00000001/0000000f/content/00000003.app new file mode 100644 index 0000000000..ee88cb59bb Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000f/content/00000003.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000f/content/0000000c.app b/Data/Sys/Wii/title/00000001/0000000f/content/0000000c.app new file mode 100644 index 0000000000..a3808e90d3 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000f/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000f/content/0000000d.app b/Data/Sys/Wii/title/00000001/0000000f/content/0000000d.app new file mode 100644 index 0000000000..777c267aa8 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000f/content/0000000d.app differ diff --git a/Data/Sys/Wii/title/00000001/0000000f/content/title.tmd b/Data/Sys/Wii/title/00000001/0000000f/content/title.tmd new file mode 100644 index 0000000000..9a2556400a Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000000f/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000010/content/00000002.app b/Data/Sys/Wii/title/00000001/00000010/content/00000002.app new file mode 100644 index 0000000000..543e7d5dd1 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000010/content/00000002.app differ diff --git a/Data/Sys/Wii/title/00000001/00000010/content/title.tmd b/Data/Sys/Wii/title/00000001/00000010/content/title.tmd new file mode 100644 index 0000000000..ec238c9b28 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000010/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000011/content/00000006.app b/Data/Sys/Wii/title/00000001/00000011/content/00000006.app new file mode 100644 index 0000000000..1b3c2abdd9 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000011/content/00000006.app differ diff --git a/Data/Sys/Wii/title/00000001/00000011/content/00000007.app b/Data/Sys/Wii/title/00000001/00000011/content/00000007.app new file mode 100644 index 0000000000..305ea53778 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000011/content/00000007.app differ diff --git a/Data/Sys/Wii/title/00000001/00000011/content/title.tmd b/Data/Sys/Wii/title/00000001/00000011/content/title.tmd new file mode 100644 index 0000000000..a2b1867513 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000011/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000014/content/00000002.app b/Data/Sys/Wii/title/00000001/00000014/content/00000002.app new file mode 100644 index 0000000000..1eae6d9f8e Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000014/content/00000002.app differ diff --git a/Data/Sys/Wii/title/00000001/00000014/content/title.tmd b/Data/Sys/Wii/title/00000001/00000014/content/title.tmd new file mode 100644 index 0000000000..17fe44b5d3 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000014/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000015/content/00000003.app b/Data/Sys/Wii/title/00000001/00000015/content/00000003.app new file mode 100644 index 0000000000..ee88cb59bb Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000015/content/00000003.app differ diff --git a/Data/Sys/Wii/title/00000001/00000015/content/0000000e.app b/Data/Sys/Wii/title/00000001/00000015/content/0000000e.app new file mode 100644 index 0000000000..5738aa7f86 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000015/content/0000000e.app differ diff --git a/Data/Sys/Wii/title/00000001/00000015/content/0000000f.app b/Data/Sys/Wii/title/00000001/00000015/content/0000000f.app new file mode 100644 index 0000000000..18e58e36df Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000015/content/0000000f.app differ diff --git a/Data/Sys/Wii/title/00000001/00000015/content/title.tmd b/Data/Sys/Wii/title/00000001/00000015/content/title.tmd new file mode 100644 index 0000000000..41ea43c292 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000015/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000016/content/0000000c.app b/Data/Sys/Wii/title/00000001/00000016/content/0000000c.app new file mode 100644 index 0000000000..e583766768 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000016/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00000001/00000016/content/0000000d.app b/Data/Sys/Wii/title/00000001/00000016/content/0000000d.app new file mode 100644 index 0000000000..7220b851b9 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000016/content/0000000d.app differ diff --git a/Data/Sys/Wii/title/00000001/00000016/content/title.tmd b/Data/Sys/Wii/title/00000001/00000016/content/title.tmd new file mode 100644 index 0000000000..2a6d188108 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000016/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000001c/content/00000018.app b/Data/Sys/Wii/title/00000001/0000001c/content/00000018.app new file mode 100644 index 0000000000..64e868d9ea Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000001c/content/00000018.app differ diff --git a/Data/Sys/Wii/title/00000001/0000001c/content/title.tmd b/Data/Sys/Wii/title/00000001/0000001c/content/title.tmd new file mode 100644 index 0000000000..2cd0239575 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000001c/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000001e/content/00000025.app b/Data/Sys/Wii/title/00000001/0000001e/content/00000025.app new file mode 100644 index 0000000000..ed98ccb358 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000001e/content/00000025.app differ diff --git a/Data/Sys/Wii/title/00000001/0000001e/content/title.tmd b/Data/Sys/Wii/title/00000001/0000001e/content/title.tmd new file mode 100644 index 0000000000..095f02b8ef Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000001e/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000001f/content/00000030.app b/Data/Sys/Wii/title/00000001/0000001f/content/00000030.app new file mode 100644 index 0000000000..669b666ffa Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000001f/content/00000030.app differ diff --git a/Data/Sys/Wii/title/00000001/0000001f/content/title.tmd b/Data/Sys/Wii/title/00000001/0000001f/content/title.tmd new file mode 100644 index 0000000000..e4a70f7c54 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000001f/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000021/content/0000001d.app b/Data/Sys/Wii/title/00000001/00000021/content/0000001d.app new file mode 100644 index 0000000000..508b865cd5 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000021/content/0000001d.app differ diff --git a/Data/Sys/Wii/title/00000001/00000021/content/title.tmd b/Data/Sys/Wii/title/00000001/00000021/content/title.tmd new file mode 100644 index 0000000000..1f7be34b69 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000021/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000022/content/0000001b.app b/Data/Sys/Wii/title/00000001/00000022/content/0000001b.app new file mode 100644 index 0000000000..497571a8aa Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000022/content/0000001b.app differ diff --git a/Data/Sys/Wii/title/00000001/00000022/content/title.tmd b/Data/Sys/Wii/title/00000001/00000022/content/title.tmd new file mode 100644 index 0000000000..4ea2272542 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000022/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000023/content/0000001b.app b/Data/Sys/Wii/title/00000001/00000023/content/0000001b.app new file mode 100644 index 0000000000..f63317e9c6 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000023/content/0000001b.app differ diff --git a/Data/Sys/Wii/title/00000001/00000023/content/title.tmd b/Data/Sys/Wii/title/00000001/00000023/content/title.tmd new file mode 100644 index 0000000000..68e8dab16c Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000023/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000024/content/0000001b.app b/Data/Sys/Wii/title/00000001/00000024/content/0000001b.app new file mode 100644 index 0000000000..3a74f56d38 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000024/content/0000001b.app differ diff --git a/Data/Sys/Wii/title/00000001/00000024/content/title.tmd b/Data/Sys/Wii/title/00000001/00000024/content/title.tmd new file mode 100644 index 0000000000..f012063421 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000024/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000025/content/0000001c.app b/Data/Sys/Wii/title/00000001/00000025/content/0000001c.app new file mode 100644 index 0000000000..954cada58f Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000025/content/0000001c.app differ diff --git a/Data/Sys/Wii/title/00000001/00000025/content/title.tmd b/Data/Sys/Wii/title/00000001/00000025/content/title.tmd new file mode 100644 index 0000000000..1b86e8ac22 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000025/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000026/content/00000012.app b/Data/Sys/Wii/title/00000001/00000026/content/00000012.app new file mode 100644 index 0000000000..0f28275465 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000026/content/00000012.app differ diff --git a/Data/Sys/Wii/title/00000001/00000026/content/title.tmd b/Data/Sys/Wii/title/00000001/00000026/content/title.tmd new file mode 100644 index 0000000000..8af49671fd Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000026/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000032/content/00000011.app b/Data/Sys/Wii/title/00000001/00000032/content/00000011.app new file mode 100644 index 0000000000..9a408bdb5c Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000032/content/00000011.app differ diff --git a/Data/Sys/Wii/title/00000001/00000032/content/title.tmd b/Data/Sys/Wii/title/00000001/00000032/content/title.tmd new file mode 100644 index 0000000000..ccce47bf51 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000032/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000033/content/0000000f.app b/Data/Sys/Wii/title/00000001/00000033/content/0000000f.app new file mode 100644 index 0000000000..01f8fc2353 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000033/content/0000000f.app differ diff --git a/Data/Sys/Wii/title/00000001/00000033/content/title.tmd b/Data/Sys/Wii/title/00000001/00000033/content/title.tmd new file mode 100644 index 0000000000..55247c2e21 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000033/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000035/content/00000016.app b/Data/Sys/Wii/title/00000001/00000035/content/00000016.app new file mode 100644 index 0000000000..5d24451119 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000035/content/00000016.app differ diff --git a/Data/Sys/Wii/title/00000001/00000035/content/title.tmd b/Data/Sys/Wii/title/00000001/00000035/content/title.tmd new file mode 100644 index 0000000000..cb9d6781f7 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000035/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000037/content/00000012.app b/Data/Sys/Wii/title/00000001/00000037/content/00000012.app new file mode 100644 index 0000000000..947cff1a3b Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000037/content/00000012.app differ diff --git a/Data/Sys/Wii/title/00000001/00000037/content/title.tmd b/Data/Sys/Wii/title/00000001/00000037/content/title.tmd new file mode 100644 index 0000000000..9bbc6e163f Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000037/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000038/content/00000012.app b/Data/Sys/Wii/title/00000001/00000038/content/00000012.app new file mode 100644 index 0000000000..e8c2860004 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000038/content/00000012.app differ diff --git a/Data/Sys/Wii/title/00000001/00000038/content/title.tmd b/Data/Sys/Wii/title/00000001/00000038/content/title.tmd new file mode 100644 index 0000000000..a748073bbf Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000038/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000039/content/00000015.app b/Data/Sys/Wii/title/00000001/00000039/content/00000015.app new file mode 100644 index 0000000000..f79fcb03d6 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000039/content/00000015.app differ diff --git a/Data/Sys/Wii/title/00000001/00000039/content/title.tmd b/Data/Sys/Wii/title/00000001/00000039/content/title.tmd new file mode 100644 index 0000000000..9ee917de79 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000039/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000003c/content/0000000f.app b/Data/Sys/Wii/title/00000001/0000003c/content/0000000f.app new file mode 100644 index 0000000000..ce7f4e252c Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000003c/content/0000000f.app differ diff --git a/Data/Sys/Wii/title/00000001/0000003c/content/title.tmd b/Data/Sys/Wii/title/00000001/0000003c/content/title.tmd new file mode 100644 index 0000000000..1bdc9d6555 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000003c/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/0000003d/content/0000000f.app b/Data/Sys/Wii/title/00000001/0000003d/content/0000000f.app new file mode 100644 index 0000000000..4962bb364a Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000003d/content/0000000f.app differ diff --git a/Data/Sys/Wii/title/00000001/0000003d/content/title.tmd b/Data/Sys/Wii/title/00000001/0000003d/content/title.tmd new file mode 100644 index 0000000000..b576abd564 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/0000003d/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000046/content/00000000.app b/Data/Sys/Wii/title/00000001/00000046/content/00000000.app new file mode 100644 index 0000000000..d616824dcf Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000046/content/00000000.app differ diff --git a/Data/Sys/Wii/title/00000001/00000046/content/title.tmd b/Data/Sys/Wii/title/00000001/00000046/content/title.tmd new file mode 100644 index 0000000000..d7a261641b Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000046/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/000000de/content/00000000.app b/Data/Sys/Wii/title/00000001/000000de/content/00000000.app new file mode 100644 index 0000000000..c0eb2db39f Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000de/content/00000000.app differ diff --git a/Data/Sys/Wii/title/00000001/000000de/content/title.tmd b/Data/Sys/Wii/title/00000001/000000de/content/title.tmd new file mode 100644 index 0000000000..7c5adf252a Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000de/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/000000df/content/00000000.app b/Data/Sys/Wii/title/00000001/000000df/content/00000000.app new file mode 100644 index 0000000000..c0eb2db39f Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000df/content/00000000.app differ diff --git a/Data/Sys/Wii/title/00000001/000000df/content/title.tmd b/Data/Sys/Wii/title/00000001/000000df/content/title.tmd new file mode 100644 index 0000000000..7978a95d01 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000df/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/000000f9/content/00000000.app b/Data/Sys/Wii/title/00000001/000000f9/content/00000000.app new file mode 100644 index 0000000000..3854334a53 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000f9/content/00000000.app differ diff --git a/Data/Sys/Wii/title/00000001/000000f9/content/title.tmd b/Data/Sys/Wii/title/00000001/000000f9/content/title.tmd new file mode 100644 index 0000000000..776961d4a0 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000f9/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/000000fa/content/00000000.app b/Data/Sys/Wii/title/00000001/000000fa/content/00000000.app new file mode 100644 index 0000000000..3854334a53 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000fa/content/00000000.app differ diff --git a/Data/Sys/Wii/title/00000001/000000fa/content/title.tmd b/Data/Sys/Wii/title/00000001/000000fa/content/title.tmd new file mode 100644 index 0000000000..f1bac48125 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000fa/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/000000fe/content/00000003.app b/Data/Sys/Wii/title/00000001/000000fe/content/00000003.app new file mode 100644 index 0000000000..017c530371 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000fe/content/00000003.app differ diff --git a/Data/Sys/Wii/title/00000001/000000fe/content/title.tmd b/Data/Sys/Wii/title/00000001/000000fe/content/title.tmd new file mode 100644 index 0000000000..c5acb63f71 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/000000fe/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000100/content/00000007.app b/Data/Sys/Wii/title/00000001/00000100/content/00000007.app new file mode 100644 index 0000000000..ab8982d787 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000100/content/00000007.app differ diff --git a/Data/Sys/Wii/title/00000001/00000100/content/00000008.app b/Data/Sys/Wii/title/00000001/00000100/content/00000008.app new file mode 100644 index 0000000000..01277adc08 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000100/content/00000008.app differ diff --git a/Data/Sys/Wii/title/00000001/00000100/content/title.tmd b/Data/Sys/Wii/title/00000001/00000100/content/title.tmd new file mode 100644 index 0000000000..e0c7c8ef96 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000100/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00000001/00000101/content/0000000b.app b/Data/Sys/Wii/title/00000001/00000101/content/0000000b.app new file mode 100644 index 0000000000..e6731f4938 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000101/content/0000000b.app differ diff --git a/Data/Sys/Wii/title/00000001/00000101/content/0000000c.app b/Data/Sys/Wii/title/00000001/00000101/content/0000000c.app new file mode 100644 index 0000000000..41b00fa374 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000101/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00000001/00000101/content/title.tmd b/Data/Sys/Wii/title/00000001/00000101/content/title.tmd new file mode 100644 index 0000000000..4cd28bd570 Binary files /dev/null and b/Data/Sys/Wii/title/00000001/00000101/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52324445/content/title.tmd b/Data/Sys/Wii/title/00010000/52324445/content/title.tmd new file mode 100644 index 0000000000..5b94464603 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52324445/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52324445/data/banner.bin b/Data/Sys/Wii/title/00010000/52324445/data/banner.bin new file mode 100644 index 0000000000..9b0df392d8 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52324445/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52324445/data/savefile.dat b/Data/Sys/Wii/title/00010000/52324445/data/savefile.dat new file mode 100644 index 0000000000..fc93bf9c18 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52324445/data/savefile.dat differ diff --git a/Data/Sys/Wii/title/00010000/52345145/content/title.tmd b/Data/Sys/Wii/title/00010000/52345145/content/title.tmd new file mode 100644 index 0000000000..1813369c98 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52345145/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52345145/data/Strikers2 b/Data/Sys/Wii/title/00010000/52345145/data/Strikers2 new file mode 100644 index 0000000000..5f4be4a8fd Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52345145/data/Strikers2 differ diff --git a/Data/Sys/Wii/title/00010000/52345145/data/banner.bin b/Data/Sys/Wii/title/00010000/52345145/data/banner.bin new file mode 100644 index 0000000000..1b2c49d126 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52345145/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52345150/content/title.tmd b/Data/Sys/Wii/title/00010000/52345150/content/title.tmd new file mode 100644 index 0000000000..601e533a01 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52345150/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52345150/data/Strikers2 b/Data/Sys/Wii/title/00010000/52345150/data/Strikers2 new file mode 100644 index 0000000000..da78519b88 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52345150/data/Strikers2 differ diff --git a/Data/Sys/Wii/title/00010000/52345150/data/banner.bin b/Data/Sys/Wii/title/00010000/52345150/data/banner.bin new file mode 100644 index 0000000000..696317ce1e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52345150/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52363445/content/title.tmd b/Data/Sys/Wii/title/00010000/52363445/content/title.tmd new file mode 100644 index 0000000000..1e84a4d953 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52363445/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52363445/data/RPClipDB.dat b/Data/Sys/Wii/title/00010000/52363445/data/RPClipDB.dat new file mode 100644 index 0000000000..746a8c0891 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52363445/data/RPClipDB.dat differ diff --git a/Data/Sys/Wii/title/00010000/52363445/data/RPMusic.dat b/Data/Sys/Wii/title/00010000/52363445/data/RPMusic.dat new file mode 100644 index 0000000000..8b3e713e1d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52363445/data/RPMusic.dat differ diff --git a/Data/Sys/Wii/title/00010000/52363445/data/RPNandDB.dat b/Data/Sys/Wii/title/00010000/52363445/data/RPNandDB.dat new file mode 100644 index 0000000000..bcba5cbacb Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52363445/data/RPNandDB.dat differ diff --git a/Data/Sys/Wii/title/00010000/52363445/data/banner.bin b/Data/Sys/Wii/title/00010000/52363445/data/banner.bin new file mode 100644 index 0000000000..744ab8a4df Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52363445/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52363445/data/wc24scr.vff b/Data/Sys/Wii/title/00010000/52363445/data/wc24scr.vff new file mode 100644 index 0000000000..a368cd2624 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52363445/data/wc24scr.vff differ diff --git a/Data/Sys/Wii/title/00010000/52464545/content/title.tmd b/Data/Sys/Wii/title/00010000/52464545/content/title.tmd new file mode 100644 index 0000000000..f3eb36a434 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52464545/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52464545/data/FE10_US.dat b/Data/Sys/Wii/title/00010000/52464545/data/FE10_US.dat new file mode 100644 index 0000000000..8548c32814 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52464545/data/FE10_US.dat differ diff --git a/Data/Sys/Wii/title/00010000/52464545/data/banner.bin b/Data/Sys/Wii/title/00010000/52464545/data/banner.bin new file mode 100644 index 0000000000..8fc86e6157 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52464545/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52484145/content/title.tmd b/Data/Sys/Wii/title/00010000/52484145/content/title.tmd new file mode 100644 index 0000000000..768a2ab1c2 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52484145/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52484145/data/RPParty.dat b/Data/Sys/Wii/title/00010000/52484145/data/RPParty.dat new file mode 100644 index 0000000000..8e98670e2f Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52484145/data/RPParty.dat differ diff --git a/Data/Sys/Wii/title/00010000/52484145/data/banner.bin b/Data/Sys/Wii/title/00010000/52484145/data/banner.bin new file mode 100644 index 0000000000..3e7f9280a5 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52484145/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/524b3245/content/title.tmd b/Data/Sys/Wii/title/00010000/524b3245/content/title.tmd new file mode 100644 index 0000000000..071b875430 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3245/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/524b3245/data/banner.bin b/Data/Sys/Wii/title/00010000/524b3245/data/banner.bin new file mode 100644 index 0000000000..cf5b1ad5d3 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3245/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/524b3245/data/save.dat b/Data/Sys/Wii/title/00010000/524b3245/data/save.dat new file mode 100644 index 0000000000..b027fd2195 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3245/data/save.dat differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/content/title.tmd b/Data/Sys/Wii/title/00010000/524b3545/content/title.tmd new file mode 100644 index 0000000000..dd24dabcb3 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/FLF.bin b/Data/Sys/Wii/title/00010000/524b3545/data/FLF.bin new file mode 100644 index 0000000000..826556a2db Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/FLF.bin differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_00.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_00.jpg new file mode 100644 index 0000000000..cd6b5e9fbf Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_00.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_01.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_01.jpg new file mode 100644 index 0000000000..6dbfc2b57d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_01.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_02.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_02.jpg new file mode 100644 index 0000000000..467e330b2f Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_02.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_03.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_03.jpg new file mode 100644 index 0000000000..62a0e8b410 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_03.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_04.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_04.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_04.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_05.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_05.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_05.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_06.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_06.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_06.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_07.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_07.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_07.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_08.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_08.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_08.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_09.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_09.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_0_09.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_00.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_00.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_00.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_01.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_01.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_01.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_02.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_02.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_02.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_03.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_03.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_03.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_04.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_04.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_04.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_05.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_05.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_05.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_06.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_06.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_06.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_07.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_07.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_07.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_08.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_08.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_08.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_09.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_09.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_1_09.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_00.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_00.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_00.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_01.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_01.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_01.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_02.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_02.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_02.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_03.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_03.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_03.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_04.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_04.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_04.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_05.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_05.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_05.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_06.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_06.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_06.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_07.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_07.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_07.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_08.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_08.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_08.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_09.jpg b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_09.jpg new file mode 100644 index 0000000000..45ed7f151e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/GF_2_09.jpg differ diff --git a/Data/Sys/Wii/title/00010000/524b3545/data/banner.bin b/Data/Sys/Wii/title/00010000/524b3545/data/banner.bin new file mode 100644 index 0000000000..4cfd4a7c1b Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524b3545/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/524d3845/content/title.tmd b/Data/Sys/Wii/title/00010000/524d3845/content/title.tmd new file mode 100644 index 0000000000..e6c599d20e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d3845/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/524d3845/data/banner.bin b/Data/Sys/Wii/title/00010000/524d3845/data/banner.bin new file mode 100644 index 0000000000..4601762fc8 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d3845/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/524d3845/data/mp8save.bin b/Data/Sys/Wii/title/00010000/524d3845/data/mp8save.bin new file mode 100644 index 0000000000..17373fd756 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d3845/data/mp8save.bin differ diff --git a/Data/Sys/Wii/title/00010000/524d4245/content/title.tmd b/Data/Sys/Wii/title/00010000/524d4245/content/title.tmd new file mode 100644 index 0000000000..f354aaac1d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4245/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/524d4245/data/banner.bin b/Data/Sys/Wii/title/00010000/524d4245/data/banner.bin new file mode 100644 index 0000000000..56baa5659a Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4245/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/524d4245/data/gamedata b/Data/Sys/Wii/title/00010000/524d4245/data/gamedata new file mode 100644 index 0000000000..cb05a59712 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4245/data/gamedata differ diff --git a/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_0 b/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_0 new file mode 100644 index 0000000000..2593561545 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_0 differ diff --git a/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_1 b/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_1 new file mode 100644 index 0000000000..029411a72a Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_1 differ diff --git a/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_2 b/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_2 new file mode 100644 index 0000000000..029411a72a Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4245/data/oekaki_2 differ diff --git a/Data/Sys/Wii/title/00010000/524d4745/content/title.tmd b/Data/Sys/Wii/title/00010000/524d4745/content/title.tmd new file mode 100644 index 0000000000..f33a74182c Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4745/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/524d4745/data/GameData.bin b/Data/Sys/Wii/title/00010000/524d4745/data/GameData.bin new file mode 100644 index 0000000000..1611373a52 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4745/data/GameData.bin differ diff --git a/Data/Sys/Wii/title/00010000/524d4745/data/banner.bin b/Data/Sys/Wii/title/00010000/524d4745/data/banner.bin new file mode 100644 index 0000000000..804db6f6c4 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524d4745/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/524f4445/content/title.tmd b/Data/Sys/Wii/title/00010000/524f4445/content/title.tmd new file mode 100644 index 0000000000..dee556669f Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524f4445/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/524f4445/data/SAVE0 b/Data/Sys/Wii/title/00010000/524f4445/data/SAVE0 new file mode 100644 index 0000000000..40434b346d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524f4445/data/SAVE0 differ diff --git a/Data/Sys/Wii/title/00010000/524f4445/data/SAVE1 b/Data/Sys/Wii/title/00010000/524f4445/data/SAVE1 new file mode 100644 index 0000000000..87907689ab Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524f4445/data/SAVE1 differ diff --git a/Data/Sys/Wii/title/00010000/524f4445/data/banner.bin b/Data/Sys/Wii/title/00010000/524f4445/data/banner.bin new file mode 100644 index 0000000000..6ee9cf747c Binary files /dev/null and b/Data/Sys/Wii/title/00010000/524f4445/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52524245/content/title.tmd b/Data/Sys/Wii/title/00010000/52524245/content/title.tmd new file mode 100644 index 0000000000..3fef8bf05d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52524245/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52524245/data/RIV_SAV_FILE b/Data/Sys/Wii/title/00010000/52524245/data/RIV_SAV_FILE new file mode 100644 index 0000000000..4f38955b39 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52524245/data/RIV_SAV_FILE differ diff --git a/Data/Sys/Wii/title/00010000/52524245/data/banner.bin b/Data/Sys/Wii/title/00010000/52524245/data/banner.bin new file mode 100644 index 0000000000..f490ef192c Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52524245/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/content/title.tmd b/Data/Sys/Wii/title/00010000/52534d45/content/title.tmd new file mode 100644 index 0000000000..001c571e2d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/RPL061123001 b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061123001 new file mode 100644 index 0000000000..20598a93b3 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061123001 differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/RPL061124001 b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061124001 new file mode 100644 index 0000000000..4ceb2b083b Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061124001 differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/RPL061124002 b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061124002 new file mode 100644 index 0000000000..b147d389f7 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061124002 differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/RPL061206001 b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061206001 new file mode 100644 index 0000000000..cf0c2cae80 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061206001 differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/RPL061208001 b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061208001 new file mode 100644 index 0000000000..d495017fec Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/RPL061208001 differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/SYSTEM b/Data/Sys/Wii/title/00010000/52534d45/data/SYSTEM new file mode 100644 index 0000000000..94f5e2c9e5 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/SYSTEM differ diff --git a/Data/Sys/Wii/title/00010000/52534d45/data/banner.bin b/Data/Sys/Wii/title/00010000/52534d45/data/banner.bin new file mode 100644 index 0000000000..e961dc558b Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52534d45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52535045/content/title.tmd b/Data/Sys/Wii/title/00010000/52535045/content/title.tmd new file mode 100644 index 0000000000..fcccec920e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52535045/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52535045/data/RPSports.dat b/Data/Sys/Wii/title/00010000/52535045/data/RPSports.dat new file mode 100644 index 0000000000..8f3b58a0c7 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52535045/data/RPSports.dat differ diff --git a/Data/Sys/Wii/title/00010000/52535045/data/banner.bin b/Data/Sys/Wii/title/00010000/52535045/data/banner.bin new file mode 100644 index 0000000000..41aa324eed Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52535045/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/52545a45/content/title.tmd b/Data/Sys/Wii/title/00010000/52545a45/content/title.tmd new file mode 100644 index 0000000000..77519e543a Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52545a45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/52545a45/data/ZACKANDWIKI b/Data/Sys/Wii/title/00010000/52545a45/data/ZACKANDWIKI new file mode 100644 index 0000000000..b7756054ac Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52545a45/data/ZACKANDWIKI differ diff --git a/Data/Sys/Wii/title/00010000/52545a45/data/banner.bin b/Data/Sys/Wii/title/00010000/52545a45/data/banner.bin new file mode 100644 index 0000000000..4fa6332990 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/52545a45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53423445/content/title.tmd b/Data/Sys/Wii/title/00010000/53423445/content/title.tmd new file mode 100644 index 0000000000..4a03348221 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53423445/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/53423445/data/GameData.bin b/Data/Sys/Wii/title/00010000/53423445/data/GameData.bin new file mode 100644 index 0000000000..9a5eebd2a5 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53423445/data/GameData.bin differ diff --git a/Data/Sys/Wii/title/00010000/53423445/data/banner.bin b/Data/Sys/Wii/title/00010000/53423445/data/banner.bin new file mode 100644 index 0000000000..61dea101a0 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53423445/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53463845/content/title.tmd b/Data/Sys/Wii/title/00010000/53463845/content/title.tmd new file mode 100644 index 0000000000..c06c81fdcc Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53463845/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/53463845/data/banner.bin b/Data/Sys/Wii/title/00010000/53463845/data/banner.bin new file mode 100644 index 0000000000..9fe00eaa6a Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53463845/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53463845/data/save.bin b/Data/Sys/Wii/title/00010000/53463845/data/save.bin new file mode 100644 index 0000000000..f9dccf3728 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53463845/data/save.bin differ diff --git a/Data/Sys/Wii/title/00010000/534d4e45/content/title.tmd b/Data/Sys/Wii/title/00010000/534d4e45/content/title.tmd new file mode 100644 index 0000000000..3b031605ba Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534d4e45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/534d4e45/data/banner.bin b/Data/Sys/Wii/title/00010000/534d4e45/data/banner.bin new file mode 100644 index 0000000000..8837857f9b Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534d4e45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/534d4e45/data/wiimj2d.sav b/Data/Sys/Wii/title/00010000/534d4e45/data/wiimj2d.sav new file mode 100644 index 0000000000..c3a17e5372 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534d4e45/data/wiimj2d.sav differ diff --git a/Data/Sys/Wii/title/00010000/534f4a45/content/title.tmd b/Data/Sys/Wii/title/00010000/534f4a45/content/title.tmd new file mode 100644 index 0000000000..cdb18157d2 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4a45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/534f4a45/data/banner.bin b/Data/Sys/Wii/title/00010000/534f4a45/data/banner.bin new file mode 100644 index 0000000000..1d26d00304 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4a45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/534f4a45/data/slot_0.sav b/Data/Sys/Wii/title/00010000/534f4a45/data/slot_0.sav new file mode 100644 index 0000000000..d53d8a4c5c Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4a45/data/slot_0.sav differ diff --git a/Data/Sys/Wii/title/00010000/534f4a45/data/slot_1.sav b/Data/Sys/Wii/title/00010000/534f4a45/data/slot_1.sav new file mode 100644 index 0000000000..ef3705ea4f Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4a45/data/slot_1.sav differ diff --git a/Data/Sys/Wii/title/00010000/534f4a45/data/slot_2.sav b/Data/Sys/Wii/title/00010000/534f4a45/data/slot_2.sav new file mode 100644 index 0000000000..ef3705ea4f Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4a45/data/slot_2.sav differ diff --git a/Data/Sys/Wii/title/00010000/534f4d45/content/title.tmd b/Data/Sys/Wii/title/00010000/534f4d45/content/title.tmd new file mode 100644 index 0000000000..e797a48b53 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4d45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/534f4d45/data/Riq.dat b/Data/Sys/Wii/title/00010000/534f4d45/data/Riq.dat new file mode 100644 index 0000000000..8788883f38 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4d45/data/Riq.dat differ diff --git a/Data/Sys/Wii/title/00010000/534f4d45/data/banner.bin b/Data/Sys/Wii/title/00010000/534f4d45/data/banner.bin new file mode 100644 index 0000000000..43052bfb47 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/534f4d45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53535145/content/title.tmd b/Data/Sys/Wii/title/00010000/53535145/content/title.tmd new file mode 100644 index 0000000000..b9f7373c2b Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53535145/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/53535145/data/banner.bin b/Data/Sys/Wii/title/00010000/53535145/data/banner.bin new file mode 100644 index 0000000000..7355c21a00 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53535145/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53535145/data/save.dat b/Data/Sys/Wii/title/00010000/53535145/data/save.dat new file mode 100644 index 0000000000..1ed17fb54e Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53535145/data/save.dat differ diff --git a/Data/Sys/Wii/title/00010000/53543745/content/title.tmd b/Data/Sys/Wii/title/00010000/53543745/content/title.tmd new file mode 100644 index 0000000000..97504df076 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53543745/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/53543745/data/banner.bin b/Data/Sys/Wii/title/00010000/53543745/data/banner.bin new file mode 100644 index 0000000000..48b1f2c0ea Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53543745/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53543745/data/system.dat b/Data/Sys/Wii/title/00010000/53543745/data/system.dat new file mode 100644 index 0000000000..4e4e493570 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53543745/data/system.dat differ diff --git a/Data/Sys/Wii/title/00010000/53543745/data/user.dat b/Data/Sys/Wii/title/00010000/53543745/data/user.dat new file mode 100644 index 0000000000..2d8cee8c2d Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53543745/data/user.dat differ diff --git a/Data/Sys/Wii/title/00010000/53554b45/content/title.tmd b/Data/Sys/Wii/title/00010000/53554b45/content/title.tmd new file mode 100644 index 0000000000..02650e5f87 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53554b45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/53554b45/data/banner.bin b/Data/Sys/Wii/title/00010000/53554b45/data/banner.bin new file mode 100644 index 0000000000..d6af949368 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53554b45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53554b45/data/savedata.dat b/Data/Sys/Wii/title/00010000/53554b45/data/savedata.dat new file mode 100644 index 0000000000..68465b09f7 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53554b45/data/savedata.dat differ diff --git a/Data/Sys/Wii/title/00010000/53555045/content/title.tmd b/Data/Sys/Wii/title/00010000/53555045/content/title.tmd new file mode 100644 index 0000000000..8c50281744 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53555045/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010000/53555045/data/banner.bin b/Data/Sys/Wii/title/00010000/53555045/data/banner.bin new file mode 100644 index 0000000000..a40d12f2ce Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53555045/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010000/53555045/data/wiiparty.bin b/Data/Sys/Wii/title/00010000/53555045/data/wiiparty.bin new file mode 100644 index 0000000000..7f1d5f9821 Binary files /dev/null and b/Data/Sys/Wii/title/00010000/53555045/data/wiiparty.bin differ diff --git a/Data/Sys/Wii/title/00010001/4e415a45/data/EEP_NMWE b/Data/Sys/Wii/title/00010001/4e415a45/data/EEP_NMWE new file mode 100644 index 0000000000..8131fe8bb4 Binary files /dev/null and b/Data/Sys/Wii/title/00010001/4e415a45/data/EEP_NMWE differ diff --git a/Data/Sys/Wii/title/00010001/4e415a45/data/banner.bin b/Data/Sys/Wii/title/00010001/4e415a45/data/banner.bin new file mode 100644 index 0000000000..a2d97ef492 Binary files /dev/null and b/Data/Sys/Wii/title/00010001/4e415a45/data/banner.bin differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/00000022.app b/Data/Sys/Wii/title/00010002/48414241/content/00000022.app new file mode 100644 index 0000000000..0cdda6d467 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/00000022.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/00000032.app b/Data/Sys/Wii/title/00010002/48414241/content/00000032.app new file mode 100644 index 0000000000..72f5103102 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/00000032.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/0000003a.app b/Data/Sys/Wii/title/00010002/48414241/content/0000003a.app new file mode 100644 index 0000000000..8985a99d86 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/0000003a.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/0000004c.app b/Data/Sys/Wii/title/00010002/48414241/content/0000004c.app new file mode 100644 index 0000000000..283bf9c0fc Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/0000004c.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/0000004f.app b/Data/Sys/Wii/title/00010002/48414241/content/0000004f.app new file mode 100644 index 0000000000..4396d1844c Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/0000004f.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/00000050.app b/Data/Sys/Wii/title/00010002/48414241/content/00000050.app new file mode 100644 index 0000000000..0c4525bb45 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/00000050.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/00000051.app b/Data/Sys/Wii/title/00010002/48414241/content/00000051.app new file mode 100644 index 0000000000..3935fe84c1 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/00000051.app differ diff --git a/Data/Sys/Wii/title/00010002/48414241/content/title.tmd b/Data/Sys/Wii/title/00010002/48414241/content/title.tmd new file mode 100644 index 0000000000..c8f88c233e Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414241/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010002/48414341/content/00000016.app b/Data/Sys/Wii/title/00010002/48414341/content/00000016.app new file mode 100644 index 0000000000..1ba80e1a1a Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414341/content/00000016.app differ diff --git a/Data/Sys/Wii/title/00010002/48414341/content/00000017.app b/Data/Sys/Wii/title/00010002/48414341/content/00000017.app new file mode 100644 index 0000000000..0c4bc9dd4a Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414341/content/00000017.app differ diff --git a/Data/Sys/Wii/title/00010002/48414341/content/00000018.app b/Data/Sys/Wii/title/00010002/48414341/content/00000018.app new file mode 100644 index 0000000000..ec48896395 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414341/content/00000018.app differ diff --git a/Data/Sys/Wii/title/00010002/48414341/content/00000019.app b/Data/Sys/Wii/title/00010002/48414341/content/00000019.app new file mode 100644 index 0000000000..73ed752876 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414341/content/00000019.app differ diff --git a/Data/Sys/Wii/title/00010002/48414341/content/title.tmd b/Data/Sys/Wii/title/00010002/48414341/content/title.tmd new file mode 100644 index 0000000000..97d2eb8591 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414341/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010002/48414341/data/NigaoeCh.dat b/Data/Sys/Wii/title/00010002/48414341/data/NigaoeCh.dat new file mode 100644 index 0000000000..dcbcf2eba2 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414341/data/NigaoeCh.dat differ diff --git a/Data/Sys/Wii/title/00010002/48414641/content/00000001.app b/Data/Sys/Wii/title/00010002/48414641/content/00000001.app new file mode 100644 index 0000000000..b7d945afa6 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414641/content/00000001.app differ diff --git a/Data/Sys/Wii/title/00010002/48414641/content/00000002.app b/Data/Sys/Wii/title/00010002/48414641/content/00000002.app new file mode 100644 index 0000000000..73de877d35 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414641/content/00000002.app differ diff --git a/Data/Sys/Wii/title/00010002/48414641/content/00000003.app b/Data/Sys/Wii/title/00010002/48414641/content/00000003.app new file mode 100644 index 0000000000..65af4089f0 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414641/content/00000003.app differ diff --git a/Data/Sys/Wii/title/00010002/48414641/content/title.tmd b/Data/Sys/Wii/title/00010002/48414641/content/title.tmd new file mode 100644 index 0000000000..f0317fba3c Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414641/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/0000000a.app b/Data/Sys/Wii/title/00010002/48414645/content/0000000a.app new file mode 100644 index 0000000000..5fab305608 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/0000000a.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/0000000c.app b/Data/Sys/Wii/title/00010002/48414645/content/0000000c.app new file mode 100644 index 0000000000..33a3356c3b Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/0000000d.app b/Data/Sys/Wii/title/00010002/48414645/content/0000000d.app new file mode 100644 index 0000000000..c5472b6645 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/0000000d.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/0000000e.app b/Data/Sys/Wii/title/00010002/48414645/content/0000000e.app new file mode 100644 index 0000000000..c10c03bdae Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/0000000e.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/0000000f.app b/Data/Sys/Wii/title/00010002/48414645/content/0000000f.app new file mode 100644 index 0000000000..51b2db01e8 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/0000000f.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/00000010.app b/Data/Sys/Wii/title/00010002/48414645/content/00000010.app new file mode 100644 index 0000000000..9934978ff8 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/00000010.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/00000011.app b/Data/Sys/Wii/title/00010002/48414645/content/00000011.app new file mode 100644 index 0000000000..09cac54901 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/00000011.app differ diff --git a/Data/Sys/Wii/title/00010002/48414645/content/title.tmd b/Data/Sys/Wii/title/00010002/48414645/content/title.tmd new file mode 100644 index 0000000000..993c9d8b2a Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414645/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010002/48414741/content/00000001.app b/Data/Sys/Wii/title/00010002/48414741/content/00000001.app new file mode 100644 index 0000000000..b7d945afa6 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414741/content/00000001.app differ diff --git a/Data/Sys/Wii/title/00010002/48414741/content/00000002.app b/Data/Sys/Wii/title/00010002/48414741/content/00000002.app new file mode 100644 index 0000000000..3c3062a697 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414741/content/00000002.app differ diff --git a/Data/Sys/Wii/title/00010002/48414741/content/00000003.app b/Data/Sys/Wii/title/00010002/48414741/content/00000003.app new file mode 100644 index 0000000000..65af4089f0 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414741/content/00000003.app differ diff --git a/Data/Sys/Wii/title/00010002/48414741/content/title.tmd b/Data/Sys/Wii/title/00010002/48414741/content/title.tmd new file mode 100644 index 0000000000..37cc14c851 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414741/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/0000000a.app b/Data/Sys/Wii/title/00010002/48414745/content/0000000a.app new file mode 100644 index 0000000000..1d446ea32d Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/0000000a.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/0000000b.app b/Data/Sys/Wii/title/00010002/48414745/content/0000000b.app new file mode 100644 index 0000000000..074deb9bb3 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/0000000b.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/0000000c.app b/Data/Sys/Wii/title/00010002/48414745/content/0000000c.app new file mode 100644 index 0000000000..9e31ea19d5 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/0000000d.app b/Data/Sys/Wii/title/00010002/48414745/content/0000000d.app new file mode 100644 index 0000000000..9b208722f8 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/0000000d.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/00000011.app b/Data/Sys/Wii/title/00010002/48414745/content/00000011.app new file mode 100644 index 0000000000..2c7b802c54 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/00000011.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/00000012.app b/Data/Sys/Wii/title/00010002/48414745/content/00000012.app new file mode 100644 index 0000000000..f417053ad1 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/00000012.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/00000013.app b/Data/Sys/Wii/title/00010002/48414745/content/00000013.app new file mode 100644 index 0000000000..09cac54901 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/00000013.app differ diff --git a/Data/Sys/Wii/title/00010002/48414745/content/title.tmd b/Data/Sys/Wii/title/00010002/48414745/content/title.tmd new file mode 100644 index 0000000000..6f0c10f7c2 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48414745/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/0000000e.app b/Data/Sys/Wii/title/00010002/48415941/content/0000000e.app new file mode 100644 index 0000000000..21fbb6b7d1 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/0000000e.app differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/0000000f.app b/Data/Sys/Wii/title/00010002/48415941/content/0000000f.app new file mode 100644 index 0000000000..3bb262dbd5 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/0000000f.app differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/00000012.app b/Data/Sys/Wii/title/00010002/48415941/content/00000012.app new file mode 100644 index 0000000000..a231f45254 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/00000012.app differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/00000013.app b/Data/Sys/Wii/title/00010002/48415941/content/00000013.app new file mode 100644 index 0000000000..9ddb05ccc6 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/00000013.app differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/00000014.app b/Data/Sys/Wii/title/00010002/48415941/content/00000014.app new file mode 100644 index 0000000000..5b09ebfa48 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/00000014.app differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/00000015.app b/Data/Sys/Wii/title/00010002/48415941/content/00000015.app new file mode 100644 index 0000000000..283bf9c0fc Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/00000015.app differ diff --git a/Data/Sys/Wii/title/00010002/48415941/content/title.tmd b/Data/Sys/Wii/title/00010002/48415941/content/title.tmd new file mode 100644 index 0000000000..5a34153258 Binary files /dev/null and b/Data/Sys/Wii/title/00010002/48415941/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010008/48414b45/content/00000009.app b/Data/Sys/Wii/title/00010008/48414b45/content/00000009.app new file mode 100644 index 0000000000..5a5a8bfae9 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414b45/content/00000009.app differ diff --git a/Data/Sys/Wii/title/00010008/48414b45/content/0000000a.app b/Data/Sys/Wii/title/00010008/48414b45/content/0000000a.app new file mode 100644 index 0000000000..30699e541e Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414b45/content/0000000a.app differ diff --git a/Data/Sys/Wii/title/00010008/48414b45/content/0000000b.app b/Data/Sys/Wii/title/00010008/48414b45/content/0000000b.app new file mode 100644 index 0000000000..fd22525736 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414b45/content/0000000b.app differ diff --git a/Data/Sys/Wii/title/00010008/48414b45/content/0000000c.app b/Data/Sys/Wii/title/00010008/48414b45/content/0000000c.app new file mode 100644 index 0000000000..09cac54901 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414b45/content/0000000c.app differ diff --git a/Data/Sys/Wii/title/00010008/48414b45/content/title.tmd b/Data/Sys/Wii/title/00010008/48414b45/content/title.tmd new file mode 100644 index 0000000000..1f9241bdf3 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414b45/content/title.tmd differ diff --git a/Data/Sys/Wii/title/00010008/48414c45/content/00000008.app b/Data/Sys/Wii/title/00010008/48414c45/content/00000008.app new file mode 100644 index 0000000000..6b675cd774 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414c45/content/00000008.app differ diff --git a/Data/Sys/Wii/title/00010008/48414c45/content/00000009.app b/Data/Sys/Wii/title/00010008/48414c45/content/00000009.app new file mode 100644 index 0000000000..09548652e7 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414c45/content/00000009.app differ diff --git a/Data/Sys/Wii/title/00010008/48414c45/content/0000000a.app b/Data/Sys/Wii/title/00010008/48414c45/content/0000000a.app new file mode 100644 index 0000000000..1c97615917 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414c45/content/0000000a.app differ diff --git a/Data/Sys/Wii/title/00010008/48414c45/content/0000000b.app b/Data/Sys/Wii/title/00010008/48414c45/content/0000000b.app new file mode 100644 index 0000000000..09cac54901 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414c45/content/0000000b.app differ diff --git a/Data/Sys/Wii/title/00010008/48414c45/content/title.tmd b/Data/Sys/Wii/title/00010008/48414c45/content/title.tmd new file mode 100644 index 0000000000..712f62d637 Binary files /dev/null and b/Data/Sys/Wii/title/00010008/48414c45/content/title.tmd differ diff --git a/Data/User/Styles/Dolphin Dark.qss b/Data/User/Styles/Dolphin Dark.qss new file mode 100644 index 0000000000..0eee71c609 --- /dev/null +++ b/Data/User/Styles/Dolphin Dark.qss @@ -0,0 +1,2218 @@ +/* --------------------------------------------------------------------------- + + WARNING! File created programmatically. All changes made in this file will be lost! + + Created by the qtsass compiler v0.3.1 + + The definitions are in the "qdarkstyle.qss._styles.scss" module + +--------------------------------------------------------------------------- */ +/* Light Style - User/Themes/Dolphin Dark/Resources/ ------------------------------------------ */ +/* + +See Qt documentation: + + - https://doc.qt.io/qt-5/stylesheet.html + - https://doc.qt.io/qt-5/stylesheet-reference.html + - https://doc.qt.io/qt-5/stylesheet-examples.html + +--------------------------------------------------------------------------- */ +/* Reset elements ------------------------------------------------------------ + +Resetting everything helps to unify styles across different operating systems + +--------------------------------------------------------------------------- */ +* { + padding: 0px; + margin: 0px; + border: 0px; + border-style: none; + border-image: none; + outline: 0; +} + +/* specific reset for elements inside QToolBar */ +QToolBar * { + margin: 0px; + padding: 0px; +} + +/* QWidget ---------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QWidget { + background-color: #232325; + border: 0px solid #35373A; + padding: 0px; + color: #E0E1E3; + selection-background-color: #3394D5; + selection-color: #E0E1E3; +} + +QWidget:disabled { + background-color: #232325; + color: #9DA9B5; + selection-background-color: #B2B3B4; + selection-color: #9DA9B5; +} + +QWidget::item:selected { + background-color: #3394D5; +} + +QWidget::item:hover:!selected { + background-color: #35373A; +} + +/* QMainWindow ------------------------------------------------------------ + +This adjusts the splitter in the dock widget, not qsplitter +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmainwindow + +--------------------------------------------------------------------------- */ +QMainWindow::separator { + background-color: #35373A; + border: 0px solid #232325; + spacing: 0px; + padding: 2px; +} + +QMainWindow::separator:hover { + background-color: #8B8C8E; + border: 0px solid #35373A; +} + +QMainWindow::separator:horizontal { + width: 5px; + margin-top: 2px; + margin-bottom: 2px; + image: url("User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical.png"); +} + +QMainWindow::separator:vertical { + height: 5px; + margin-left: 2px; + margin-right: 2px; + image: url("User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal.png"); +} + +/* QToolTip --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtooltip + +--------------------------------------------------------------------------- */ +QToolTip { + background-color: #3394D5; + color: #E0E1E3; + /* If you remove the border property, background stops working on Windows */ + border: none; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Remove opacity, fix #174 - may need to use RGBA */ +} + +/* QStatusBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qstatusbar + +--------------------------------------------------------------------------- */ +QStatusBar { + border: 1px solid #35373A; + /* Fixes Spyder #9120, #9121 */ + background: #35373A; + /* Fixes #205, white vertical borders separating items */ +} + +QStatusBar::item { + border: none; +} + +QStatusBar QToolTip { + background-color: #35373A; + border: 1px solid #232325; + color: #232325; + /* Remove padding, for fix combo box tooltip */ + padding: 0px; + /* Reducing transparency to read better */ + opacity: 230; +} + +QStatusBar QLabel { + /* Fixes Spyder #9120, #9121 */ + background: transparent; +} + +/* QCheckBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcheckbox + +--------------------------------------------------------------------------- */ +QCheckBox { + background-color: #232325; + color: #E0E1E3; + spacing: 4px; + outline: none; + padding-top: 4px; + padding-bottom: 4px; +} + +QCheckBox:focus { + border: none; +} + +QCheckBox QWidget:disabled { + background-color: #232325; + color: #9DA9B5; +} + +QCheckBox::indicator { + margin-left: 2px; + height: 14px; + width: 14px; +} + +QCheckBox::indicator:unchecked { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png"); +} + +QCheckBox::indicator:unchecked:hover, QCheckBox::indicator:unchecked:focus, QCheckBox::indicator:unchecked:pressed { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png"); +} + +QCheckBox::indicator:unchecked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled.png"); +} + +QCheckBox::indicator:checked { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked.png"); +} + +QCheckBox::indicator:checked:hover, QCheckBox::indicator:checked:focus, QCheckBox::indicator:checked:pressed { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png"); +} + +QCheckBox::indicator:checked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled.png"); +} + +QCheckBox::indicator:indeterminate { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate.png"); +} + +QCheckBox::indicator:indeterminate:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled.png"); +} + +QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus.png"); +} + +/* QGroupBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qgroupbox + +--------------------------------------------------------------------------- */ +QGroupBox { + font-weight: bold; + border: 1px solid #35373A; + border-radius: 4px; + padding: 2px; + margin-top: 6px; + margin-bottom: 4px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 4px; + padding-left: 2px; + padding-right: 4px; + padding-top: -4px; +} + +QGroupBox::indicator { + margin-left: 2px; + margin-top: 2px; + padding: 0; + height: 14px; + width: 14px; +} + +QGroupBox::indicator:unchecked { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png"); +} + +QGroupBox::indicator:unchecked:hover, QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png"); +} + +QGroupBox::indicator:unchecked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled.png"); +} + +QGroupBox::indicator:checked { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked.png"); +} + +QGroupBox::indicator:checked:hover, QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png"); +} + +QGroupBox::indicator:checked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled.png"); +} + +/* QRadioButton ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qradiobutton + +--------------------------------------------------------------------------- */ +QRadioButton { + background-color: #232325; + color: #E0E1E3; + spacing: 4px; + padding-top: 4px; + padding-bottom: 4px; + border: none; + outline: none; +} + +QRadioButton:focus { + border: none; +} + +QRadioButton:disabled { + background-color: #232325; + color: #9DA9B5; + border: none; + outline: none; +} + +QRadioButton QWidget { + background-color: #232325; + color: #E0E1E3; + spacing: 0px; + padding: 0px; + outline: none; + border: none; +} + +QRadioButton::indicator { + border: none; + outline: none; + margin-left: 2px; + height: 14px; + width: 14px; +} + +QRadioButton::indicator:unchecked { + image: url("User/Themes/Dolphin Dark/Resources/radio_unchecked.png"); +} + +QRadioButton::indicator:unchecked:hover, QRadioButton::indicator:unchecked:focus, QRadioButton::indicator:unchecked:pressed { + border: none; + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_unchecked_focus.png"); +} + +QRadioButton::indicator:unchecked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled.png"); +} + +QRadioButton::indicator:checked { + border: none; + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_checked.png"); +} + +QRadioButton::indicator:checked:hover, QRadioButton::indicator:checked:focus, QRadioButton::indicator:checked:pressed { + border: none; + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_checked_focus.png"); +} + +QRadioButton::indicator:checked:disabled { + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_checked_disabled.png"); +} + +/* QMenuBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenubar + +--------------------------------------------------------------------------- */ +QMenuBar { + background-color: #232325; + padding: 2px; + border: 1px solid #232325; + color: #E0E1E3; + border-radius: 24px; + selection-background-color: #35373A; +} + +QMenuBar:focus { + border: 1px solid #3394D5; +} + +QMenuBar::item { + background: transparent; + padding: 4px; +} + +QMenuBar::item:selected { + padding: 4px; + background: transparent; + border: 0px solid #35373A; + background-color: #35373A; +} + +QMenuBar::item:pressed { + padding: 4px; + border: 0px solid #35373A; + background-color: #35373A; + color: #E0E1E3; + margin-bottom: 0px; + padding-bottom: 0px; +} + +/* QMenu ------------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qmenu + +--------------------------------------------------------------------------- */ +QMenu { + border: 2px solid #232325; + color: #E0E1E3; + margin: 0px; + border-radius: 24px; + background-color: #232325; + selection-background-color: #232325; +} + +QMenu::separator { + height: 1px; + background-color: #8B8C8E; + color: #E0E1E3; +} + +QMenu::item { + background-color: #232325; + padding: 4px 24px 4px 28px; + /* Reserve space for selection border */ + border: 1px transparent #232325; +} + +QMenu::item:selected { + color: #E0E1E3; + background-color: #35373A; +} + +QMenu::item:pressed { + background-color: #35373A; +} + +QMenu::icon { + padding-left: 10px; + width: 14px; + height: 14px; +} + +QMenu::indicator { + padding-left: 8px; + width: 12px; + height: 12px; + /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ + /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +} + +QMenu::indicator:non-exclusive:unchecked { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png"); +} + +QMenu::indicator:non-exclusive:unchecked:hover, QMenu::indicator:non-exclusive:unchecked:focus, QMenu::indicator:non-exclusive:unchecked:pressed { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png"); +} + +QMenu::indicator:non-exclusive:unchecked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled.png"); +} + +QMenu::indicator:non-exclusive:checked { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked.png"); +} + +QMenu::indicator:non-exclusive:checked:hover, QMenu::indicator:non-exclusive:checked:focus, QMenu::indicator:non-exclusive:checked:pressed { + border: none; + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png"); +} + +QMenu::indicator:non-exclusive:checked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled.png"); +} + +QMenu::indicator:non-exclusive:indeterminate { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate.png"); +} + +QMenu::indicator:non-exclusive:indeterminate:disabled { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled.png"); +} + +QMenu::indicator:non-exclusive:indeterminate:focus, QMenu::indicator:non-exclusive:indeterminate:hover, QMenu::indicator:non-exclusive:indeterminate:pressed { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus.png"); +} + +QMenu::indicator:exclusive:unchecked { + image: url("User/Themes/Dolphin Dark/Resources/radio_unchecked.png"); +} + +QMenu::indicator:exclusive:unchecked:hover, QMenu::indicator:exclusive:unchecked:focus, QMenu::indicator:exclusive:unchecked:pressed { + border: none; + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_unchecked_focus.png"); +} + +QMenu::indicator:exclusive:unchecked:disabled { + image: url("User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled.png"); +} + +QMenu::indicator:exclusive:checked { + border: none; + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_checked.png"); +} + +QMenu::indicator:exclusive:checked:hover, QMenu::indicator:exclusive:checked:focus, QMenu::indicator:exclusive:checked:pressed { + border: none; + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_checked_focus.png"); +} + +QMenu::indicator:exclusive:checked:disabled { + outline: none; + image: url("User/Themes/Dolphin Dark/Resources/radio_checked_disabled.png"); +} + +QMenu::right-arrow { + margin: 5px; + padding-left: 12px; + image: url("User/Themes/Dolphin Dark/Resources/arrow_right.png"); + height: 12px; + width: 12px; +} + +/* QAbstractItemView ------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QAbstractItemView { + alternate-background-color: #232325; + color: #E0E1E3; + border: 1px solid #232325; + border-radius: 4px; +} + +QAbstractItemView QLineEdit { + padding: 2px; +} + +/* QAbstractScrollArea ---------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QAbstractScrollArea { + background-color: #232325; + border: 1px solid #35373A; + border-radius: 4px; + /* fix #159 */ + padding: 2px; + /* remove min-height to fix #244 */ + color: #E0E1E3; +} + +QAbstractScrollArea:disabled { + color: #9DA9B5; +} + +/* QScrollArea ------------------------------------------------------------ + +--------------------------------------------------------------------------- */ +QScrollArea QWidget QWidget:disabled { + background-color: #232325; +} + +/* QScrollBar ------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qscrollbar + +--------------------------------------------------------------------------- */ +QScrollBar:horizontal { + height: 16px; + margin: 2px 16px 2px 16px; + border: 1px solid #35373A; + border-radius: 4px; + background-color: #232325; +} + +QScrollBar:vertical { + background-color: #232325; + width: 16px; + margin: 16px 2px 16px 2px; + border: 1px solid #35373A; + border-radius: 4px; +} + +QScrollBar::handle:horizontal { + background-color: #8B8C8E; + border: 1px solid #35373A; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:hover { + background-color: #3394D5; + border: #3394D5; + border-radius: 4px; + min-width: 8px; +} + +QScrollBar::handle:horizontal:focus { + border: 1px solid #35373A; +} + +QScrollBar::handle:vertical { + background-color: #8B8C8E; + border: 1px solid #35373A; + min-height: 8px; + border-radius: 4px; +} + +QScrollBar::handle:vertical:hover { + background-color: #3394D5; + border: #3394D5; + border-radius: 4px; + min-height: 8px; +} + +QScrollBar::handle:vertical:focus { + border: 1px solid #35373A; +} + +QScrollBar::add-line:horizontal { + margin: 0px 0px 0px 0px; + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_right_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover, QScrollBar::add-line:horizontal:on { + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_right.png"); + height: 12px; + width: 12px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); + height: 12px; + width: 12px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + margin: 0px 3px 0px 3px; + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_left_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_left.png"); + height: 12px; + width: 12px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + margin: 3px 0px 3px 0px; + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_up_disabled.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover, QScrollBar::sub-line:vertical:on { + border-image: url("User/Themes/Dolphin Dark/Resources/arrow_up.png"); + height: 12px; + width: 12px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal { + background: none; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + background: none; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} + +/* QTextEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-specific-widgets + +--------------------------------------------------------------------------- */ +QTextEdit { + background-color: #232325; + color: #E0E1E3; + border-radius: 4px; + border: 1px solid #35373A; +} + +QTextEdit:focus { + border: 1px solid #35373A; +} + +QTextEdit:selected { + background: #3394D5; + color: #35373A; +} + +/* QPlainTextEdit --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QPlainTextEdit { + background-color: #232325; + color: #E0E1E3; + border-radius: 4px; + border: 1px solid #35373A; +} + +QPlainTextEdit:focus { + border: 1px solid #35373A; +} + +QPlainTextEdit:selected { + background: #3394D5; + color: #35373A; +} + +/* QSizeGrip -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsizegrip + +--------------------------------------------------------------------------- */ +QSizeGrip { + background: transparent; + width: 12px; + height: 12px; + image: url("User/Themes/Dolphin Dark/Resources/window_grip.png"); +} + +/* QStackedWidget --------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QStackedWidget { + padding: 2px; + border: 1px solid #35373A; + border: 1px solid #232325; +} + +/* QToolBar --------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbar + +--------------------------------------------------------------------------- */ +QToolBar { + background-color: #232325; + border-bottom: 4px solid #232325; + padding: 4px; + font-weight: bold; + spacing: 2px; +} + +QToolBar:disabled { + /* Fixes #272 */ + background-color: #232325; +} + +QToolBar::handle:horizontal { + width: 16px; + image: url("User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal.png"); +} + +QToolBar::handle:vertical { + height: 16px; + image: url("User/Themes/Dolphin Dark/Resources/toolbar_move_vertical.png"); +} + +QToolBar::separator:horizontal { + width: 16px; + image: url("User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal.png"); +} + +QToolBar::separator:vertical { + height: 16px; + image: url("User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical.png"); +} + +QToolButton#qt_toolbar_ext_button { + background: #35373A; + border: 0px; + color: #E0E1E3; + image: url("User/Themes/Dolphin Dark/Resources/arrow_right.png"); +} + +/* QAbstractSpinBox ------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractSpinBox { + background-color: #232325; + border: 1px solid #35373A; + color: #E0E1E3; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + border-radius: 4px; + /* min-width: 5px; removed to fix 109 */ +} + +QAbstractSpinBox:up-button { + background-color: transparent #232325; + subcontrol-origin: border; + subcontrol-position: top right; + border-left: 1px solid #35373A; + border-bottom: 1px solid #35373A; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-bottom: -1px; +} + +QAbstractSpinBox::up-arrow, QAbstractSpinBox::up-arrow:disabled, QAbstractSpinBox::up-arrow:off { + image: url("User/Themes/Dolphin Dark/Resources/arrow_up_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::up-arrow:hover { + image: url("User/Themes/Dolphin Dark/Resources/arrow_up.png"); +} + +QAbstractSpinBox:down-button { + background-color: transparent #232325; + subcontrol-origin: border; + subcontrol-position: bottom right; + border-left: 1px solid #35373A; + border-top: 1px solid #35373A; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 1px; + width: 12px; + margin-top: -1px; +} + +QAbstractSpinBox::down-arrow, QAbstractSpinBox::down-arrow:disabled, QAbstractSpinBox::down-arrow:off { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QAbstractSpinBox::down-arrow:hover { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); +} + +QAbstractSpinBox:hover { + border: 1px solid #3394D5; + color: #E0E1E3; +} + +QAbstractSpinBox:focus { + border: 1px solid #35373A; +} + +QAbstractSpinBox:selected { + background: #3394D5; + color: #35373A; +} + +/* ------------------------------------------------------------------------ */ +/* DISPLAYS --------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QLabel ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe + +--------------------------------------------------------------------------- */ +QLabel { + background-color: #232325; + border: 0px solid #35373A; + padding: 2px; + margin: 0px; + color: #E0E1E3; +} + +QLabel:disabled { + background-color: #232325; + border: 0px solid #35373A; + color: #9DA9B5; +} + +/* QTextBrowser ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qabstractscrollarea + +--------------------------------------------------------------------------- */ +QTextBrowser { + background-color: #232325; + border: 1px solid #35373A; + color: #E0E1E3; + border-radius: 4px; +} + +QTextBrowser:disabled { + background-color: #232325; + border: 1px solid #35373A; + color: #9DA9B5; + border-radius: 4px; +} + +QTextBrowser:hover, QTextBrowser:!hover, QTextBrowser:selected, QTextBrowser:pressed { + border: 1px solid #35373A; +} + +/* QGraphicsView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QGraphicsView { + background-color: #232325; + border: 1px solid #35373A; + color: #E0E1E3; + border-radius: 4px; +} + +QGraphicsView:disabled { + background-color: #232325; + border: 1px solid #35373A; + color: #9DA9B5; + border-radius: 4px; +} + +QGraphicsView:hover, QGraphicsView:!hover, QGraphicsView:selected, QGraphicsView:pressed { + border: 1px solid #35373A; +} + +/* QCalendarWidget -------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCalendarWidget { + border: 1px solid #35373A; + border-radius: 4px; +} + +QCalendarWidget:disabled { + background-color: #232325; + color: #9DA9B5; +} + +/* QLCDNumber ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QLCDNumber { + background-color: #232325; + color: #E0E1E3; +} + +QLCDNumber:disabled { + background-color: #232325; + color: #9DA9B5; +} + +/* QProgressBar ----------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qprogressbar + +--------------------------------------------------------------------------- */ +QProgressBar { + background-color: #232325; + border: 1px solid #35373A; + color: #E0E1E3; + border-radius: 4px; + text-align: center; +} + +QProgressBar:disabled { + background-color: #232325; + border: 1px solid #35373A; + color: #9DA9B5; + border-radius: 4px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #3394D5; + color: #232325; + border-radius: 4px; +} + +QProgressBar::chunk:disabled { + background-color: #3394D5; + color: #9DA9B5; + border-radius: 4px; +} + +/* ------------------------------------------------------------------------ */ +/* BUTTONS ---------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QPushButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qpushbutton + +--------------------------------------------------------------------------- */ +QPushButton { + background-color: #35373A; + color: #E0E1E3; + border-radius: 4px; + padding: 2px; + outline: none; + border: none; +} + +QPushButton:disabled { + background-color: #35373A; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; +} + +QPushButton:checked { + background-color: #8B8C8E; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QPushButton:checked:disabled { + background-color: #8B8C8E; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QPushButton:checked:selected { + background: #8B8C8E; +} + +QPushButton:hover { + background-color: #3394D5; + color: #E0E1E3; +} + +QPushButton:pressed { + background-color: #8B8C8E; +} + +QPushButton:selected { + background: #8B8C8E; + color: #E0E1E3; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + bottom: 4px; +} + +QDialogButtonBox QPushButton { + /* Issue #194 #248 - Special case of QPushButton inside dialogs, for better UI */ + min-width: 80px; +} + +/* QToolButton ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbutton + +--------------------------------------------------------------------------- */ +QToolButton { + background-color: #232325; + color: #E0E1E3; + border-radius: 4px; + padding: 2px; + outline: none; + border: none; + /* The subcontrols below are used only in the DelayedPopup mode */ + /* The subcontrols below are used only in the MenuButtonPopup mode */ + /* The subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +} + +QToolButton:disabled { + background-color: #232325; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; +} + +QToolButton:checked { + background-color: #8B8C8E; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QToolButton:checked:disabled { + background-color: #232325; + color: #9DA9B5; + border-radius: 4px; + padding: 2px; + outline: none; +} + +QToolButton:checked:hover { + background-color: #3394D5; + color: #E0E1E3; +} + +QToolButton:checked:pressed { + background-color: #8B8C8E; +} + +QToolButton:checked:selected { + background: #8B8C8E; + color: #E0E1E3; +} + +QToolButton:hover { + background-color: #3394D5; + color: #E0E1E3; +} + +QToolButton:pressed { + background-color: #8B8C8E; +} + +QToolButton:selected { + background: #8B8C8E; + color: #E0E1E3; +} + +QToolButton[popupMode="0"] { + /* Only for DelayedPopup */ + padding-right: 2px; +} + +QToolButton[popupMode="1"] { + /* Only for MenuButtonPopup */ + padding-right: 20px; +} + +QToolButton[popupMode="1"]::menu-button { + border: none; +} + +QToolButton[popupMode="1"]::menu-button:hover { + border: none; + border-left: 1px solid #35373A; + border-radius: 0; +} + +QToolButton[popupMode="2"] { + /* Only for InstantPopup */ + padding-right: 2px; +} + +QToolButton::menu-button { + padding: 2px; + border-radius: 4px; + width: 12px; + border: none; + outline: none; +} + +QToolButton::menu-button:hover { + border: 1px solid #3394D5; +} + +QToolButton::menu-button:checked:hover { + border: 1px solid #3394D5; +} + +QToolButton::menu-indicator { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); + height: 8px; + width: 8px; + top: 0; + /* Exclude a shift for better image */ + left: -2px; + /* Shift it a bit */ +} + +QToolButton::menu-arrow { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); + height: 8px; + width: 8px; +} + +QToolButton::menu-arrow:hover { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down_focus.png"); +} + +/* QCommandLinkButton ----------------------------------------------------- + +--------------------------------------------------------------------------- */ +QCommandLinkButton { + background-color: transparent; + border: 1px solid #35373A; + color: #E0E1E3; + border-radius: 4px; + padding: 0px; + margin: 0px; +} + +QCommandLinkButton:disabled { + background-color: transparent; + color: #9DA9B5; +} + +/* ------------------------------------------------------------------------ */ +/* INPUTS - NO FIELDS ----------------------------------------------------- */ +/* ------------------------------------------------------------------------ */ +/* QComboBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qcombobox + +--------------------------------------------------------------------------- */ +QComboBox { + border: 1px solid #35373A; + border-radius: 4px; + selection-background-color: #3394D5; + padding-left: 4px; + padding-right: 4px; + /* padding-right = 36; 4 + 16*2 See scrollbar size */ + /* changed to 4px to fix #239 */ + /* Fixes #103, #111 */ + min-height: 1.5em; + /* padding-top: 2px; removed to fix #132 */ + /* padding-bottom: 2px; removed to fix #132 */ + /* min-width: 75px; removed to fix #109 */ + /* Needed to remove indicator - fix #132 */ +} + +QComboBox QAbstractItemView { + border: 1px solid #35373A; + border-radius: 0; + background-color: #232325; + selection-background-color: #3394D5; +} + +QComboBox QAbstractItemView:hover { + background-color: #232325; + color: #E0E1E3; +} + +QComboBox QAbstractItemView:selected { + background: #3394D5; + color: #35373A; +} + +QComboBox QAbstractItemView:alternate { + background: #232325; +} + +QComboBox:disabled { + background-color: #232325; + color: #9DA9B5; +} + +QComboBox:hover { + border: 1px solid #3394D5; +} + +QComboBox:focus { + border: 1px solid #35373A; +} + +QComboBox:on { + selection-background-color: #3394D5; +} + +QComboBox::indicator { + border: none; + border-radius: 0; + background-color: transparent; + selection-background-color: transparent; + color: transparent; + selection-color: transparent; + /* Needed to remove indicator - fix #132 */ +} + +QComboBox::indicator:alternate { + background: #232325; +} + +QComboBox::item { + /* Remove to fix #282, #285 and MR #288*/ + /*&:checked { + font-weight: bold; + } + + &:selected { + border: 0px solid transparent; + } + */ +} + +QComboBox::item:alternate { + background: #232325; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #35373A; +} + +QComboBox::down-arrow { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); +} + +/* QSlider ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qslider + +--------------------------------------------------------------------------- */ +QSlider:disabled { + background: #232325; +} + +QSlider:focus { + border: none; +} + +QSlider::groove:horizontal { + background: #35373A; + border: 1px solid #35373A; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::groove:vertical { + background: #35373A; + border: 1px solid #35373A; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical { + background: #3394D5; + border: 1px solid #35373A; + width: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::add-page:vertical :disabled { + background: #3394D5; +} + +QSlider::sub-page:horizontal { + background: #3394D5; + border: 1px solid #35373A; + height: 4px; + margin: 0px; + border-radius: 4px; +} + +QSlider::sub-page:horizontal:disabled { + background: #3394D5; +} + +QSlider::handle:horizontal { + background: #9DA9B5; + border: 1px solid #35373A; + width: 8px; + height: 8px; + margin: -8px 0px; + border-radius: 4px; +} + +QSlider::handle:horizontal:hover { + background: #3394D5; + border: 1px solid #3394D5; +} + +QSlider::handle:horizontal:focus { + border: 1px solid #35373A; +} + +QSlider::handle:vertical { + background: #9DA9B5; + border: 1px solid #35373A; + width: 8px; + height: 8px; + margin: 0 -8px; + border-radius: 4px; +} + +QSlider::handle:vertical:hover { + background: #3394D5; + border: 1px solid #3394D5; +} + +QSlider::handle:vertical:focus { + border: 1px solid #35373A; +} + +/* QLineEdit -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlineedit + +--------------------------------------------------------------------------- */ +QLineEdit { + background-color: #232325; + padding-top: 2px; + /* This QLineEdit fix 103, 111 */ + padding-bottom: 2px; + /* This QLineEdit fix 103, 111 */ + padding-left: 4px; + padding-right: 4px; + border-style: solid; + border: 1px solid #35373A; + border-radius: 4px; + color: #E0E1E3; +} + +QLineEdit:disabled { + background-color: #232325; + color: #9DA9B5; +} + +QLineEdit:hover { + border: 1px solid #3394D5; + color: #E0E1E3; +} + +QLineEdit:focus { + border: 1px solid #35373A; +} + +QLineEdit:selected { + background-color: #3394D5; + color: #35373A; +} + +/* QTabWiget -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabWidget { + padding: 2px; + selection-background-color: #35373A; +} + +QTabWidget QWidget { + /* Fixes #189 */ + border-radius: 4px; +} + +QTabWidget::pane { + border: 1px solid #35373A; + border-radius: 4px; + margin: 0px; + /* Fixes double border inside pane with pyqt5 */ + padding: 0px; +} + +QTabWidget::pane:selected { + background-color: #35373A; + border: 1px solid #3394D5; +} + +/* QTabBar ---------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtabwidget-and-qtabbar + +--------------------------------------------------------------------------- */ +QTabBar, QDockWidget QTabBar { + qproperty-drawBase: 0; + border-radius: 4px; + margin: 0px; + padding: 2px; + border: 0; + /* left: 5px; move to the right by 5px - removed for fix */ +} + +QTabBar::close-button, QDockWidget QTabBar::close-button { + border: 0; + margin: 0; + padding: 4px; + image: url("User/Themes/Dolphin Dark/Resources/window_close.png"); +} + +QTabBar::close-button:hover, QDockWidget QTabBar::close-button:hover { + image: url("User/Themes/Dolphin Dark/Resources/window_close_focus.png"); +} + +QTabBar::close-button:pressed, QDockWidget QTabBar::close-button:pressed { + image: url("User/Themes/Dolphin Dark/Resources/window_close_pressed.png"); +} + +QTabBar::tab, QDockWidget QTabBar::tab { + /* !selected and disabled ----------------------------------------- */ + /* selected ------------------------------------------------------- */ +} + +QTabBar::tab:top:selected:disabled, QDockWidget QTabBar::tab:top:selected:disabled { + border-bottom: 3px solid #3394D5; + color: #9DA9B5; + background-color: #35373A; +} + +QTabBar::tab:bottom:selected:disabled, QDockWidget QTabBar::tab:bottom:selected:disabled { + border-top: 3px solid #3394D5; + color: #9DA9B5; + background-color: #35373A; +} + +QTabBar::tab:left:selected:disabled, QDockWidget QTabBar::tab:left:selected:disabled { + border-right: 3px solid #3394D5; + color: #9DA9B5; + background-color: #35373A; +} + +QTabBar::tab:right:selected:disabled, QDockWidget QTabBar::tab:right:selected:disabled { + border-left: 3px solid #3394D5; + color: #9DA9B5; + background-color: #35373A; +} + +QTabBar::tab:top:!selected:disabled, QDockWidget QTabBar::tab:top:!selected:disabled { + border-bottom: 3px solid #232325; + color: #9DA9B5; + background-color: #232325; +} + +QTabBar::tab:bottom:!selected:disabled, QDockWidget QTabBar::tab:bottom:!selected:disabled { + border-top: 3px solid #232325; + color: #9DA9B5; + background-color: #232325; +} + +QTabBar::tab:left:!selected:disabled, QDockWidget QTabBar::tab:left:!selected:disabled { + border-right: 3px solid #232325; + color: #9DA9B5; + background-color: #232325; +} + +QTabBar::tab:right:!selected:disabled, QDockWidget QTabBar::tab:right:!selected:disabled { + border-left: 3px solid #232325; + color: #9DA9B5; + background-color: #232325; +} + +QTabBar::tab:top:!selected, QDockWidget QTabBar::tab:top:!selected { + border-bottom: 2px solid #232325; + margin-top: 2px; +} + +QTabBar::tab:bottom:!selected, QDockWidget QTabBar::tab:bottom:!selected { + border-top: 2px solid #232325; + margin-bottom: 2px; +} + +QTabBar::tab:left:!selected, QDockWidget QTabBar::tab:left:!selected { + border-left: 2px solid #232325; + margin-right: 2px; +} + +QTabBar::tab:right:!selected, QDockWidget QTabBar::tab:right:!selected { + border-right: 2px solid #232325; + margin-left: 2px; +} + +QTabBar::tab:top, QDockWidget QTabBar::tab:top { + background-color: #232325; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + min-width: 5px; + border-bottom: 3px solid #35373A; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QTabBar::tab:top:selected, QDockWidget QTabBar::tab:top:selected { + background-color: #3394D5; + border-bottom: 3px solid #35373A; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QTabBar::tab:top:!selected:hover, QDockWidget QTabBar::tab:top:!selected:hover { + border: 1px solid #35373A; + border-bottom: 3px solid #35373A; + /* Fixes spyder-ide/spyder#9766 and #243 */ + padding-left: 3px; + padding-right: 3px; +} + +QTabBar::tab:bottom, QDockWidget QTabBar::tab:bottom { + border-top: 3px solid #35373A; + background-color: #35373A; + margin-left: 2px; + padding-left: 4px; + padding-right: 4px; + padding-top: 2px; + padding-bottom: 2px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + min-width: 5px; +} + +QTabBar::tab:bottom:selected, QDockWidget QTabBar::tab:bottom:selected { + background-color: #3394D5; + border-top: 3px solid #35373A; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +QTabBar::tab:bottom:!selected:hover, QDockWidget QTabBar::tab:bottom:!selected:hover { + border: 1px solid #35373A; + border-top: 3px solid #35373A; + /* Fixes spyder-ide/spyder#9766 and #243 */ + padding-left: 3px; + padding-right: 3px; +} + +QTabBar::tab:left, QDockWidget QTabBar::tab:left { + background-color: #35373A; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + min-height: 5px; +} + +QTabBar::tab:left:selected, QDockWidget QTabBar::tab:left:selected { + background-color: #3394D5; + border-right: 3px solid #35373A; +} + +QTabBar::tab:left:!selected:hover, QDockWidget QTabBar::tab:left:!selected:hover { + border: 1px solid #35373A; + border-right: 3px solid #35373A; + /* Fixes different behavior #271 */ + margin-right: 0px; + padding-right: -1px; +} + +QTabBar::tab:right, QDockWidget QTabBar::tab:right { + background-color: #35373A; + margin-top: 2px; + padding-left: 2px; + padding-right: 2px; + padding-top: 4px; + padding-bottom: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + min-height: 5px; +} + +QTabBar::tab:right:selected, QDockWidget QTabBar::tab:right:selected { + background-color: #3394D5; + border-left: 3px solid #35373A; +} + +QTabBar::tab:right:!selected:hover, QDockWidget QTabBar::tab:right:!selected:hover { + border: 1px solid #35373A; + border-left: 3px solid #35373A; + /* Fixes different behavior #271 */ + margin-left: 0px; + padding-left: 0px; +} + +QTabBar QToolButton, QDockWidget QTabBar QToolButton { + /* Fixes #136 */ + background-color: #35373A; + height: 12px; + width: 12px; +} + +QTabBar QToolButton:pressed, QDockWidget QTabBar QToolButton:pressed { + background-color: #35373A; +} + +QTabBar QToolButton:pressed:hover, QDockWidget QTabBar QToolButton:pressed:hover { + border: 1px solid #3394D5; +} + +QTabBar QToolButton::left-arrow:enabled, QDockWidget QTabBar QToolButton::left-arrow:enabled { + image: url("User/Themes/Dolphin Dark/Resources/arrow_left.png"); +} + +QTabBar QToolButton::left-arrow:disabled, QDockWidget QTabBar QToolButton::left-arrow:disabled { + image: url("User/Themes/Dolphin Dark/Resources/arrow_left_disabled.png"); +} + +QTabBar QToolButton::right-arrow:enabled, QDockWidget QTabBar QToolButton::right-arrow:enabled { + image: url("User/Themes/Dolphin Dark/Resources/arrow_right.png"); +} + +QTabBar QToolButton::right-arrow:disabled, QDockWidget QTabBar QToolButton::right-arrow:disabled { + image: url("User/Themes/Dolphin Dark/Resources/arrow_right_disabled.png"); +} + +/* QDockWiget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QDockWidget { + outline: 1px solid #35373A; + background-color: #232325; + border: 1px solid #35373A; + border-radius: 4px; + titlebar-close-icon: url("User/Themes/Dolphin Dark/Resources/transparent.png"); + titlebar-normal-icon: url("User/Themes/Dolphin Dark/Resources/transparent.png"); +} + +QDockWidget::title { + /* Better size for title bar */ + padding: 3px; + spacing: 4px; + border: none; + background-color: #35373A; +} + +QDockWidget::close-button { + icon-size: 12px; + border: none; + background: transparent; + background-image: transparent; + border: 0; + margin: 0; + padding: 0; + image: url("User/Themes/Dolphin Dark/Resources/window_close.png"); +} + +QDockWidget::close-button:hover { + image: url("User/Themes/Dolphin Dark/Resources/window_close_focus.png"); +} + +QDockWidget::close-button:pressed { + image: url("User/Themes/Dolphin Dark/Resources/window_close_pressed.png"); +} + +QDockWidget::float-button { + icon-size: 12px; + border: none; + background: transparent; + background-image: transparent; + border: 0; + margin: 0; + padding: 0; + image: url("User/Themes/Dolphin Dark/Resources/window_undock.png"); +} + +QDockWidget::float-button:hover { + image: url("User/Themes/Dolphin Dark/Resources/window_undock_focus.png"); +} + +QDockWidget::float-button:pressed { + image: url("User/Themes/Dolphin Dark/Resources/window_undock_pressed.png"); +} + +/* QTreeView QListView QTableView ----------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qlistview +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtableview + +--------------------------------------------------------------------------- */ +QTreeView:branch:selected, QTreeView:branch:hover { + background: url("User/Themes/Dolphin Dark/Resources/transparent.png"); +} + +QTreeView:branch:has-siblings:!adjoins-item { + border-image: url("User/Themes/Dolphin Dark/Resources/branch_line.png") 0; +} + +QTreeView:branch:has-siblings:adjoins-item { + border-image: url("User/Themes/Dolphin Dark/Resources/branch_more.png") 0; +} + +QTreeView:branch:!has-children:!has-siblings:adjoins-item { + border-image: url("User/Themes/Dolphin Dark/Resources/branch_end.png") 0; +} + +QTreeView:branch:has-children:!has-siblings:closed, QTreeView:branch:closed:has-children:has-siblings { + border-image: none; + image: url("User/Themes/Dolphin Dark/Resources/branch_closed.png"); +} + +QTreeView:branch:open:has-children:!has-siblings, QTreeView:branch:open:has-children:has-siblings { + border-image: none; + image: url("User/Themes/Dolphin Dark/Resources/branch_open.png"); +} + +QTreeView:branch:has-children:!has-siblings:closed:hover, QTreeView:branch:closed:has-children:has-siblings:hover { + image: url("User/Themes/Dolphin Dark/Resources/branch_closed_focus.png"); +} + +QTreeView:branch:open:has-children:!has-siblings:hover, QTreeView:branch:open:has-children:has-siblings:hover { + image: url("User/Themes/Dolphin Dark/Resources/branch_open_focus.png"); +} + +QTreeView::indicator:checked, +QListView::indicator:checked, +QTableView::indicator:checked, +QColumnView::indicator:checked { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked.png"); +} + +QTreeView::indicator:checked:hover, QTreeView::indicator:checked:focus, QTreeView::indicator:checked:pressed, +QListView::indicator:checked:hover, +QListView::indicator:checked:focus, +QListView::indicator:checked:pressed, +QTableView::indicator:checked:hover, +QTableView::indicator:checked:focus, +QTableView::indicator:checked:pressed, +QColumnView::indicator:checked:hover, +QColumnView::indicator:checked:focus, +QColumnView::indicator:checked:pressed { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png"); +} + +QTreeView::indicator:unchecked, +QListView::indicator:unchecked, +QTableView::indicator:unchecked, +QColumnView::indicator:unchecked { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png"); +} + +QTreeView::indicator:unchecked:hover, QTreeView::indicator:unchecked:focus, QTreeView::indicator:unchecked:pressed, +QListView::indicator:unchecked:hover, +QListView::indicator:unchecked:focus, +QListView::indicator:unchecked:pressed, +QTableView::indicator:unchecked:hover, +QTableView::indicator:unchecked:focus, +QTableView::indicator:unchecked:pressed, +QColumnView::indicator:unchecked:hover, +QColumnView::indicator:unchecked:focus, +QColumnView::indicator:unchecked:pressed { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png"); +} + +QTreeView::indicator:indeterminate, +QListView::indicator:indeterminate, +QTableView::indicator:indeterminate, +QColumnView::indicator:indeterminate { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate.png"); +} + +QTreeView::indicator:indeterminate:hover, QTreeView::indicator:indeterminate:focus, QTreeView::indicator:indeterminate:pressed, +QListView::indicator:indeterminate:hover, +QListView::indicator:indeterminate:focus, +QListView::indicator:indeterminate:pressed, +QTableView::indicator:indeterminate:hover, +QTableView::indicator:indeterminate:focus, +QTableView::indicator:indeterminate:pressed, +QColumnView::indicator:indeterminate:hover, +QColumnView::indicator:indeterminate:focus, +QColumnView::indicator:indeterminate:pressed { + image: url("User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus.png"); +} + +QTreeView, +QListView, +QTableView, +QColumnView { + background-color: #232325; + border: 1px solid #35373A; + color: #E0E1E3; + gridline-color: #35373A; + border-radius: 4px; +} + +QTreeView:disabled, +QListView:disabled, +QTableView:disabled, +QColumnView:disabled { + background-color: #232325; + color: #9DA9B5; +} + +QTreeView:selected, +QListView:selected, +QTableView:selected, +QColumnView:selected { + background-color: #3394D5; + color: #35373A; +} + +QTreeView:focus, +QListView:focus, +QTableView:focus, +QColumnView:focus { + border: 1px solid #35373A; +} + +QTreeView::item:pressed, +QListView::item:pressed, +QTableView::item:pressed, +QColumnView::item:pressed { + background-color: #3394D5; +} + +QTreeView::item:selected:active, +QListView::item:selected:active, +QTableView::item:selected:active, +QColumnView::item:selected:active { + background-color: #3394D5; +} + +QTreeView::item:selected:!active, +QListView::item:selected:!active, +QTableView::item:selected:!active, +QColumnView::item:selected:!active { + color: #E0E1E3; + background-color: #35373A; +} + +QTreeView::item:!selected:hover, +QListView::item:!selected:hover, +QTableView::item:!selected:hover, +QColumnView::item:!selected:hover { + outline: 0; + color: #E0E1E3; + background-color: #35373A; +} + +QTableCornerButton::section { + background-color: #232325; + border: 1px transparent #35373A; + border-radius: 0px; +} + +/* QHeaderView ------------------------------------------------------------ + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview + +--------------------------------------------------------------------------- */ +QHeaderView { + background-color: #35373A; + border: 0px transparent #35373A; + padding: 0; + margin: 0; + border-radius: 0; +} + +QHeaderView:disabled { + background-color: #35373A; + border: 1px transparent #35373A; +} + +QHeaderView::section { + background-color: #35373A; + color: #E0E1E3; + border-radius: 0; + text-align: left; + font-size: 13px; +} + +QHeaderView::section::horizontal { + padding-top: 0; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + border-left: 1px solid #232325; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one { + border-left: 1px solid #35373A; +} + +QHeaderView::section::horizontal:disabled { + color: #9DA9B5; +} + +QHeaderView::section::vertical { + padding-top: 0; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + border-top: 1px solid #232325; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one { + border-top: 1px solid #35373A; +} + +QHeaderView::section::vertical:disabled { + color: #9DA9B5; +} + +QHeaderView::down-arrow { + /* Those settings (border/width/height/background-color) solve bug */ + /* transparent arrow background and size */ + background-color: #35373A; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); +} + +QHeaderView::up-arrow { + background-color: #35373A; + border: none; + height: 12px; + width: 12px; + padding-left: 2px; + padding-right: 2px; + image: url("User/Themes/Dolphin Dark/Resources/arrow_up.png"); +} + +/* QToolBox -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtoolbox + +--------------------------------------------------------------------------- */ +QToolBox { + padding: 0px; + border: 0px; + border: 1px solid #35373A; +} + +QToolBox:selected { + padding: 0px; + border: 2px solid #3394D5; +} + +QToolBox::tab { + background-color: #232325; + border: 1px solid #35373A; + color: #E0E1E3; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +QToolBox::tab:disabled { + color: #9DA9B5; +} + +QToolBox::tab:selected { + background-color: #8B8C8E; + border-bottom: 2px solid #3394D5; +} + +QToolBox::tab:selected:disabled { + background-color: #35373A; + border-bottom: 2px solid #3394D5; +} + +QToolBox::tab:!selected { + background-color: #35373A; + border-bottom: 2px solid #35373A; +} + +QToolBox::tab:!selected:disabled { + background-color: #232325; +} + +QToolBox::tab:hover { + border-color: #35373A; + border-bottom: 2px solid #35373A; +} + +QToolBox QScrollArea QWidget QWidget { + padding: 0px; + border: 0px; + background-color: #232325; +} + +/* QFrame ----------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qframe +https://doc.qt.io/qt-5/qframe.html#-prop +https://doc.qt.io/qt-5/qframe.html#details +https://stackoverflow.com/questions/14581498/qt-stylesheet-for-hline-vline-color + +--------------------------------------------------------------------------- */ +/* (dot) .QFrame fix #141, #126, #123 */ +.QFrame { + border-radius: 4px; + border: 1px solid #35373A; + /* No frame */ + /* HLine */ + /* HLine */ +} + +.QFrame[frameShape="0"] { + border-radius: 4px; + border: 1px transparent #35373A; +} + +.QFrame[frameShape="4"] { + max-height: 2px; + border: none; + background-color: #35373A; +} + +.QFrame[frameShape="5"] { + max-width: 2px; + border: none; + background-color: #35373A; +} + +/* QSplitter -------------------------------------------------------------- + +https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qsplitter + +--------------------------------------------------------------------------- */ +QSplitter { + background-color: #35373A; + spacing: 0px; + padding: 0px; + margin: 0px; +} + +QSplitter::handle { + background-color: #35373A; + border: 0px solid #232325; + spacing: 0px; + padding: 1px; + margin: 0px; +} + +QSplitter::handle:hover { + background-color: #9DA9B5; +} + +QSplitter::handle:horizontal { + width: 5px; + image: url("User/Themes/Dolphin Dark/Resources/line_vertical.png"); +} + +QSplitter::handle:vertical { + height: 5px; + image: url("User/Themes/Dolphin Dark/Resources/line_horizontal.png"); +} + +/* QDateEdit, QDateTimeEdit ----------------------------------------------- + +--------------------------------------------------------------------------- */ +QDateEdit, QDateTimeEdit { + selection-background-color: #3394D5; + border-style: solid; + border: 1px solid #35373A; + border-radius: 4px; + /* This fixes 103, 111 */ + padding-top: 2px; + /* This fixes 103, 111 */ + padding-bottom: 2px; + padding-left: 4px; + padding-right: 4px; + min-width: 10px; +} + +QDateEdit:on, QDateTimeEdit:on { + selection-background-color: #3394D5; +} + +QDateEdit::drop-down, QDateTimeEdit::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 12px; + border-left: 1px solid #35373A; +} + +QDateEdit::down-arrow, QDateTimeEdit::down-arrow { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png"); + height: 8px; + width: 8px; +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus, QDateTimeEdit::down-arrow:on, QDateTimeEdit::down-arrow:hover, QDateTimeEdit::down-arrow:focus { + image: url("User/Themes/Dolphin Dark/Resources/arrow_down.png"); +} + +QDateEdit QAbstractItemView, QDateTimeEdit QAbstractItemView { + background-color: #232325; + border-radius: 4px; + border: 1px solid #35373A; + selection-background-color: #3394D5; +} + +/* QAbstractView ---------------------------------------------------------- + +--------------------------------------------------------------------------- */ +QAbstractView:hover { + border: 1px solid #3394D5; + color: #E0E1E3; +} + +QAbstractView:selected { + background: #3394D5; + color: #35373A; +} + +/* PlotWidget ------------------------------------------------------------- + +--------------------------------------------------------------------------- */ +PlotWidget { + /* Fix cut labels in plots #134 */ + padding: 0px; +} diff --git a/Data/User/Themes/Dolphin Dark/Resources/.keep b/Data/User/Themes/Dolphin Dark/Resources/.keep new file mode 100644 index 0000000000..8d1c8b69c3 --- /dev/null +++ b/Data/User/Themes/Dolphin Dark/Resources/.keep @@ -0,0 +1 @@ + diff --git a/Data/User/Themes/Dolphin Dark/Resources/Welcome.png b/Data/User/Themes/Dolphin Dark/Resources/Welcome.png new file mode 100644 index 0000000000..0f17ddac5d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/Welcome.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down.png new file mode 100644 index 0000000000..aa9938ab44 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down@2x.png new file mode 100644 index 0000000000..c1f33469ae Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png new file mode 100644 index 0000000000..972df9cd16 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_disabled@2x.png new file mode 100644 index 0000000000..b0fb4ad11d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down_focus.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_focus.png new file mode 100644 index 0000000000..22df2c525c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_focus@2x.png new file mode 100644 index 0000000000..06b80be4bc Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_pressed.png new file mode 100644 index 0000000000..50f41cc6f8 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_down_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_pressed@2x.png new file mode 100644 index 0000000000..ef20f2cb07 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_down_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left.png new file mode 100644 index 0000000000..c8981363f4 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left@2x.png new file mode 100644 index 0000000000..129d2e13a8 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_disabled.png new file mode 100644 index 0000000000..79b1f05651 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_disabled@2x.png new file mode 100644 index 0000000000..144fdb5f8f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left_focus.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_focus.png new file mode 100644 index 0000000000..ef02849947 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_focus@2x.png new file mode 100644 index 0000000000..ca821dcac5 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_pressed.png new file mode 100644 index 0000000000..c723d3bff7 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_left_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_pressed@2x.png new file mode 100644 index 0000000000..f0bcb5229b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_left_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right.png new file mode 100644 index 0000000000..86bc42aeb1 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right@2x.png new file mode 100644 index 0000000000..4526704b8f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_disabled.png new file mode 100644 index 0000000000..88da1f980b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_disabled@2x.png new file mode 100644 index 0000000000..5351587e3d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right_focus.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_focus.png new file mode 100644 index 0000000000..92271a8ed9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_focus@2x.png new file mode 100644 index 0000000000..d6c31bdda9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_pressed.png new file mode 100644 index 0000000000..22902cf4fc Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_right_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_pressed@2x.png new file mode 100644 index 0000000000..f6181eb64d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_right_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up.png new file mode 100644 index 0000000000..5ade740805 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up@2x.png new file mode 100644 index 0000000000..65276abff9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_disabled.png new file mode 100644 index 0000000000..48054a8ae9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_disabled@2x.png new file mode 100644 index 0000000000..e99960594e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up_focus.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_focus.png new file mode 100644 index 0000000000..567ec8bdf2 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_focus@2x.png new file mode 100644 index 0000000000..f6998104b5 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_pressed.png new file mode 100644 index 0000000000..2233201069 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/arrow_up_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_pressed@2x.png new file mode 100644 index 0000000000..9954cf5194 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/arrow_up_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon.png new file mode 100644 index 0000000000..bb00857a4e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon@2x.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon@2x.png new file mode 100644 index 0000000000..bc4ab78a28 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon_disabled.png new file mode 100644 index 0000000000..bb00857a4e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon_disabled@2x.png new file mode 100644 index 0000000000..bc4ab78a28 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon_focus.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon_focus.png new file mode 100644 index 0000000000..bb00857a4e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon_focus@2x.png new file mode 100644 index 0000000000..bc4ab78a28 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon_pressed.png new file mode 100644 index 0000000000..bb00857a4e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/base_icon_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/base_icon_pressed@2x.png new file mode 100644 index 0000000000..bc4ab78a28 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/base_icon_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed.png new file mode 100644 index 0000000000..2ef5957f4f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed@2x.png new file mode 100644 index 0000000000..564ba0e977 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_disabled.png new file mode 100644 index 0000000000..165fae29ba Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_disabled@2x.png new file mode 100644 index 0000000000..421e8e094f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed_focus.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_focus.png new file mode 100644 index 0000000000..ccc249a59a Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_focus@2x.png new file mode 100644 index 0000000000..88dd0a62b1 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_pressed.png new file mode 100644 index 0000000000..2aae68a0a1 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_closed_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_pressed@2x.png new file mode 100644 index 0000000000..3849a7ff02 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_closed_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end.png new file mode 100644 index 0000000000..85de228d8f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end@2x.png new file mode 100644 index 0000000000..9f99c24a95 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end_disabled.png new file mode 100644 index 0000000000..bb4344c785 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end_disabled@2x.png new file mode 100644 index 0000000000..8feb46d464 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end_focus.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end_focus.png new file mode 100644 index 0000000000..ff713cf5f0 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end_focus@2x.png new file mode 100644 index 0000000000..0bd0e4ba33 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end_pressed.png new file mode 100644 index 0000000000..2020162f23 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_end_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_end_pressed@2x.png new file mode 100644 index 0000000000..2a5c4fabf6 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_end_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line.png new file mode 100644 index 0000000000..803e6a4a1a Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line@2x.png new file mode 100644 index 0000000000..4236fe58d8 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line_disabled.png new file mode 100644 index 0000000000..9c8c47b3d0 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line_disabled@2x.png new file mode 100644 index 0000000000..9b868f2a5c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line_focus.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line_focus.png new file mode 100644 index 0000000000..c2ab3e19e6 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line_focus@2x.png new file mode 100644 index 0000000000..512ee13a25 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line_pressed.png new file mode 100644 index 0000000000..3ca15c5d0b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_line_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_line_pressed@2x.png new file mode 100644 index 0000000000..3685531020 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_line_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more.png new file mode 100644 index 0000000000..a664c2a543 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more@2x.png new file mode 100644 index 0000000000..1e7b08a5cb Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more_disabled.png new file mode 100644 index 0000000000..29d99a63e8 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more_disabled@2x.png new file mode 100644 index 0000000000..aba830362c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more_focus.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more_focus.png new file mode 100644 index 0000000000..20a6f27b83 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more_focus@2x.png new file mode 100644 index 0000000000..6f42eea846 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more_pressed.png new file mode 100644 index 0000000000..4f4d9fb917 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_more_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_more_pressed@2x.png new file mode 100644 index 0000000000..5f18f83415 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_more_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open.png new file mode 100644 index 0000000000..1ff7b48d19 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open@2x.png new file mode 100644 index 0000000000..aad66f8bad Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open_disabled.png new file mode 100644 index 0000000000..8328e84d72 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open_disabled@2x.png new file mode 100644 index 0000000000..d8d0faecb1 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open_focus.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open_focus.png new file mode 100644 index 0000000000..711ce0979f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open_focus@2x.png new file mode 100644 index 0000000000..b38e17a33c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open_pressed.png new file mode 100644 index 0000000000..441c27344e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/branch_open_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/branch_open_pressed@2x.png new file mode 100644 index 0000000000..0e43e8b733 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/branch_open_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked.png new file mode 100644 index 0000000000..f860ca78b7 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked@2x.png new file mode 100644 index 0000000000..48773d75fa Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled.png new file mode 100644 index 0000000000..e3cb2f127c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled@2x.png new file mode 100644 index 0000000000..0c8c28a245 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png new file mode 100644 index 0000000000..58982ce87b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_focus@2x.png new file mode 100644 index 0000000000..ba33ba4fbc Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_pressed.png new file mode 100644 index 0000000000..f104bb2403 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_pressed@2x.png new file mode 100644 index 0000000000..bb972d68f3 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_checked_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate.png new file mode 100644 index 0000000000..85672bfb7f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate@2x.png new file mode 100644 index 0000000000..2bb245284e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled.png new file mode 100644 index 0000000000..181625a000 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled@2x.png new file mode 100644 index 0000000000..0d32c78f36 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus.png new file mode 100644 index 0000000000..d7b19f61ad Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus@2x.png new file mode 100644 index 0000000000..d6403ca424 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_pressed.png new file mode 100644 index 0000000000..37f46ca3d5 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_pressed@2x.png new file mode 100644 index 0000000000..aa7493edc6 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_indeterminate_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png new file mode 100644 index 0000000000..172b90ac00 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked@2x.png new file mode 100644 index 0000000000..f54b080a73 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000..066185ee7f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled@2x.png new file mode 100644 index 0000000000..9c80ad75a5 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png new file mode 100644 index 0000000000..366b868dee Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus@2x.png new file mode 100644 index 0000000000..4ab217356e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_pressed.png new file mode 100644 index 0000000000..d9a0bf71c7 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_pressed@2x.png new file mode 100644 index 0000000000..9e2b0515e7 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/checkbox_unchecked_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal.png new file mode 100644 index 0000000000..8774e3d018 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal@2x.png new file mode 100644 index 0000000000..cb11d1d2b6 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_disabled.png new file mode 100644 index 0000000000..941f14a385 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_disabled@2x.png new file mode 100644 index 0000000000..972fa08004 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_focus.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_focus.png new file mode 100644 index 0000000000..221fd4607f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_focus@2x.png new file mode 100644 index 0000000000..7e6505cae3 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_pressed.png new file mode 100644 index 0000000000..9f9113323f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_pressed@2x.png new file mode 100644 index 0000000000..465680c3b0 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_horizontal_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical.png new file mode 100644 index 0000000000..5529f413e4 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical@2x.png new file mode 100644 index 0000000000..6a334e7468 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_disabled.png new file mode 100644 index 0000000000..c7c4c8959f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_disabled@2x.png new file mode 100644 index 0000000000..b052de522e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical_focus.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_focus.png new file mode 100644 index 0000000000..36baa09362 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_focus@2x.png new file mode 100644 index 0000000000..24a2b771c3 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_pressed.png new file mode 100644 index 0000000000..60e3574460 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/line_vertical_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_pressed@2x.png new file mode 100644 index 0000000000..c9494051cd Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/line_vertical_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked.png new file mode 100644 index 0000000000..274afe1e29 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked@2x.png new file mode 100644 index 0000000000..8c16b38cc5 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_disabled.png new file mode 100644 index 0000000000..49df43922d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_disabled@2x.png new file mode 100644 index 0000000000..a9ffd40ced Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked_focus.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_focus.png new file mode 100644 index 0000000000..4bd472e160 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_focus@2x.png new file mode 100644 index 0000000000..aed5e0c94d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_pressed.png new file mode 100644 index 0000000000..ebb323b8c5 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_checked_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_pressed@2x.png new file mode 100644 index 0000000000..ffe0fd8517 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_checked_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked.png new file mode 100644 index 0000000000..93365a85e7 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked@2x.png new file mode 100644 index 0000000000..8237e4062a Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled.png new file mode 100644 index 0000000000..7ddff642df Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled@2x.png new file mode 100644 index 0000000000..4de5d0d2d8 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_focus.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_focus.png new file mode 100644 index 0000000000..e62b996b1c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_focus@2x.png new file mode 100644 index 0000000000..eaf7bc26b9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_pressed.png new file mode 100644 index 0000000000..8aaa343e88 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_pressed@2x.png new file mode 100644 index 0000000000..ba4f83b91e Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/radio_unchecked_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal.png new file mode 100644 index 0000000000..54993316db Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal@2x.png new file mode 100644 index 0000000000..143b62ec55 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_disabled.png new file mode 100644 index 0000000000..568b0fbe18 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_disabled@2x.png new file mode 100644 index 0000000000..4d15f1478b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_focus.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_focus.png new file mode 100644 index 0000000000..cdb96bfb96 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_focus@2x.png new file mode 100644 index 0000000000..23e06a0152 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_pressed.png new file mode 100644 index 0000000000..9ce6f8d89d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_pressed@2x.png new file mode 100644 index 0000000000..4d8e53e8e7 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_horizontal_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical.png new file mode 100644 index 0000000000..ade2a20b95 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical@2x.png new file mode 100644 index 0000000000..453d7b71f9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_disabled.png new file mode 100644 index 0000000000..37453ac258 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_disabled@2x.png new file mode 100644 index 0000000000..cca8f6d961 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_focus.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_focus.png new file mode 100644 index 0000000000..b548771816 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_focus@2x.png new file mode 100644 index 0000000000..d4dd49dec9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_pressed.png new file mode 100644 index 0000000000..768ebaf4ca Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_pressed@2x.png new file mode 100644 index 0000000000..2f170ffd8f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_move_vertical_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal.png new file mode 100644 index 0000000000..ecf2ab7d0c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal@2x.png new file mode 100644 index 0000000000..ac2b343264 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_disabled.png new file mode 100644 index 0000000000..f8796f9e6b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_disabled@2x.png new file mode 100644 index 0000000000..1d9f20421c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_focus.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_focus.png new file mode 100644 index 0000000000..b592e61c16 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_focus@2x.png new file mode 100644 index 0000000000..a593a7e761 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_pressed.png new file mode 100644 index 0000000000..a806257e06 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_pressed@2x.png new file mode 100644 index 0000000000..e1e8e3c148 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_horizontal_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical.png new file mode 100644 index 0000000000..a894304e69 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical@2x.png new file mode 100644 index 0000000000..2f66e93d34 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_disabled.png new file mode 100644 index 0000000000..48b2657f50 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_disabled@2x.png new file mode 100644 index 0000000000..a2173c5eef Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_focus.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_focus.png new file mode 100644 index 0000000000..e31c694b05 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_focus@2x.png new file mode 100644 index 0000000000..ce743cc862 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_pressed.png new file mode 100644 index 0000000000..4ee7aaaabd Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_pressed@2x.png new file mode 100644 index 0000000000..d8bf93bf65 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/toolbar_separator_vertical_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent.png b/Data/User/Themes/Dolphin Dark/Resources/transparent.png new file mode 100644 index 0000000000..67753617fe Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent@2x.png b/Data/User/Themes/Dolphin Dark/Resources/transparent@2x.png new file mode 100644 index 0000000000..4012944b58 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/transparent_disabled.png new file mode 100644 index 0000000000..67753617fe Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/transparent_disabled@2x.png new file mode 100644 index 0000000000..4012944b58 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent_focus.png b/Data/User/Themes/Dolphin Dark/Resources/transparent_focus.png new file mode 100644 index 0000000000..67753617fe Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/transparent_focus@2x.png new file mode 100644 index 0000000000..4012944b58 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/transparent_pressed.png new file mode 100644 index 0000000000..67753617fe Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/transparent_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/transparent_pressed@2x.png new file mode 100644 index 0000000000..4012944b58 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/transparent_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close.png b/Data/User/Themes/Dolphin Dark/Resources/window_close.png new file mode 100644 index 0000000000..2b36479382 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_close@2x.png new file mode 100644 index 0000000000..c6bec556f1 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/window_close_disabled.png new file mode 100644 index 0000000000..46de804b88 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_close_disabled@2x.png new file mode 100644 index 0000000000..8e4cd15d86 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close_focus.png b/Data/User/Themes/Dolphin Dark/Resources/window_close_focus.png new file mode 100644 index 0000000000..bb7d8c5110 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_close_focus@2x.png new file mode 100644 index 0000000000..692ce24f2f Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/window_close_pressed.png new file mode 100644 index 0000000000..53ae7f38e0 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_close_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_close_pressed@2x.png new file mode 100644 index 0000000000..e02b12292d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_close_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip.png new file mode 100644 index 0000000000..fc2f6dffcb Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip@2x.png new file mode 100644 index 0000000000..6a8e86cef2 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip_disabled.png new file mode 100644 index 0000000000..97c0e0f90b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip_disabled@2x.png new file mode 100644 index 0000000000..7a3d8de6de Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip_focus.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip_focus.png new file mode 100644 index 0000000000..99b27c9cec Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip_focus@2x.png new file mode 100644 index 0000000000..833cb90a9a Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip_pressed.png new file mode 100644 index 0000000000..afea9749e8 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_grip_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_grip_pressed@2x.png new file mode 100644 index 0000000000..c1c1a0e4b1 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_grip_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize.png new file mode 100644 index 0000000000..64404308d3 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize@2x.png new file mode 100644 index 0000000000..0e25540417 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_disabled.png new file mode 100644 index 0000000000..cc51ed0eed Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_disabled@2x.png new file mode 100644 index 0000000000..c1676469f9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize_focus.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_focus.png new file mode 100644 index 0000000000..1dcd083c00 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_focus@2x.png new file mode 100644 index 0000000000..2a4c868e09 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_pressed.png new file mode 100644 index 0000000000..0bb532126c Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_minimize_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_pressed@2x.png new file mode 100644 index 0000000000..5a515c806b Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_minimize_pressed@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock.png new file mode 100644 index 0000000000..3bd2863274 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock@2x.png new file mode 100644 index 0000000000..44c147feb9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock_disabled.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock_disabled.png new file mode 100644 index 0000000000..6a609492b3 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock_disabled.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock_disabled@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock_disabled@2x.png new file mode 100644 index 0000000000..c2e1b8fa72 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock_disabled@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock_focus.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock_focus.png new file mode 100644 index 0000000000..d6eebbdc27 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock_focus.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock_focus@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock_focus@2x.png new file mode 100644 index 0000000000..1aef06053d Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock_focus@2x.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock_pressed.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock_pressed.png new file mode 100644 index 0000000000..8b6beb19e9 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock_pressed.png differ diff --git a/Data/User/Themes/Dolphin Dark/Resources/window_undock_pressed@2x.png b/Data/User/Themes/Dolphin Dark/Resources/window_undock_pressed@2x.png new file mode 100644 index 0000000000..677ded4251 Binary files /dev/null and b/Data/User/Themes/Dolphin Dark/Resources/window_undock_pressed@2x.png differ diff --git a/Installer/Discord.cpp b/Installer/Discord.cpp new file mode 100644 index 0000000000..e23ac6f53d --- /dev/null +++ b/Installer/Discord.cpp @@ -0,0 +1,38 @@ +#include "Discord.h" + +bool mpn_update_discord() +{ + if (!Memory::IsInitialized()) + return false; + + DiscordRichPresence RichPresence = {}; + + RichPresence.largeImageKey = CurrentState.Image ? CurrentState.Image : "default"; + RichPresence.largeImageText = CurrentState.Title ? CurrentState.Title : "In-Game"; + + if (CurrentState.Scenes != NULL && CurrentState.Scene != NULL) + RichPresence.state = CurrentState.Scene->Name.c_str(); + + if (CurrentState.Addresses != NULL) + { + char Details[128] = ""; + + if (CurrentState.Boards && CurrentState.Board) + { + snprintf(Details, sizeof(Details), "Turn: %d/%d", + mpn_read_value(CurrentState.Addresses->CurrentTurn, 1), + mpn_read_value(CurrentState.Addresses->TotalTurns, 1)); + RichPresence.smallImageKey = CurrentState.Board->Icon.c_str(); + RichPresence.smallImageText = CurrentState.Board->Name.c_str(); + } + else + { + RichPresence.smallImageKey = ""; + RichPresence.smallImageText = ""; + } + RichPresence.details = Details; + } + Discord_UpdatePresence(&RichPresence); + + return true; +} diff --git a/Installer/Dolphin.ico b/Installer/Dolphin.ico index 6b5462a1b2..d82a452109 100644 Binary files a/Installer/Dolphin.ico and b/Installer/Dolphin.ico differ diff --git a/Languages/po/en.po b/Languages/po/en.po index 3e47ffd502..4ffd4f0834 100644 --- a/Languages/po/en.po +++ b/Languages/po/en.po @@ -512,7 +512,7 @@ msgid "&Pause" msgstr "" #: Source/Core/DolphinQt/MenuBar.cpp:308 -msgid "&Play" +msgid "&Local Play" msgstr "" #: Source/Core/DolphinQt/GameList/GameList.cpp:357 diff --git a/Readme.md b/Readme.md index 5ec9acee9d..80f0f1424f 100644 --- a/Readme.md +++ b/Readme.md @@ -200,7 +200,6 @@ These folders are installed read-only and should not be changed: * `GameSettings`: per-game default settings database * `GC`: DSP and font dumps -* `Maps`: symbol tables (dev only) * `Shaders`: post-processing shaders * `Themes`: icon themes for GUI * `Resources`: icons that are theme-agnostic diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java index a7c47a03ad..82004d80c8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.java @@ -18,6 +18,14 @@ public enum BooleanSetting implements AbstractBooleanSetting MAIN_OVERRIDE_REGION_SETTINGS(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "OverrideRegionSettings", false), MAIN_AUDIO_STRETCH(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AudioStretch", false), + MAIN_ADAPTER_RUMBLE_0(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AdapterRumble0", true), + MAIN_ADAPTER_RUMBLE_1(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AdapterRumble1", true), + MAIN_ADAPTER_RUMBLE_2(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AdapterRumble2", true), + MAIN_ADAPTER_RUMBLE_3(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "AdapterRumble3", true), + MAIN_SIMULATE_KONGA_0(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SimulateKonga0", false), + MAIN_SIMULATE_KONGA_1(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SimulateKonga1", false), + MAIN_SIMULATE_KONGA_2(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SimulateKonga2", false), + MAIN_SIMULATE_KONGA_3(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SimulateKonga3", false), MAIN_WII_SD_CARD(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiiSDCard", true), MAIN_WIIMOTE_CONTINUOUS_SCANNING(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "WiimoteContinuousScanning", false), @@ -228,7 +236,6 @@ public enum BooleanSetting implements AbstractBooleanSetting MAIN_CPU_THREAD, MAIN_ENABLE_CHEATS, MAIN_OVERRIDE_REGION_SETTINGS, - MAIN_WII_SD_CARD, // Can actually be changed, but specialized code is required MAIN_MMU, MAIN_DSP_JIT, }; @@ -322,4 +329,16 @@ public enum BooleanSetting implements AbstractBooleanSetting { NativeConfig.setBoolean(layer, mFile, mSection, mKey, newValue); } + + public static BooleanSetting getSettingForAdapterRumble(int channel) + { + return new BooleanSetting[]{MAIN_ADAPTER_RUMBLE_0, MAIN_ADAPTER_RUMBLE_1, MAIN_ADAPTER_RUMBLE_2, + MAIN_ADAPTER_RUMBLE_3}[channel]; + } + + public static BooleanSetting getSettingForSimulateKonga(int channel) + { + return new BooleanSetting[]{MAIN_SIMULATE_KONGA_0, MAIN_SIMULATE_KONGA_1, MAIN_SIMULATE_KONGA_2, + MAIN_SIMULATE_KONGA_3}[channel]; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java index d28603cbef..1871652ea3 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/IntSetting.java @@ -21,6 +21,10 @@ public enum IntSetting implements AbstractIntSetting MAIN_SLOT_A(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SlotA", 8), MAIN_SLOT_B(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SlotB", 255), MAIN_FALLBACK_REGION(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "FallbackRegion", 2), + MAIN_SI_DEVICE_0(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SIDevice0", 6), + MAIN_SI_DEVICE_1(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SIDevice1", 0), + MAIN_SI_DEVICE_2(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SIDevice2", 0), + MAIN_SI_DEVICE_3(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, "SIDevice3", 0), MAIN_AUDIO_VOLUME(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "Volume", 100), @@ -60,13 +64,23 @@ public enum IntSetting implements AbstractIntSetting GFX_STEREO_CONVERGENCE_PERCENTAGE(Settings.FILE_GFX, Settings.SECTION_STEREOSCOPY, "StereoConvergencePercentage", 100), - LOGGER_VERBOSITY(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "Verbosity", 1); + LOGGER_VERBOSITY(Settings.FILE_LOGGER, Settings.SECTION_LOGGER_OPTIONS, "Verbosity", 1), + + WIIMOTE_1_SOURCE(Settings.FILE_WIIMOTE, "Wiimote1", "Source", 1), + WIIMOTE_2_SOURCE(Settings.FILE_WIIMOTE, "Wiimote2", "Source", 0), + WIIMOTE_3_SOURCE(Settings.FILE_WIIMOTE, "Wiimote3", "Source", 0), + WIIMOTE_4_SOURCE(Settings.FILE_WIIMOTE, "Wiimote4", "Source", 0), + WIIMOTE_BB_SOURCE(Settings.FILE_WIIMOTE, "BalanceBoard", "Source", 0); private static final IntSetting[] NOT_RUNTIME_EDITABLE_ARRAY = new IntSetting[]{ MAIN_CPU_CORE, MAIN_GC_LANGUAGE, MAIN_SLOT_A, // Can actually be changed, but specific code is required MAIN_SLOT_B, // Can actually be changed, but specific code is required + MAIN_SI_DEVICE_0, // Can actually be changed, but specific code is required + MAIN_SI_DEVICE_1, // Can actually be changed, but specific code is required + MAIN_SI_DEVICE_2, // Can actually be changed, but specific code is required + MAIN_SI_DEVICE_3, // Can actually be changed, but specific code is required }; private static final Set NOT_RUNTIME_EDITABLE = diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java deleted file mode 100644 index d754871445..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyBooleanSetting.java +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.settings.model; - -public class LegacyBooleanSetting extends AbstractLegacySetting implements AbstractBooleanSetting -{ - private final boolean mDefaultValue; - - public LegacyBooleanSetting(String file, String section, String key, boolean defaultValue) - { - super(file, section, key); - mDefaultValue = defaultValue; - } - - @Override - public boolean getBoolean(Settings settings) - { - return settings.getSection(mFile, mSection).getBoolean(mKey, mDefaultValue); - } - - @Override - public void setBoolean(Settings settings, boolean newValue) - { - settings.getSection(mFile, mSection).setBoolean(mKey, newValue); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java deleted file mode 100644 index 0413f9a9a9..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/LegacyIntSetting.java +++ /dev/null @@ -1,26 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.features.settings.model; - -public class LegacyIntSetting extends AbstractLegacySetting implements AbstractIntSetting -{ - private final int mDefaultValue; - - public LegacyIntSetting(String file, String section, String key, int defaultValue) - { - super(file, section, key); - mDefaultValue = defaultValue; - } - - @Override - public int getInt(Settings settings) - { - return settings.getSection(mFile, mSection).getInt(mKey, mDefaultValue); - } - - @Override - public void setInt(Settings settings, int newValue) - { - settings.getSection(mFile, mSection).setInt(mKey, newValue); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index b9c2c3f840..58869a9e95 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -16,8 +16,6 @@ import org.dolphinemu.dolphinemu.features.settings.model.AdHocBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.FloatSetting; import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; -import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; -import org.dolphinemu.dolphinemu.features.settings.model.LegacyIntSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyStringSetting; import org.dolphinemu.dolphinemu.features.settings.model.PostProcessing; import org.dolphinemu.dolphinemu.features.settings.model.Settings; @@ -555,51 +553,26 @@ public final class SettingsFragmentPresenter private void addGcPadSettings(ArrayList sl) { - for (int i = 0; i < 4; i++) - { - // GameCube controller 1 is set to Emulated by default, all others disabled - int defaultValue = i == 0 ? 6 : 0; - - LegacyIntSetting gcPadSetting; - if (mGameID.equals("")) - { - gcPadSetting = new LegacyIntSetting(Settings.FILE_DOLPHIN, Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCPAD_TYPE + i, defaultValue); - } - else - { - gcPadSetting = new LegacyIntSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_GCPAD_G_TYPE + i, defaultValue); - } - // TODO: This controller_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. - sl.add(new SingleChoiceSetting(mContext, gcPadSetting, R.string.controller_0 + i, 0, - R.array.gcpadTypeEntries, R.array.gcpadTypeValues, MenuTag.getGCPadMenuTag(i))); - } + sl.add(new SingleChoiceSetting(mContext, IntSetting.MAIN_SI_DEVICE_0, R.string.controller_0, 0, + R.array.gcpadTypeEntries, R.array.gcpadTypeValues, MenuTag.getGCPadMenuTag(0))); + sl.add(new SingleChoiceSetting(mContext, IntSetting.MAIN_SI_DEVICE_1, R.string.controller_1, 0, + R.array.gcpadTypeEntries, R.array.gcpadTypeValues, MenuTag.getGCPadMenuTag(1))); + sl.add(new SingleChoiceSetting(mContext, IntSetting.MAIN_SI_DEVICE_2, R.string.controller_2, 0, + R.array.gcpadTypeEntries, R.array.gcpadTypeValues, MenuTag.getGCPadMenuTag(2))); + sl.add(new SingleChoiceSetting(mContext, IntSetting.MAIN_SI_DEVICE_3, R.string.controller_3, 0, + R.array.gcpadTypeEntries, R.array.gcpadTypeValues, MenuTag.getGCPadMenuTag(3))); } private void addWiimoteSettings(ArrayList sl) { - for (int i = 0; i < 4; i++) - { - // Wii Remote 1 is set to Emulated by default, all others disabled - int defaultValue = i == 0 ? 1 : 0; - - LegacyIntSetting wiimoteSetting; - if (mGameID.equals("")) - { - wiimoteSetting = new LegacyIntSetting(Settings.FILE_WIIMOTE, - Settings.SECTION_WIIMOTE + (i + 1), SettingsFile.KEY_WIIMOTE_TYPE, defaultValue); - } - else - { - wiimoteSetting = new LegacyIntSetting(Settings.GAME_SETTINGS_PLACEHOLDER_FILE_NAME, - Settings.SECTION_CONTROLS, SettingsFile.KEY_WIIMOTE_G_TYPE + i, defaultValue); - } - // TODO: This wiimote_0 + i business is quite the hack. It should work, but only if the definitions are kept together and in order. - sl.add(new SingleChoiceSetting(mContext, wiimoteSetting, R.string.wiimote_4 + i, 0, - R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, - MenuTag.getWiimoteMenuTag(i + 4))); - } + sl.add(new SingleChoiceSetting(mContext, IntSetting.WIIMOTE_1_SOURCE, R.string.wiimote_4, 0, + R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, MenuTag.getWiimoteMenuTag(4))); + sl.add(new SingleChoiceSetting(mContext, IntSetting.WIIMOTE_2_SOURCE, R.string.wiimote_5, 0, + R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, MenuTag.getWiimoteMenuTag(5))); + sl.add(new SingleChoiceSetting(mContext, IntSetting.WIIMOTE_3_SOURCE, R.string.wiimote_6, 0, + R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, MenuTag.getWiimoteMenuTag(6))); + sl.add(new SingleChoiceSetting(mContext, IntSetting.WIIMOTE_4_SOURCE, R.string.wiimote_7, 0, + R.array.wiimoteTypeEntries, R.array.wiimoteTypeValues, MenuTag.getWiimoteMenuTag(7))); } private void addGraphicsSettings(ArrayList sl) @@ -891,15 +864,10 @@ public final class SettingsFragmentPresenter } else if (gcPadType == 12) // Adapter { - LegacyBooleanSetting rumble = new LegacyBooleanSetting(Settings.FILE_DOLPHIN, - Settings.SECTION_INI_CORE, SettingsFile.KEY_GCADAPTER_RUMBLE + gcPadNumber, false); - LegacyBooleanSetting bongo = new LegacyBooleanSetting(Settings.FILE_DOLPHIN, - Settings.SECTION_INI_CORE, SettingsFile.KEY_GCADAPTER_BONGOS + gcPadNumber, false); - - sl.add(new CheckBoxSetting(mContext, rumble, R.string.gc_adapter_rumble, - R.string.gc_adapter_rumble_description)); - sl.add(new CheckBoxSetting(mContext, bongo, R.string.gc_adapter_bongos, - R.string.gc_adapter_bongos_description)); + sl.add(new CheckBoxSetting(mContext, BooleanSetting.getSettingForAdapterRumble(gcPadNumber), + R.string.gc_adapter_rumble, R.string.gc_adapter_rumble_description)); + sl.add(new CheckBoxSetting(mContext, BooleanSetting.getSettingForSimulateKonga(gcPadNumber), + R.string.gc_adapter_bongos, R.string.gc_adapter_bongos_description)); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java index dfa78e6eb2..87f58b4d02 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java @@ -20,9 +20,7 @@ public final class SettingsFile public static final String KEY_ISO_PATH_BASE = "ISOPath"; public static final String KEY_ISO_PATHS = "ISOPaths"; - public static final String KEY_GCPAD_TYPE = "SIDevice"; public static final String KEY_GCPAD_PLAYER_1 = "SIDevice0"; - public static final String KEY_GCPAD_G_TYPE = "PadType"; public static final String KEY_GCBIND_A = "InputA_"; public static final String KEY_GCBIND_B = "InputB_"; @@ -45,16 +43,11 @@ public final class SettingsFile public static final String KEY_GCBIND_DPAD_LEFT = "DPadLeft_"; public static final String KEY_GCBIND_DPAD_RIGHT = "DPadRight_"; - public static final String KEY_GCADAPTER_RUMBLE = "AdapterRumble"; - public static final String KEY_GCADAPTER_BONGOS = "SimulateKonga"; - public static final String KEY_EMU_RUMBLE = "EmuRumble"; - public static final String KEY_WIIMOTE_TYPE = "Source"; public static final String KEY_WIIMOTE_EXTENSION = "Extension"; // Controller keys for game specific settings - public static final String KEY_WIIMOTE_G_TYPE = "WiimoteSource"; public static final String KEY_WIIMOTE_PROFILE = "WiimoteProfile"; public static final String KEY_WIIBIND_A = "WiimoteA_"; diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index c403f53768..06374b6a7c 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -6,13 +6,10 @@ app dolphinemu - GameCube Controller 1 GameCube Controller 2 GameCube Controller 3 GameCube Controller 4 - Control Stick C Stick @@ -22,23 +19,15 @@ Analog Radius (High value = High sensitivity) Analog Threshold (Low value = High sensitivity) - Wii Remote 1 Wii Remote 2 Wii Remote 3 Wii Remote 4 - - Wii Remote Extension 1 Wii Remote Extension 2 Wii Remote Extension 3 Wii Remote Extension 4 - Extension Choose and bind the Wii Remote extension. @@ -316,9 +305,9 @@ Dump Textures Dumps decoded game textures based on the other flags to User/Dump/Textures/<game_id>/. If unsure, leave this unchecked. Dump Base Textures - Whether to dump mipmapped game textures to User/Dump/Textures/<game_id>/. + Whether to dump base game textures to User/Dump/Textures/<game_id>/. Dump Mip Maps - Whether to dump base game textures to User/Dump/Textures/<game_id>/. + Whether to dump mipmapped game textures to User/Dump/Textures/<game_id>/. Misc Crop Crops the picture from its native aspect ratio to 4:3 or 16:9. If unsure, leave this unchecked. diff --git a/Source/Android/jni/Config/NativeConfig.cpp b/Source/Android/jni/Config/NativeConfig.cpp index bdeafc5f13..4ec0d0bd86 100644 --- a/Source/Android/jni/Config/NativeConfig.cpp +++ b/Source/Android/jni/Config/NativeConfig.cpp @@ -38,6 +38,10 @@ static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section, { system = Config::System::Logger; } + else if (decoded_file == "WiimoteNew") + { + system = Config::System::WiiPad; + } else { ASSERT(false); @@ -147,7 +151,10 @@ Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey( JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key) { const Config::Location location = GetLocation(env, file, section, key); - return static_cast(GetLayer(layer, location)->DeleteKey(location)); + const bool had_value = GetLayer(layer, location)->DeleteKey(location); + if (had_value) + Config::OnConfigChanged(); + return static_cast(had_value); } JNIEXPORT jstring JNICALL diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index b533ba74d6..f150c2c9e9 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -84,7 +84,6 @@ std::mutex s_surface_lock; bool s_need_nonblocking_alert_msg; Common::Flag s_is_booting; -bool s_have_wm_user_stop = false; bool s_game_metadata_is_valid = false; } // Anonymous namespace @@ -123,7 +122,6 @@ void Host_Message(HostMessageID id) } else if (id == HostMessageID::WMUserStop) { - s_have_wm_user_stop = true; if (Core::IsRunning()) Core::QueueHostJob(&Core::Stop); } @@ -496,7 +494,6 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_RefreshWiimo JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReloadWiimoteConfig(JNIEnv*, jclass) { - WiimoteReal::LoadSettings(); Wiimote::LoadConfig(); } @@ -554,8 +551,6 @@ static void Run(JNIEnv* env, std::unique_ptr&& boot, bool riivol WiimoteReal::InitAdapterClass(); - s_have_wm_user_stop = false; - if (riivolution && std::holds_alternative(boot->parameters)) { const std::string& riivolution_dir = File::GetUserPath(D_RIIVOLUTION_IDX); @@ -572,41 +567,25 @@ static void Run(JNIEnv* env, std::unique_ptr&& boot, bool riivol s_need_nonblocking_alert_msg = true; std::unique_lock surface_guard(s_surface_lock); - bool successful_boot = BootManager::BootCore(std::move(boot), wsi); - if (successful_boot) + if (BootManager::BootCore(std::move(boot), wsi)) { ButtonManager::Init(SConfig::GetInstance().GetGameID()); - static constexpr int TIMEOUT = 10000; static constexpr int WAIT_STEP = 25; - int time_waited = 0; - // A Core::CORE_ERROR state would be helpful here. - while (!Core::IsRunningAndStarted()) - { - if (time_waited >= TIMEOUT || s_have_wm_user_stop) - { - successful_boot = false; - break; - } - + while (Core::GetState() == Core::State::Starting) std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_STEP)); - time_waited += WAIT_STEP; - } } s_is_booting.Clear(); s_need_nonblocking_alert_msg = false; surface_guard.unlock(); - if (successful_boot) + while (Core::IsRunning()) { - while (Core::IsRunningAndStarted()) - { - host_identity_guard.unlock(); - s_update_main_frame_event.Wait(); - host_identity_guard.lock(); - Core::HostDispatchJobs(); - } + host_identity_guard.unlock(); + s_update_main_frame_event.Wait(); + host_identity_guard.lock(); + Core::HostDispatchJobs(); } s_game_metadata_is_valid = false; diff --git a/Source/Core/Common/CommonPaths.h b/Source/Core/Common/CommonPaths.h index 1482b9656c..9e0be315f7 100644 --- a/Source/Core/Common/CommonPaths.h +++ b/Source/Core/Common/CommonPaths.h @@ -77,7 +77,7 @@ #define SHADERCACHE_LEGACY_DIR "ShaderCache" // The theme directory used by default -#define DEFAULT_THEME_DIR "Clean" +#define DEFAULT_THEME_DIR "Mario Party Netplay" // Filenames // Files in the directory returned by GetUserPath(D_CONFIG_IDX) diff --git a/Source/Core/Common/JitRegister.cpp b/Source/Core/Common/JitRegister.cpp index eb5845d5cb..0dd5557f11 100644 --- a/Source/Core/Common/JitRegister.cpp +++ b/Source/Core/Common/JitRegister.cpp @@ -81,15 +81,13 @@ bool IsEnabled() return s_is_enabled; } -void RegisterV(const void* base_address, u32 code_size, const char* format, va_list args) +void Register(const void* base_address, u32 code_size, const std::string& symbol_name) { #if !(defined USE_OPROFILE && USE_OPROFILE) && !defined(USE_VTUNE) if (!s_perf_map_file.IsOpen()) return; #endif - std::string symbol_name = StringFromFormatV(format, args); - #if defined USE_OPROFILE && USE_OPROFILE op_write_native_code(s_agent, symbol_name.c_str(), (u64)base_address, base_address, code_size); #endif diff --git a/Source/Core/Common/JitRegister.h b/Source/Core/Common/JitRegister.h index 084f4486fa..49dfb5ab44 100644 --- a/Source/Core/Common/JitRegister.h +++ b/Source/Core/Common/JitRegister.h @@ -2,31 +2,32 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include + #include + +#include + #include "Common/CommonTypes.h" namespace JitRegister { void Init(const std::string& perf_dir); void Shutdown(); -void RegisterV(const void* base_address, u32 code_size, const char* format, va_list args); +void Register(const void* base_address, u32 code_size, const std::string& symbol_name); bool IsEnabled(); -inline void Register(const void* base_address, u32 code_size, const char* format, ...) +template +inline void Register(const void* base_address, u32 code_size, fmt::format_string format, + Args&&... args) { - va_list args; - va_start(args, format); - RegisterV(base_address, code_size, format, args); - va_end(args); + Register(base_address, code_size, fmt::format(format, std::forward(args)...)); } -inline void Register(const void* start, const void* end, const char* format, ...) +template +inline void Register(const void* start, const void* end, fmt::format_string format, + Args&&... args) { - va_list args; - va_start(args, format); u32 code_size = (u32)((const char*)end - (const char*)start); - RegisterV(start, code_size, format, args); - va_end(args); + Register(start, code_size, fmt::format(format, std::forward(args)...)); } } // namespace JitRegister diff --git a/Source/Core/Common/Logging/ConsoleListener.h b/Source/Core/Common/Logging/ConsoleListener.h index 2c5e744751..3901f29580 100644 --- a/Source/Core/Common/Logging/ConsoleListener.h +++ b/Source/Core/Common/Logging/ConsoleListener.h @@ -14,5 +14,5 @@ public: void Log(Common::Log::LogLevel level, const char* text) override; private: - bool m_use_color = false; + [[maybe_unused]] bool m_use_color = false; }; diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h index 9b31a9acd5..4f3af04dc5 100644 --- a/Source/Core/Common/MathUtil.h +++ b/Source/Core/Common/MathUtil.h @@ -37,7 +37,7 @@ constexpr Dest SaturatingCast(T value) { static_assert(std::is_integral()); - constexpr Dest lo = std::numeric_limits::lowest(); + [[maybe_unused]] constexpr Dest lo = std::numeric_limits::lowest(); constexpr Dest hi = std::numeric_limits::max(); // T being a signed integer and Dest unsigned is a problematic case because the value will diff --git a/Source/Core/Common/Version.cpp b/Source/Core/Common/Version.cpp index 7801aaae30..d6d6c75890 100644 --- a/Source/Core/Common/Version.cpp +++ b/Source/Core/Common/Version.cpp @@ -1,5 +1,6 @@ // Copyright 2008 Dolphin Emulator Project -// SPDX-License-Identifier: GPL-2.0-or-later +// Licensed under GPLv2+ +// Refer to the license.txt file included. #include "Common/Version.h" @@ -17,61 +18,19 @@ namespace Common #define BUILD_TYPE_STR "" #endif -const std::string& GetScmRevStr() -{ - static const std::string scm_rev_str = "Dolphin " -#if !SCM_IS_MASTER - "[" SCM_BRANCH_STR "] " -#endif +// MPN Dolphin Version +const std::string scm_rev_str = "Dolphin MPN - (" SCM_REV_STR ")"; -#ifdef __INTEL_COMPILER - BUILD_TYPE_STR SCM_DESC_STR "-ICC"; -#else - BUILD_TYPE_STR SCM_DESC_STR; -#endif - return scm_rev_str; -} +const std::string scm_rev_git_str = SCM_REV_STR; +const std::string scm_desc_str = SCM_DESC_STR; +const std::string scm_branch_str = SCM_BRANCH_STR; +const std::string scm_distributor_str = SCM_DISTRIBUTOR_STR; -const std::string& GetScmRevGitStr() -{ - static const std::string scm_rev_git_str = SCM_REV_STR; - return scm_rev_git_str; -} - -const std::string& GetScmDescStr() -{ - static const std::string scm_desc_str = SCM_DESC_STR; - return scm_desc_str; -} - -const std::string& GetScmBranchStr() -{ - static const std::string scm_branch_str = SCM_BRANCH_STR; - return scm_branch_str; -} - -const std::string& GetScmDistributorStr() -{ - static const std::string scm_distributor_str = SCM_DISTRIBUTOR_STR; - return scm_distributor_str; -} - -const std::string& GetScmUpdateTrackStr() -{ - static const std::string scm_update_track_str = SCM_UPDATE_TRACK_STR; - return scm_update_track_str; -} - -const std::string& GetNetplayDolphinVer() -{ #ifdef _WIN32 - static const std::string netplay_dolphin_ver = SCM_DESC_STR " Win"; +const std::string netplay_dolphin_ver = SCM_DESC_STR " Win"; #elif __APPLE__ - static const std::string netplay_dolphin_ver = SCM_DESC_STR " Mac"; +const std::string netplay_dolphin_ver = SCM_DESC_STR " Mac"; #else - static const std::string netplay_dolphin_ver = SCM_DESC_STR " Lin"; +const std::string netplay_dolphin_ver = SCM_DESC_STR " Lin"; #endif - return netplay_dolphin_ver; -} - } // namespace Common diff --git a/Source/Core/Core/Boot/Boot.cpp b/Source/Core/Core/Boot/Boot.cpp index 30691c730f..0ad7f6ec12 100644 --- a/Source/Core/Core/Boot/Boot.cpp +++ b/Source/Core/Core/Boot/Boot.cpp @@ -362,24 +362,17 @@ void CBoot::UpdateDebugger_MapLoaded() bool CBoot::FindMapFile(std::string* existing_map_file, std::string* writable_map_file) { const std::string& game_id = SConfig::GetInstance().m_debugger_game_id; + std::string path = File::GetUserPath(D_MAPS_IDX) + game_id + ".map"; if (writable_map_file) - *writable_map_file = File::GetUserPath(D_MAPS_IDX) + game_id + ".map"; + *writable_map_file = path; - static const std::array maps_directories{ - File::GetUserPath(D_MAPS_IDX), - File::GetSysDirectory() + MAPS_DIR DIR_SEP, - }; - for (const auto& directory : maps_directories) + if (File::Exists(path)) { - std::string path = directory + game_id + ".map"; - if (File::Exists(path)) - { - if (existing_map_file) - *existing_map_file = std::move(path); + if (existing_map_file) + *existing_map_file = std::move(path); - return true; - } + return true; } return false; diff --git a/Source/Core/Core/BootManager.cpp b/Source/Core/Core/BootManager.cpp index 7ca13a7729..755a0f9277 100644 --- a/Source/Core/Core/BootManager.cpp +++ b/Source/Core/Core/BootManager.cpp @@ -53,58 +53,6 @@ namespace BootManager { -// TODO this is an ugly hack which allows us to restore values trampled by per-game settings -// Apply fire liberally -struct ConfigCache -{ -public: - // fill the cache with values from the configuration - void SaveConfig(const SConfig& config); - // restore values to the configuration from the cache - void RestoreConfig(SConfig* config); - - // These store if the relevant setting should be reset back later (true) or if it should be left - // alone on restore (false) - bool bSetVolume = false; - std::array bSetWiimoteSource{}; - -private: - bool valid = false; - std::array iWiimoteSource{}; -}; - -void ConfigCache::SaveConfig(const SConfig& config) -{ - valid = true; - - for (int i = 0; i != MAX_BBMOTES; ++i) - iWiimoteSource[i] = WiimoteCommon::GetSource(i); - - bSetVolume = false; - bSetWiimoteSource.fill(false); -} - -void ConfigCache::RestoreConfig(SConfig* config) -{ - if (!valid) - return; - - valid = false; - - // Only change these back if they were actually set by game ini, since they can be changed while a - // game is running. - if (config->bWii) - { - for (unsigned int i = 0; i < MAX_BBMOTES; ++i) - { - if (bSetWiimoteSource[i]) - WiimoteCommon::SetSource(i, iWiimoteSource[i]); - } - } -} - -static ConfigCache config_cache; - // Boot the ISO or file bool BootCore(std::unique_ptr boot, const WindowSystemInfo& wsi) { @@ -113,46 +61,9 @@ bool BootCore(std::unique_ptr boot, const WindowSystemInfo& wsi) SConfig& StartUp = SConfig::GetInstance(); - config_cache.SaveConfig(StartUp); - if (!StartUp.SetPathsAndGameMetadata(*boot)) return false; - // Load game specific settings - if (!std::holds_alternative(boot->parameters)) - { - IniFile game_ini = StartUp.LoadGameIni(); - - // General settings - IniFile::Section* controls_section = game_ini.GetOrCreateSection("Controls"); - - // Wii settings - if (StartUp.bWii) - { - int source; - for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) - { - controls_section->Get(fmt::format("WiimoteSource{}", i), &source, -1); - if (source != -1 && WiimoteCommon::GetSource(i) != WiimoteSource(source) && - WiimoteSource(source) >= WiimoteSource::None && - WiimoteSource(source) <= WiimoteSource::Real) - { - config_cache.bSetWiimoteSource[i] = true; - WiimoteCommon::SetSource(i, WiimoteSource(source)); - } - } - controls_section->Get("WiimoteSourceBB", &source, -1); - if (source != -1 && - WiimoteCommon::GetSource(WIIMOTE_BALANCE_BOARD) != WiimoteSource(source) && - (WiimoteSource(source) == WiimoteSource::None || - WiimoteSource(source) == WiimoteSource::Real)) - { - config_cache.bSetWiimoteSource[WIIMOTE_BALANCE_BOARD] = true; - WiimoteCommon::SetSource(WIIMOTE_BALANCE_BOARD, WiimoteSource(source)); - } - } - } - // Movie settings if (Movie::IsPlayingInput() && Movie::IsConfigSaved()) { @@ -313,7 +224,6 @@ void RestoreConfig() Config::RemoveLayer(Config::LayerType::GlobalGame); Config::RemoveLayer(Config::LayerType::LocalGame); SConfig::GetInstance().ResetRunningGameMetadata(); - config_cache.RestoreConfig(&SConfig::GetInstance()); } } // namespace BootManager diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index c0608572df..4063e01562 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -36,6 +36,8 @@ add_library(core Config/SYSCONFSettings.h Config/UISettings.cpp Config/UISettings.h + Config/WiimoteSettings.cpp + Config/WiimoteSettings.h ConfigLoaders/BaseConfigLoader.cpp ConfigLoaders/BaseConfigLoader.h ConfigLoaders/GameConfigLoader.cpp diff --git a/Source/Core/Core/Config/MainSettings.cpp b/Source/Core/Core/Config/MainSettings.cpp index 506663b9ec..4559b2d0ff 100644 --- a/Source/Core/Core/Config/MainSettings.cpp +++ b/Source/Core/Core/Config/MainSettings.cpp @@ -39,7 +39,7 @@ const Info MAIN_TIMING_VARIANCE{{System::Main, "Core", "TimingVariance"}, 4 const Info MAIN_CPU_THREAD{{System::Main, "Core", "CPUThread"}, true}; const Info MAIN_SYNC_ON_SKIP_IDLE{{System::Main, "Core", "SyncOnSkipIdle"}, true}; const Info MAIN_DEFAULT_ISO{{System::Main, "Core", "DefaultISO"}, ""}; -const Info MAIN_ENABLE_CHEATS{{System::Main, "Core", "EnableCheats"}, false}; +const Info MAIN_ENABLE_CHEATS{{System::Main, "Core", "EnableCheats"}, true}; const Info MAIN_GC_LANGUAGE{{System::Main, "Core", "SelectedLanguage"}, 0}; const Info MAIN_OVERRIDE_REGION_SETTINGS{{System::Main, "Core", "OverrideRegionSettings"}, false}; diff --git a/Source/Core/Core/Config/NetplaySettings.cpp b/Source/Core/Core/Config/NetplaySettings.cpp index ad30ee72ad..d9fdef7fe9 100644 --- a/Source/Core/Core/Config/NetplaySettings.cpp +++ b/Source/Core/Core/Config/NetplaySettings.cpp @@ -21,7 +21,7 @@ const Info NETPLAY_TRAVERSAL_CHOICE{{System::Main, "NetPlay", "Trav const Info NETPLAY_INDEX_URL{{System::Main, "NetPlay", "IndexServer"}, "https://lobby.dolphin-emu.org"}; -const Info NETPLAY_USE_INDEX{{System::Main, "NetPlay", "UseIndex"}, false}; +const Info NETPLAY_USE_INDEX{{System::Main, "NetPlay", "UseIndex"}, true}; const Info NETPLAY_INDEX_NAME{{System::Main, "NetPlay", "IndexName"}, ""}; const Info NETPLAY_INDEX_REGION{{System::Main, "NetPlay", "IndexRegion"}, ""}; const Info NETPLAY_INDEX_PASSWORD{{System::Main, "NetPlay", "IndexPassword"}, ""}; @@ -46,7 +46,7 @@ const Info NETPLAY_BUFFER_SIZE{{System::Main, "NetPlay", "BufferSize"}, 5}; const Info NETPLAY_CLIENT_BUFFER_SIZE{{System::Main, "NetPlay", "BufferSizeClient"}, 1}; const Info NETPLAY_WRITE_SAVE_DATA{{System::Main, "NetPlay", "WriteSaveData"}, true}; -const Info NETPLAY_LOAD_WII_SAVE{{System::Main, "NetPlay", "LoadWiiSave"}, false}; +const Info NETPLAY_LOAD_WII_SAVE{{System::Main, "NetPlay", "LoadWiiSave"}, true}; const Info NETPLAY_SYNC_SAVES{{System::Main, "NetPlay", "SyncSaves"}, true}; const Info NETPLAY_SYNC_CODES{{System::Main, "NetPlay", "SyncCodes"}, true}; const Info NETPLAY_RECORD_INPUTS{{System::Main, "NetPlay", "RecordInputs"}, false}; diff --git a/Source/Core/Core/Config/WiimoteSettings.cpp b/Source/Core/Core/Config/WiimoteSettings.cpp new file mode 100644 index 0000000000..6a9fe8efb2 --- /dev/null +++ b/Source/Core/Core/Config/WiimoteSettings.cpp @@ -0,0 +1,30 @@ +// Copyright 2022 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "Core/Config/WiimoteSettings.h" + +#include "Core/HW/Wiimote.h" + +namespace Config +{ +const Info WIIMOTE_1_SOURCE{{System::WiiPad, "Wiimote1", "Source"}, + WiimoteSource::Emulated}; +const Info WIIMOTE_2_SOURCE{{System::WiiPad, "Wiimote2", "Source"}, + WiimoteSource::None}; +const Info WIIMOTE_3_SOURCE{{System::WiiPad, "Wiimote3", "Source"}, + WiimoteSource::None}; +const Info WIIMOTE_4_SOURCE{{System::WiiPad, "Wiimote4", "Source"}, + WiimoteSource::None}; +const Info WIIMOTE_BB_SOURCE{{System::WiiPad, "BalanceBoard", "Source"}, + WiimoteSource::None}; + +const Info& GetInfoForWiimoteSource(int index) +{ + static const std::array*, 5> infos{ + &WIIMOTE_1_SOURCE, &WIIMOTE_2_SOURCE, &WIIMOTE_3_SOURCE, + &WIIMOTE_4_SOURCE, &WIIMOTE_BB_SOURCE, + }; + return *infos[index]; +} + +} // namespace Config diff --git a/Source/Core/Core/Config/WiimoteSettings.h b/Source/Core/Core/Config/WiimoteSettings.h new file mode 100644 index 0000000000..9e97c35726 --- /dev/null +++ b/Source/Core/Core/Config/WiimoteSettings.h @@ -0,0 +1,20 @@ +// Copyright 2022 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "Common/Config/Config.h" + +enum class WiimoteSource; + +namespace Config +{ +extern const Info WIIMOTE_1_SOURCE; +extern const Info WIIMOTE_2_SOURCE; +extern const Info WIIMOTE_3_SOURCE; +extern const Info WIIMOTE_4_SOURCE; +extern const Info WIIMOTE_BB_SOURCE; + +const Info& GetInfoForWiimoteSource(int index); + +} // namespace Config diff --git a/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp b/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp index cf864b97b2..62fe3e5968 100644 --- a/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp +++ b/Source/Core/Core/ConfigLoaders/GameConfigLoader.cpp @@ -26,6 +26,7 @@ #include "Core/Config/MainSettings.h" #include "Core/Config/SYSCONFSettings.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigLoaders/IsSettingSaveable.h" namespace ConfigLoaders @@ -79,6 +80,11 @@ static const INIToLocationMap& GetINIToLocationMap() {{"Controls", "PadType1"}, {Config::GetInfoForSIDevice(1).GetLocation()}}, {{"Controls", "PadType2"}, {Config::GetInfoForSIDevice(2).GetLocation()}}, {{"Controls", "PadType3"}, {Config::GetInfoForSIDevice(3).GetLocation()}}, + {{"Controls", "WiimoteSource0"}, {Config::WIIMOTE_1_SOURCE.GetLocation()}}, + {{"Controls", "WiimoteSource1"}, {Config::WIIMOTE_2_SOURCE.GetLocation()}}, + {{"Controls", "WiimoteSource2"}, {Config::WIIMOTE_3_SOURCE.GetLocation()}}, + {{"Controls", "WiimoteSource3"}, {Config::WIIMOTE_4_SOURCE.GetLocation()}}, + {{"Controls", "WiimoteSourceBB"}, {Config::WIIMOTE_BB_SOURCE.GetLocation()}}, }; return ini_to_location; } diff --git a/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp b/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp index 18fa55f176..2dd5a5697d 100644 --- a/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp +++ b/Source/Core/Core/ConfigLoaders/IsSettingSaveable.cpp @@ -10,6 +10,7 @@ #include "Core/Config/GraphicsSettings.h" #include "Core/Config/MainSettings.h" #include "Core/Config/UISettings.h" +#include "Core/Config/WiimoteSettings.h" namespace ConfigLoaders { @@ -129,6 +130,14 @@ bool IsSettingSaveable(const Config::Location& config_location) // UI.General &Config::MAIN_USE_DISCORD_PRESENCE.GetLocation(), + + // Wiimote + + &Config::WIIMOTE_1_SOURCE.GetLocation(), + &Config::WIIMOTE_2_SOURCE.GetLocation(), + &Config::WIIMOTE_3_SOURCE.GetLocation(), + &Config::WIIMOTE_4_SOURCE.GetLocation(), + &Config::WIIMOTE_BB_SOURCE.GetLocation(), }; return std::any_of(begin(s_setting_saveable), end(s_setting_saveable), diff --git a/Source/Core/Core/ConfigLoaders/NetPlayConfigLoader.cpp b/Source/Core/Core/ConfigLoaders/NetPlayConfigLoader.cpp index b4a41baab9..c3e1d88a83 100644 --- a/Source/Core/Core/ConfigLoaders/NetPlayConfigLoader.cpp +++ b/Source/Core/Core/ConfigLoaders/NetPlayConfigLoader.cpp @@ -147,7 +147,7 @@ public: #endif // Check To Override Client's Cheat Codes - if (m_settings.m_SyncCodes && !m_settings.m_IsHosting) + if (!m_settings.m_IsHosting) { // Raise flag to use host's codes layer->Set(Config::SESSION_CODE_SYNC_OVERRIDE, true); diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index a945d72276..08b615f5bf 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -1031,7 +1031,7 @@ int AddOnStateChangedCallback(StateChangedCallbackFunc callback) bool RemoveOnStateChangedCallback(int* handle) { - if (handle && *handle >= 0 && s_on_state_changed_callbacks.size() > *handle) + if (handle && *handle >= 0 && s_on_state_changed_callbacks.size() > static_cast(*handle)) { s_on_state_changed_callbacks[*handle] = StateChangedCallbackFunc(); *handle = -1; diff --git a/Source/Core/Core/DSP/Jit/x64/DSPEmitter.cpp b/Source/Core/Core/DSP/Jit/x64/DSPEmitter.cpp index bfe7d117ec..4960c4c992 100644 --- a/Source/Core/Core/DSP/Jit/x64/DSPEmitter.cpp +++ b/Source/Core/Core/DSP/Jit/x64/DSPEmitter.cpp @@ -470,6 +470,10 @@ void DSPEmitter::CompileDispatcher() RET(); } +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Winvalid-offsetof" +#endif Gen::OpArg DSPEmitter::M_SDSP_pc() { return MDisp(R15, static_cast(offsetof(SDSP, pc))); @@ -503,5 +507,8 @@ Gen::OpArg DSPEmitter::M_SDSP_reg_stack_ptrs(size_t index) return MDisp(R15, static_cast(offsetof(SDSP, reg_stack_ptrs) + sizeof(SDSP::reg_stack_ptrs[0]) * index)); } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif } // namespace DSP::JIT::x64 diff --git a/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp b/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp index d37e7fd460..617c92462a 100644 --- a/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp +++ b/Source/Core/Core/DSP/Jit/x64/DSPJitMultiplier.cpp @@ -149,7 +149,14 @@ void DSPEmitter::multiply_mulx(u8 axh0, u8 axh1) // direct use of prod regs by AX/AXWII (look @that part of ucode). void DSPEmitter::clrp(const UDSPInstruction opc) { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Winvalid-offsetof" +#endif int offset = static_cast(offsetof(SDSP, r.prod.val)); +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif // 64bit move to memory does not work. use 2 32bits MOV(32, MDisp(R15, offset + 0 * sizeof(u32)), Imm32(0xfff00000U)); MOV(32, MDisp(R15, offset + 1 * sizeof(u32)), Imm32(0x001000ffU)); diff --git a/Source/Core/Core/DSP/Jit/x64/DSPJitRegCache.cpp b/Source/Core/Core/DSP/Jit/x64/DSPJitRegCache.cpp index 9e69daafab..31becddf8d 100644 --- a/Source/Core/Core/DSP/Jit/x64/DSPJitRegCache.cpp +++ b/Source/Core/Core/DSP/Jit/x64/DSPJitRegCache.cpp @@ -20,6 +20,10 @@ namespace DSP::JIT::x64 constexpr std::array s_allocation_order = { {R8, R9, R10, R11, R12, R13, R14, R15, RSI, RDI, RBX, RCX, RDX, RAX, RBP}}; +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Winvalid-offsetof" +#endif static Gen::OpArg GetRegisterPointer(size_t reg) { switch (reg) @@ -95,6 +99,9 @@ static Gen::OpArg GetRegisterPointer(size_t reg) return M(static_cast(nullptr)); } } +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif #define STATIC_REG_ACCS //#undef STATIC_REG_ACCS diff --git a/Source/Core/Core/FifoPlayer/FifoDataFile.cpp b/Source/Core/Core/FifoPlayer/FifoDataFile.cpp index 7bfdff7833..119e19d861 100644 --- a/Source/Core/Core/FifoPlayer/FifoDataFile.cpp +++ b/Source/Core/Core/FifoPlayer/FifoDataFile.cpp @@ -285,19 +285,19 @@ std::unique_ptr FifoDataFile::Load(const std::string& filename, bo u32 size = std::min(BP_MEM_SIZE, header.bpMemSize); file.Seek(header.bpMemOffset, File::SeekOrigin::Begin); - file.ReadArray(&dataFile->m_BPMem); + file.ReadArray(dataFile->m_BPMem.data(), size); size = std::min(CP_MEM_SIZE, header.cpMemSize); file.Seek(header.cpMemOffset, File::SeekOrigin::Begin); - file.ReadArray(&dataFile->m_CPMem); + file.ReadArray(dataFile->m_CPMem.data(), size); size = std::min(XF_MEM_SIZE, header.xfMemSize); file.Seek(header.xfMemOffset, File::SeekOrigin::Begin); - file.ReadArray(&dataFile->m_XFMem); + file.ReadArray(dataFile->m_XFMem.data(), size); size = std::min(XF_REGS_SIZE, header.xfRegsSize); file.Seek(header.xfRegsOffset, File::SeekOrigin::Begin); - file.ReadArray(&dataFile->m_XFRegs); + file.ReadArray(dataFile->m_XFRegs.data(), size); // Texture memory saving was added in version 4. dataFile->m_TexMem.fill(0); diff --git a/Source/Core/Core/HW/Wiimote.cpp b/Source/Core/Core/HW/Wiimote.cpp index 30d522b564..675e533346 100644 --- a/Source/Core/Core/HW/Wiimote.cpp +++ b/Source/Core/Core/HW/Wiimote.cpp @@ -3,9 +3,13 @@ #include "Core/HW/Wiimote.h" +#include + #include "Common/ChunkFile.h" #include "Common/CommonTypes.h" +#include "Common/Config/Config.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/HW/WiimoteEmu/WiimoteEmu.h" @@ -23,16 +27,17 @@ // Limit the amount of wiimote connect requests, when a button is pressed in disconnected state static std::array s_last_connect_request_counter; -namespace WiimoteCommon +namespace { static std::array, MAX_BBMOTES> s_wiimote_sources; +static std::optional s_config_callback_id = std::nullopt; WiimoteSource GetSource(unsigned int index) { return s_wiimote_sources[index]; } -void SetSource(unsigned int index, WiimoteSource source) +void OnSourceChanged(unsigned int index, WiimoteSource source) { const WiimoteSource previous_source = s_wiimote_sources[index].exchange(source); @@ -44,9 +49,19 @@ void SetSource(unsigned int index, WiimoteSource source) WiimoteReal::HandleWiimoteSourceChange(index); - Core::RunAsCPUThread([index] { UpdateSource(index); }); + Core::RunAsCPUThread([index] { WiimoteCommon::UpdateSource(index); }); } +void RefreshConfig() +{ + for (int i = 0; i < MAX_BBMOTES; ++i) + OnSourceChanged(i, Config::Get(Config::GetInfoForWiimoteSource(i))); +} + +} // namespace + +namespace WiimoteCommon +{ void UpdateSource(unsigned int index) { const auto bluetooth = WiiUtils::GetBluetoothEmuDevice(); @@ -144,6 +159,12 @@ void Shutdown() s_config.ClearControllers(); WiimoteReal::Stop(); + + if (s_config_callback_id) + { + Config::RemoveConfigChangedCallback(*s_config_callback_id); + s_config_callback_id = std::nullopt; + } } void Initialize(InitializeMode init_mode) @@ -158,6 +179,10 @@ void Initialize(InitializeMode init_mode) LoadConfig(); + if (!s_config_callback_id) + s_config_callback_id = Config::AddConfigChangedCallback(RefreshConfig); + RefreshConfig(); + WiimoteReal::Initialize(init_mode); // Reload Wiimotes with our settings @@ -191,7 +216,7 @@ void DoState(PointerWrap& p) { for (int i = 0; i < MAX_BBMOTES; ++i) { - const WiimoteSource source = WiimoteCommon::GetSource(i); + const WiimoteSource source = GetSource(i); auto state_wiimote_source = u8(source); p.Do(state_wiimote_source); diff --git a/Source/Core/Core/HW/Wiimote.h b/Source/Core/Core/HW/Wiimote.h index 1df00539ce..ee59aec2e1 100644 --- a/Source/Core/Core/HW/Wiimote.h +++ b/Source/Core/Core/HW/Wiimote.h @@ -54,9 +54,6 @@ namespace WiimoteCommon { class HIDWiimote; -WiimoteSource GetSource(unsigned int index); -void SetSource(unsigned int index, WiimoteSource source); - // Used to reconnect WiimoteDevice instance to HID source. // Must be run from CPU thread. void UpdateSource(unsigned int index); @@ -108,6 +105,4 @@ void Resume(); void Pause(); void Refresh(); -void LoadSettings(); - } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp index 4f2896ad49..6b36551774 100644 --- a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp @@ -11,11 +11,14 @@ #include "Common/ChunkFile.h" #include "Common/CommonTypes.h" +#include "Common/Config/Config.h" #include "Common/FileUtil.h" #include "Common/IniFile.h" #include "Common/Swap.h" #include "Common/Thread.h" + #include "Core/Config/MainSettings.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/HW/Wiimote.h" @@ -25,6 +28,7 @@ #include "Core/HW/WiimoteReal/IOLinux.h" #include "Core/HW/WiimoteReal/IOWin.h" #include "Core/HW/WiimoteReal/IOhidapi.h" + #include "InputCommon/ControllerInterface/Wiimote/WiimoteController.h" #include "InputCommon/InputConfig.h" @@ -78,8 +82,11 @@ static void TryToFillWiimoteSlot(u32 index) { std::lock_guard lk(g_wiimotes_mutex); - if (g_wiimotes[index] || WiimoteCommon::GetSource(index) != WiimoteSource::Real) + if (g_wiimotes[index] || + Config::Get(Config::GetInfoForWiimoteSource(index)) != WiimoteSource::Real) + { return; + } // If the pool is empty, attempt to steal from ControllerInterface. if (s_wiimote_pool.empty()) @@ -531,9 +538,11 @@ static unsigned int CalculateWantedWiimotes() std::lock_guard lk(g_wiimotes_mutex); // Figure out how many real Wiimotes are required unsigned int wanted_wiimotes = 0; - for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) - if (WiimoteCommon::GetSource(i) == WiimoteSource::Real && !g_wiimotes[i]) + for (int i = 0; i < MAX_WIIMOTES; ++i) + { + if (Config::Get(Config::GetInfoForWiimoteSource(i)) == WiimoteSource::Real && !g_wiimotes[i]) ++wanted_wiimotes; + } return wanted_wiimotes; } @@ -541,9 +550,11 @@ static unsigned int CalculateWantedBB() { std::lock_guard lk(g_wiimotes_mutex); unsigned int wanted_bb = 0; - if (WiimoteCommon::GetSource(WIIMOTE_BALANCE_BOARD) == WiimoteSource::Real && + if (Config::Get(Config::WIIMOTE_BB_SOURCE) == WiimoteSource::Real && !g_wiimotes[WIIMOTE_BALANCE_BOARD]) + { ++wanted_bb; + } return wanted_bb; } @@ -823,32 +834,6 @@ int Wiimote::GetIndex() const return m_index; } -void LoadSettings() -{ - std::string ini_filename = File::GetUserPath(D_CONFIG_IDX) + WIIMOTE_INI_NAME ".ini"; - - IniFile inifile; - inifile.Load(ini_filename); - - for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) - { - std::string secname("Wiimote"); - secname += static_cast('1' + i); - IniFile::Section& sec = *inifile.GetOrCreateSection(secname); - - unsigned int source = 0; - sec.Get("Source", &source, i ? int(WiimoteSource::None) : int(WiimoteSource::Emulated)); - WiimoteCommon::SetSource(i, WiimoteSource(source)); - } - - std::string secname("BalanceBoard"); - IniFile::Section& sec = *inifile.GetOrCreateSection(secname); - - unsigned int bb_source = 0; - sec.Get("Source", &bb_source, int(WiimoteSource::None)); - WiimoteCommon::SetSource(WIIMOTE_BALANCE_BOARD, WiimoteSource(bb_source)); -} - // config dialog calls this when some settings change void Initialize(::Wiimote::InitializeMode init_mode) { @@ -924,7 +909,7 @@ void Pause() // Called from the Wiimote scanner thread (or UI thread on source change) static bool TryToConnectWiimoteToSlot(std::unique_ptr& wm, unsigned int i) { - if (WiimoteCommon::GetSource(i) != WiimoteSource::Real || g_wiimotes[i]) + if (Config::Get(Config::GetInfoForWiimoteSource(i)) != WiimoteSource::Real || g_wiimotes[i]) return false; if (!wm->Connect(i)) diff --git a/Source/Core/Core/HotkeyManager.cpp b/Source/Core/Core/HotkeyManager.cpp index 25b59d3943..02c0191256 100644 --- a/Source/Core/Core/HotkeyManager.cpp +++ b/Source/Core/Core/HotkeyManager.cpp @@ -463,9 +463,9 @@ void HotkeyManager::LoadDefaults(const ControllerInterface& ciface) set_key_expression(HK_UNDO_SAVE_STATE, hotkey_string({"Shift", "F12"})); // GBA - set_key_expression(HK_GBA_LOAD, hotkey_string({"`Shift`", "`O`"})); - set_key_expression(HK_GBA_UNLOAD, hotkey_string({"`Shift`", "`W`"})); - set_key_expression(HK_GBA_RESET, hotkey_string({"`Shift`", "`R`"})); + set_key_expression(HK_GBA_LOAD, hotkey_string({"`Ctrl`", "`Shift`", "`O`"})); + set_key_expression(HK_GBA_UNLOAD, hotkey_string({"`Ctrl`", "`Shift`", "`W`"})); + set_key_expression(HK_GBA_RESET, hotkey_string({"`Ctrl`", "`Shift`", "`R`"})); #ifdef _WIN32 set_key_expression(HK_GBA_VOLUME_DOWN, "`SUBTRACT`"); diff --git a/Source/Core/Core/IOS/IOS.cpp b/Source/Core/Core/IOS/IOS.cpp index 9465cbe918..364e647839 100644 --- a/Source/Core/Core/IOS/IOS.cpp +++ b/Source/Core/Core/IOS/IOS.cpp @@ -63,7 +63,6 @@ static std::unique_ptr s_ios; constexpr u64 ENQUEUE_REQUEST_FLAG = 0x100000000ULL; static CoreTiming::EventType* s_event_enqueue; -static CoreTiming::EventType* s_event_sdio_notify; static CoreTiming::EventType* s_event_finish_ppc_bootstrap; static CoreTiming::EventType* s_event_finish_ios_boot; @@ -789,14 +788,6 @@ void Kernel::UpdateWantDeterminism(const bool new_want_determinism) device.second->UpdateWantDeterminism(new_want_determinism); } -void Kernel::SDIO_EventNotify() -{ - // TODO: Potential race condition: If IsRunning() becomes false after - // it's checked, an event may be scheduled after CoreTiming shuts down. - if (SConfig::GetInstance().bWii && Core::IsRunning()) - CoreTiming::ScheduleEvent(0, s_event_sdio_notify, 0, CoreTiming::FromThread::NON_CPU); -} - void Kernel::DoState(PointerWrap& p) { p.Do(m_request_queue); @@ -886,16 +877,6 @@ void Init() s_ios->HandleIPCEvent(userdata); }); - s_event_sdio_notify = CoreTiming::RegisterEvent("SDIO_EventNotify", [](u64, s64) { - if (!s_ios) - return; - - auto sdio_slot0 = s_ios->GetDeviceByName("/dev/sdio/slot0"); - auto device = static_cast(sdio_slot0.get()); - if (device) - device->EventNotify(); - }); - ESDevice::InitializeEmulationState(); s_event_finish_ppc_bootstrap = diff --git a/Source/Core/Core/IOS/IOS.h b/Source/Core/Core/IOS/IOS.h index 14254fa9cf..773a5d4d64 100644 --- a/Source/Core/Core/IOS/IOS.h +++ b/Source/Core/Core/IOS/IOS.h @@ -125,8 +125,6 @@ public: std::shared_ptr GetFSDevice(); std::shared_ptr GetES(); - void SDIO_EventNotify(); - void EnqueueIPCRequest(u32 address); void EnqueueIPCReply(const Request& request, s32 return_value, s64 cycles_in_future = 0, CoreTiming::FromThread from = CoreTiming::FromThread::CPU); diff --git a/Source/Core/Core/IOS/SDIO/SDIOSlot0.cpp b/Source/Core/Core/IOS/SDIO/SDIOSlot0.cpp index 4ea206e6ce..8cb17f3267 100644 --- a/Source/Core/Core/IOS/SDIO/SDIOSlot0.cpp +++ b/Source/Core/Core/IOS/SDIO/SDIOSlot0.cpp @@ -14,8 +14,10 @@ #include "Common/IOFile.h" #include "Common/Logging/Log.h" #include "Common/SDCardUtil.h" + #include "Core/Config/MainSettings.h" #include "Core/Config/SessionSettings.h" +#include "Core/Core.h" #include "Core/HW/Memmap.h" #include "Core/IOS/IOS.h" #include "Core/IOS/VersionInfo.h" @@ -27,6 +29,29 @@ SDIOSlot0Device::SDIOSlot0Device(Kernel& ios, const std::string& device_name) { if (!Config::Get(Config::MAIN_ALLOW_SD_WRITES)) INFO_LOG_FMT(IOS_SD, "Writes to SD card disabled by user"); + + m_config_callback_id = Config::AddConfigChangedCallback([this] { RefreshConfig(); }); + m_sd_card_inserted = Config::Get(Config::MAIN_WII_SD_CARD); +} + +SDIOSlot0Device::~SDIOSlot0Device() +{ + Config::RemoveConfigChangedCallback(m_config_callback_id); +} + +void SDIOSlot0Device::RefreshConfig() +{ + if (m_sd_card_inserted != Config::Get(Config::MAIN_WII_SD_CARD)) + { + Core::RunAsCPUThread([this] { + const bool sd_card_inserted = Config::Get(Config::MAIN_WII_SD_CARD); + if (m_sd_card_inserted != sd_card_inserted) + { + m_sd_card_inserted = sd_card_inserted; + EventNotify(); + } + }); + } } void SDIOSlot0Device::DoState(PointerWrap& p) @@ -49,10 +74,14 @@ void SDIOSlot0Device::EventNotify() if (!m_event) return; - const bool sd_card_inserted = Config::Get(Config::MAIN_WII_SD_CARD); - if ((sd_card_inserted && m_event->type == EVENT_INSERT) || - (!sd_card_inserted && m_event->type == EVENT_REMOVE)) + if ((m_sd_card_inserted && m_event->type == EVENT_INSERT) || + (!m_sd_card_inserted && m_event->type == EVENT_REMOVE)) { + if (m_sd_card_inserted) + INFO_LOG_FMT(IOS_SD, "Notifying PPC of SD card insertion"); + else + INFO_LOG_FMT(IOS_SD, "Notifying PPC of SD card removal"); + m_ios.EnqueueIPCReply(m_event->request, m_event->type); m_event.reset(); } diff --git a/Source/Core/Core/IOS/SDIO/SDIOSlot0.h b/Source/Core/Core/IOS/SDIO/SDIOSlot0.h index efa6595c78..fcdabd372e 100644 --- a/Source/Core/Core/IOS/SDIO/SDIOSlot0.h +++ b/Source/Core/Core/IOS/SDIO/SDIOSlot0.h @@ -22,6 +22,7 @@ class SDIOSlot0Device : public Device { public: SDIOSlot0Device(Kernel& ios, const std::string& device_name); + ~SDIOSlot0Device() override; void DoState(PointerWrap& p) override; @@ -30,8 +31,6 @@ public: std::optional IOCtl(const IOCtlRequest& request) override; std::optional IOCtlV(const IOCtlVRequest& request) override; - void EventNotify(); - private: // SD Host Controller Registers enum @@ -124,6 +123,10 @@ private: Request request; }; + void RefreshConfig(); + + void EventNotify(); + IPCReply WriteHCRegister(const IOCtlRequest& request); IPCReply ReadHCRegister(const IOCtlRequest& request); IPCReply ResetCard(const IOCtlRequest& request); @@ -162,5 +165,8 @@ private: std::array m_registers{}; File::IOFile m_card; + + size_t m_config_callback_id; + bool m_sd_card_inserted = false; }; } // namespace IOS::HLE diff --git a/Source/Core/Core/MarioPartyNetplay/8Player.h b/Source/Core/Core/MarioPartyNetplay/8Player.h new file mode 100644 index 0000000000..7ec11032a1 --- /dev/null +++ b/Source/Core/Core/MarioPartyNetplay/8Player.h @@ -0,0 +1,28 @@ +#ifndef MPN_8PLAYER_H +#define MPN_8PLAYER_H + +#include +#include "InputCommon/GCPadStatus.h" + +#define MPN_TEAM_ACTIVE (1 << 0) +#define MPN_TEAM_L_READY (1 << 1) +#define MPN_TEAM_R_READY (1 << 2) + +typedef struct mpn_team_t +{ + uint8_t Flags; + GCPadStatus LeftPad; + GCPadStatus RightPad; +} mpn_team_t; + +bool mpn_8p_active (); +GCPadStatus mpn_8p_combined_input (uint8_t Port); +void mpn_8p_free (); +void mpn_8p_init (); +bool mpn_8p_port_ready (uint8_t Port); +void mpn_8p_push_back_input (GCPadStatus* Pad, uint8_t Port); +void mpn_8p_set_port_active (uint8_t Port, bool Active); + +extern mpn_team_t* Teams; + +#endif diff --git a/Source/Core/Core/MarioPartyNetplay/Discord.cpp b/Source/Core/Core/MarioPartyNetplay/Discord.cpp new file mode 100644 index 0000000000..e759136006 --- /dev/null +++ b/Source/Core/Core/MarioPartyNetplay/Discord.cpp @@ -0,0 +1,44 @@ +#include "Discord.h" +#include "UICommon/DiscordPresence.h" +#include "Core/Config/NetplaySettings.h" + +bool mpn_update_discord() +{ + if (!Memory::IsInitialized()) + return false; + + DiscordRichPresence RichPresence = {}; + + RichPresence.largeImageKey = CurrentState.Image ? CurrentState.Image : "default"; + RichPresence.largeImageText = CurrentState.Title ? CurrentState.Title : "In-Game"; + + if (CurrentState.Scenes != NULL && CurrentState.Scene != NULL) + RichPresence.state = CurrentState.Scene->Name.c_str(); + + if (CurrentState.Addresses != NULL) + { + char Details[128] = ""; + + if (CurrentState.Boards && CurrentState.Board) + { + snprintf(Details, sizeof(Details), "Players: 1/4 Turn: %d/%d", + mpn_read_value(CurrentState.Addresses->CurrentTurn, 1), + mpn_read_value(CurrentState.Addresses->TotalTurns, 1)); + + RichPresence.smallImageKey = CurrentState.Board->Icon.c_str(); + RichPresence.smallImageText = CurrentState.Board->Name.c_str(); + } + else + { + snprintf(Details, sizeof(Details), "Players: 1/4"); + RichPresence.smallImageKey = ""; + RichPresence.smallImageText = ""; + } + RichPresence.details = Details; + } + + RichPresence.startTimestamp = std::time(nullptr); + Discord_UpdatePresence(&RichPresence); + + return true; +} diff --git a/Source/Core/Core/MarioPartyNetplay/Discord.h b/Source/Core/Core/MarioPartyNetplay/Discord.h new file mode 100644 index 0000000000..af73b0bcca --- /dev/null +++ b/Source/Core/Core/MarioPartyNetplay/Discord.h @@ -0,0 +1,4 @@ +#include +#include "Gamestate.h" + +bool mpn_update_discord(); diff --git a/Source/Core/Core/MarioPartyNetplay/Gamestate.cpp b/Source/Core/Core/MarioPartyNetplay/Gamestate.cpp new file mode 100644 index 0000000000..5d279e1fef --- /dev/null +++ b/Source/Core/Core/MarioPartyNetplay/Gamestate.cpp @@ -0,0 +1,194 @@ +#include "Gamestate.h" + +mpn_state_t CurrentState; + +bool mpn_init_state() +{ + if (!Memory::IsInitialized()) + return false; + + switch (mpn_read_value(0x00000000, 4)) + { + case MPN_GAMEID_MP4: + CurrentState.Addresses = &MP4_ADDRESSES; + CurrentState.Boards = MP4_BOARDS; + CurrentState.Image = "box-mp4"; + CurrentState.IsMarioParty = true; + CurrentState.Scenes = MP4_GAMESTATES; + CurrentState.Title = "Mario Party 4"; + break; + case MPN_GAMEID_MP5: + CurrentState.Addresses = &MP5_ADDRESSES; + CurrentState.Boards = MP5_BOARDS; + CurrentState.Image = "box-mp5"; + CurrentState.IsMarioParty = true; + CurrentState.Scenes = MP5_GAMESTATES; + CurrentState.Title = "Mario Party 5"; + break; + case MPN_GAMEID_MP6: + CurrentState.Addresses = &MP6_ADDRESSES; + CurrentState.Boards = MP6_BOARDS; + CurrentState.Image = "box-mp6"; + CurrentState.IsMarioParty = true; + CurrentState.Scenes = MP6_GAMESTATES; + CurrentState.Title = "Mario Party 6"; + break; + case MPN_GAMEID_MP7: + CurrentState.Addresses = &MP7_ADDRESSES; + CurrentState.Boards = MP7_BOARDS; + CurrentState.Image = "box-mp7"; + CurrentState.IsMarioParty = true; + CurrentState.Scenes = MP7_GAMESTATES; + CurrentState.Title = "Mario Party 7"; + break; + case MPN_GAMEID_MP8: + CurrentState.Addresses = &MP8_ADDRESSES; + CurrentState.Boards = NULL; + CurrentState.Image = "box-mp8"; + CurrentState.IsMarioParty = true; + CurrentState.Scenes = MP8_GAMESTATES; + CurrentState.Title = "Mario Party 8"; + break; + case MPN_GAMEID_MP9: /* TODO */ + default: + CurrentState.Addresses = NULL; + CurrentState.Boards = NULL; + CurrentState.Image = "box-mp9"; + CurrentState.IsMarioParty = false; + CurrentState.Scenes = NULL; + } + + return CurrentState.Scenes != NULL; +} + +bool mpn_update_board() +{ + uint8_t i; + + if (CurrentState.Boards == NULL) + CurrentState.Board = NULL; + else if (CurrentState.CurrentSceneId != CurrentState.PreviousSceneId) + { + for (i = 0;; i++) + { + /* Unknown scene ID */ + if (CurrentState.Boards[i].SceneId == NONE) + break; + if (CurrentState.Boards[i].SceneId == CurrentState.CurrentSceneId) + { + CurrentState.Board = &CurrentState.Boards[i]; + return true; + } + } + } + + return false; +} + +uint8_t mpn_get_needs(uint16_t StateId, bool IsSceneId) +{ + uint16_t i; + + if (CurrentState.Scenes == NULL) + return MPN_NEEDS_NOTHING; + else if (CurrentState.CurrentSceneId != CurrentState.PreviousSceneId) + { + for (i = 0;; i++) + { + /* Unknown scene ID */ + if (CurrentState.Scenes[i].SceneId == NONE) + return MPN_NEEDS_NOTHING; + + /* Scene ID found in array */ + if ((IsSceneId && StateId == CurrentState.Scenes[i].SceneId) || + (StateId == CurrentState.Scenes[i].MiniGameId)) + return CurrentState.Scenes[i].Needs; + } + } + + return MPN_NEEDS_NOTHING; +} + +void mpn_push_osd_message(const std::string& Message) +{ +#ifdef MPN_USE_OSD + OSD::AddMessage(Message, OSD::Duration::SHORT, MPN_OSD_COLOR); +#endif +} + +bool mpn_update_state() +{ + if (CurrentState.Scenes == NULL && !mpn_init_state()) + return false; + if (!Memory::IsInitialized()) + return false; + + CurrentState.PreviousSceneId = CurrentState.CurrentSceneId; + CurrentState.CurrentSceneId = mpn_read_value(CurrentState.Addresses->SceneIdAddress, 2); + + for (uint16_t i = 0;; i++) + { + if (CurrentState.Scenes[i].SceneId == NONE) + break; + if (CurrentState.CurrentSceneId == CurrentState.Scenes[i].SceneId) + { + CurrentState.Scene = &CurrentState.Scenes[i]; + return true; + } + } + + return false; +} + +#define OSD_PUSH(a) mpn_push_osd_message("Adjusting #a for " + CurrentState.Scene->Name); +void mpn_per_frame() +{ + uint8_t Needs = 0; + + if (!mpn_update_state() || CurrentState.PreviousSceneId == CurrentState.CurrentSceneId) + return; + + mpn_update_board(); + mpn_update_discord(); + + Needs = mpn_get_needs(mpn_read_value(CurrentState.Addresses->SceneIdAddress, 2), true); + + if (Needs != MPN_NEEDS_NOTHING) + { + if (Needs & MPN_NEEDS_SAFE_TEX_CACHE) + { + OSD_PUSH(GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES) + Config::SetCurrent(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, 0); + } + else + Config::SetCurrent(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES, 128); + + if (Needs & MPN_NEEDS_NATIVE_RES) + { + OSD_PUSH(GFX_EFB_SCALE) + Config::SetCurrent(Config::GFX_EFB_SCALE, 1); + } + else + Config::SetCurrent(Config::GFX_EFB_SCALE, Config::GetBase(Config::GFX_EFB_SCALE)); + + if (Needs & MPN_NEEDS_EFB_TO_TEXTURE) + { + OSD_PUSH(GFX_HACK_SKIP_EFB_COPY_TO_RAM) + Config::SetCurrent(Config::GFX_HACK_SKIP_EFB_COPY_TO_RAM, false); + } + else + Config::SetCurrent(Config::GFX_HACK_SKIP_EFB_COPY_TO_RAM, true); + + UpdateActiveConfig(); + } +} + +uint32_t mpn_read_value(uint32_t Address, uint8_t Size) +{ + uint32_t Value = 0; + + for (int8_t i = 0; i < Size; i++) + Value += Memory::m_pRAM[Address + i] * pow(256, Size - i - 1); + + return Value; +} diff --git a/Source/Core/Core/MarioPartyNetplay/Gamestate.h b/Source/Core/Core/MarioPartyNetplay/Gamestate.h new file mode 100644 index 0000000000..7e79c04fb2 --- /dev/null +++ b/Source/Core/Core/MarioPartyNetplay/Gamestate.h @@ -0,0 +1,681 @@ +#ifndef MPN_GAMESTATE_H +#define MPN_GAMESTATE_H + +#include +#include +#include "Core/Config/GraphicsSettings.h" +#include "Core/Core.h" +#include "Core/HW/CPU.h" +#include "Core/HW/Memmap.h" +#include "Core/HW/Wiimote.h" +#include "Core/HW/WiimoteEmu/WiimoteEmu.h" +#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h" +#include "InputCommon/InputConfig.h" +#include "VideoCommon/VideoConfig.h" + +#define MPN_GAMEID_MP4 0x474D5045 +#define MPN_GAMEID_MP5 0x47503545 +#define MPN_GAMEID_MP6 0x47503645 +#define MPN_GAMEID_MP7 0x47503745 +#define MPN_GAMEID_MP8 0x524D3845 +#define MPN_GAMEID_MP9 0x53535145 + +#define MPN_NEEDS_SAFE_TEX_CACHE (1 << 0) +#define MPN_NEEDS_NATIVE_RES (1 << 1) +#define MPN_NEEDS_EFB_TO_TEXTURE (1 << 2) +#define MPN_NEEDS_SIDEWAYS_WIIMOTE (1 << 3) +#define MPN_NEEDS_NOTHING 0xFF +#define NONE -1 + +#undef MPN_USE_LEADERBOARDS +#define MPN_USE_OSD + +#include "Discord.h" + +#ifdef MPN_USE_LEADERBOARDS +#include "Core/MarioPartyNetplay/Leaderboards.h" +#endif + +#ifdef MPN_USE_OSD +#include "VideoCommon/OnScreenDisplay.h" +#define MPN_OSD_COLOR 0xFF4A4A94 +#endif + +typedef struct mpn_scene_t +{ + int16_t MiniGameId; + int16_t SceneId; + std::string Name; + uint8_t Needs; +} mpn_scene_t; + +typedef struct mpn_addresses_t +{ + /* + uint32_t BlueSpaces; + uint32_t RedSpaces; + uint32_t HappeningSpaces; + uint32_t ChanceSpaces; + uint32_t BowserSpaces; + uint32_t BattleSpaces; + uint32_t ItemSpaces; + uint32_t SpringSpaces; + */ + uint32_t CurrentTurn; + uint32_t TotalTurns; + uint32_t MinigameIdAddress; + uint32_t SceneIdAddress; +} mpn_addresses_t; + +typedef struct mpn_player_t +{ + uint8_t BlueSpaces; + uint16_t Coins; + uint16_t CoinStar; + uint16_t GameStar; + uint8_t Stars; +} mpn_player_t; + +typedef struct mpn_board_t +{ + int8_t BoardId; + int16_t SceneId; + std::string Name; + std::string Icon; +} mpn_board_t; + +typedef struct mpn_state_t +{ + bool IsMarioParty; + + int16_t CurrentSceneId; + int16_t PreviousSceneId; + + const char* Title; + const char* Image; + + const mpn_addresses_t* Addresses; + const mpn_board_t* Board; + const mpn_board_t* Boards; + const mpn_scene_t* Scene; + const mpn_scene_t* Scenes; +} mpn_state_t; + +extern mpn_state_t CurrentState; + +/* Function prototypes */ +uint8_t mpn_get_needs(uint16_t StateId, bool IsSceneId = false); +void mpn_per_frame(); +uint32_t mpn_read_value(uint32_t Address, uint8_t Size); +bool mpn_update_state(); + +/* ============================================================================ + Mario Party 4 metadata +============================================================================ */ +const mpn_addresses_t MP4_ADDRESSES = {0x0018FCFC, 0x0018FCFD, 0x0018FD2C, 0x001D3CE2}; + +const mpn_board_t MP4_BOARDS[] = {{1, 0x59, {"Toad's Midway Madness"}, {"mp4-toad"}}, + {2, 0x5A, {"Goomba's Greedy Gala"}, {"mp4-goomba"}}, + {3, 0x5B, {"Shy Guy's Jungle Jam"}, {"mp4-shyguy"}}, + {4, 0x5C, {"Boo's Haunted Bash"}, {"mp4-boo"}}, + {5, 0x5D, {"Koopa's Seaside Soiree"}, {"mp4-koopa"}}, + {6, 0x5E, {"Bowser's Gnarly Party"}, {"mp4-bowser"}}, + {7, 0x60, {"Mega Board Mayhem"}, {"mp4-mega"}}, + {8, 0x61, {"Mini Board Mad-Dash"}, {"mp4-mini"}}, + + {NONE, NONE, {""}, ""}}; + +const mpn_scene_t MP4_GAMESTATES[] = {{NONE, 0x01, {"Title Screen"}, 0}, + {0x00, 0x09, {"Manta Rings"}, 0}, + {0x01, 0x0A, {"Slime Time"}, 0}, + {0x02, 0x0B, {"Booksquirm"}, 0}, + {0x03, 0x0C, {"Trace Race"}, MPN_NEEDS_SAFE_TEX_CACHE}, + {0x04, 0x0D, {"Mario Medley"}, 0}, + {0x05, 0x0E, {"Avalanche!"}, 0}, + {0x06, 0x0F, {"Domination"}, 0}, + {0x07, 0x10, {"Paratrooper Plunge"}, 0}, + {0x08, 0x11, {"Toad's Quick Draw"}, 0}, + {0x09, 0x12, {"Three Throw"}, 0}, + {0x0A, 0x13, {"Photo Finish"}, 0}, + {0x0B, 0x14, {"Mr. Blizzard's Brigade"}, 0}, + {0x0C, 0x15, {"Bob-omb Breakers"}, 0}, + {0x0D, 0x16, {"Long Claw of the Law"}, 0}, + {0x0E, 0x17, {"Stamp Out!"}, 0}, + {0x0F, 0x18, {"Candlelight Fright"}, 0}, + {0x10, 0x19, {"Makin' Waves"}, 0}, + {0x11, 0x1A, {"Hide and Go BOOM!"}, 0}, + {0x12, 0x1B, {"Tree Stomp"}, 0}, + {0x13, 0x1C, {"Fish n' Drips"}, 0}, + {0x14, 0x1D, {"Hop or Pop"}, 0}, + {0x15, 0x1E, {"Money Belts"}, 0}, + {0x16, 0x1F, {"GOOOOOOOAL!!"}, 0}, + {0x17, 0x20, {"Blame it on the Crane"}, 0}, + {0x18, 0x21, {"The Great Deflate"}, 0}, + {0x19, 0x22, {"Revers-a-Bomb"}, 0}, + {0x1A, 0x23, {"Right Oar Left?"}, 0}, + {0x1B, 0x24, {"Cliffhangers"}, 0}, + {0x1C, 0x25, {"Team Treasure Trek"}, 0}, + {0x1D, 0x26, {"Pair-a-sailing"}, 0}, + {0x1E, 0x27, {"Order Up"}, 0}, + {0x1F, 0x28, {"Dungeon Duos"}, 0}, + {0x20, 0x29, {"Beach Volley Folley"}, 0}, + {0x21, 0x2A, {"Cheep Cheep Sweep"}, 0}, + {0x22, 0x2B, {"Darts of Doom"}, 0}, + {0x23, 0x2C, {"Fruits of Doom"}, 0}, + {0x24, 0x2D, {"Balloon of Doom"}, 0}, + {0x25, 0x2E, {"Chain Chomp Fever"}, 0}, + {0x26, 0x2F, {"Paths of Peril"}, MPN_NEEDS_EFB_TO_TEXTURE}, + {0x27, 0x30, {"Bowser's Bigger Blast"}, 0}, + {0x28, 0x31, {"Butterfly Blitz"}, 0}, + {0x29, 0x32, {"Barrel Baron"}, 0}, + {0x2A, 0x33, {"Mario Speedwagons"}, 0}, + /* 2B? */ + {0x2C, 0x35, {"Bowser Bop"}, 0}, + {0x2D, 0x36, {"Mystic Match 'Em"}, 0}, + {0x2E, 0x37, {"Archaeologuess"}, 0}, + {0x2F, 0x38, {"Goomba's Chip Flip"}, 0}, + {0x30, 0x39, {"Kareening Koopas"}, 0}, + {0x31, 0x3A, {"The Final Battle!"}, 0}, + {NONE, 0x3B, {"Jigsaw Jitters"}, 0}, + {NONE, 0x3C, {"Challenge Booksquirm"}, 0}, + {NONE, 0x3D, {"Rumble Fishing"}, 0}, + {NONE, 0x3E, {"Take a Breather"}, 0}, + {NONE, 0x3F, {"Bowser Wrestling"}, 0}, + {NONE, 0x41, {"Mushroom Medic"}, 0}, + {NONE, 0x42, {"Doors of Doom"}, 0}, + {NONE, 0x43, {"Bob-omb X-ing"}, 0}, + {NONE, 0x44, {"Goomba Stomp"}, 0}, + {NONE, 0x45, {"Panel Panic"}, 0}, + {NONE, 0x46, {"Party Mode Menu"}, 0}, + {NONE, 0x48, {"Mini-Game Mode Menu"}, 0}, + {NONE, 0x4A, {"Main Menu"}, 0}, + {NONE, 0x4B, {"Extra Room"}, 0}, + {NONE, 0x52, {"Option Room"}, 0}, + {NONE, 0x53, {"Present Room"}, 0}, + {NONE, 0x59, {"Toad's Midway Madness"}, 0}, + {NONE, 0x5A, {"Goomba's Greedy Gala"}, 0}, + {NONE, 0x5B, {"Shy Guy's Jungle Jam"}, 0}, + {NONE, 0x5C, {"Boo's Haunted Bash"}, 0}, + {NONE, 0x5D, {"Koopa's Seaside Soiree"}, 0}, + {NONE, 0x5E, {"Bowser's Gnarly Party"}, 0}, + {NONE, 0x5F, {"Board Map Rules"}, 0}, + {NONE, 0x60, {"Mega Board Mayhem"}, 0}, + {NONE, 0x61, {"Mini Board Mad-Dash"}, 0}, + {NONE, 0x62, {"Beach Volley Folley Menu"}, 0}, + + {NONE, NONE, {""}}}; + +/* ============================================================================ + Mario Party 5 metadata +============================================================================ */ + +const mpn_addresses_t MP5_ADDRESSES = { + 0x0022A494, // Current Turns + 0x0022A495, // Total Turns + 0x0022A4C4, // Mini ID + 0x00288862 // Scene ID +}; + +const mpn_board_t MP5_BOARDS[] = {{1, 0x76, {"Toy Dream"}, {"mp5-toy"}}, + {2, 0x78, {"Rainbow Dream"}, {"mp5-rainbow"}}, + {3, 0x7A, {"Pirate Dream"}, {"mp5-pirate"}}, + {4, 0x7C, {"Undersea Dream"}, {"mp5-undersea"}}, + {5, 0x7E, {"Future Dream"}, {"mp5-future"}}, + {6, 0x80, {"Bowser Nightmare"}, {"mp5-bowser"}}, + + {NONE, NONE, {""}, ""}}; + +const mpn_scene_t MP5_GAMESTATES[] = {{NONE, 0x01, {"Title Screen"}, 0}, + {NONE, 0x02, {"Card Party"}, 0}, + {NONE, 0x06, {"Save-File Screen"}, 0}, + //{NONE, 0x07, {"Mini-game Explanation"}, 0}, + {0x4D, 0x0B, {"Beach Volleyball"}, 0}, + {0x00, 0x0F, {"Coney Island"}, 0}, + {0x01, 0x10, {"Ground Pound Down"}, 0}, + {0x02, 0x11, {"Chimp Chase"}, 0}, + {0x03, 0x12, {"Chomp Romp"}, 0}, + {0x04, 0x13, {"Pushy Penguins"}, MPN_NEEDS_EFB_TO_TEXTURE}, + {0x05, 0x14, {"Leaf Leap"}, 0}, + {0x06, 0x15, {"Night Light Fright"}, 0}, + {0x07, 0x16, {"Pop-Star Piranhas"}, 0}, + {0x08, 0x17, {"Mazed & Confused"}, 0}, + {0x09, 0x18, {"Dinger Derby"}, 0}, + {0x0A, 0x19, {"Hydrostars"}, 0}, + {0x0B, 0x1A, {"Later Skater"}, 0}, + {0x0C, 0x1B, {"Will Flower"}, 0}, + {0x0D, 0x1C, {"Triple Jump"}, 0}, + {0x0E, 0x1D, {"Hotel Goomba"}, 0}, + {0x0F, 0x1E, {"Coin Cache"}, 0}, + {0x10, 0x1F, {"Flatiator"}, 0}, + {0x11, 0x20, {"Squared Away"}, 0}, + {0x12, 0x21, {"Mario Mechs"}, 0}, + {0x13, 0x22, {"Revolving Fire"}, 0}, + {0x14, 0x23, {"Clock Stoppers"}, 0}, + {0x15, 0x24, {"Heat Stroke"}, 0}, + {0x16, 0x25, {"Beam Team"}, 0}, + {0x17, 0x26, {"Vicious Vending"}, 0}, + {0x18, 0x27, {"Big Top Drop"}, 0}, + {0x19, 0x28, {"Defuse or Lose"}, 0}, + {0x1A, 0x29, {"ID UFO"}, 0}, + {0x1B, 0x2A, {"Mario Can-Can"}, 0}, + {0x1C, 0x2B, {"Handy Hoppers"}, 0}, + {0x1D, 0x2C, {"Berry Basket"}, 0}, + {0x1E, 0x2D, {"Bus Buffer"}, 0}, + {0x1F, 0x2E, {"Rumble Ready"}, 0}, + {0x20, 0x2F, {"Submarathon"}, 0}, + {0x21, 0x30, {"Manic Mallets"}, 0}, + {0x22, 0x31, {"Astro-Logical"}, 0}, + {0x23, 0x32, {"Bill Blasters"}, 0}, + {0x24, 0x33, {"Tug-o-Dorrie"}, 0}, + {0x25, 0x34, {"Twist 'n' Out"}, 0}, + {0x26, 0x35, {"Lucky Lineup"}, 0}, + {0x27, 0x36, {"Random Ride"}, 0}, + {0x28, 0x37, {"Shock Absorbers"}, 0}, + {0x29, 0x38, {"Countdown Pound"}, 0}, + {0x2A, 0x39, {"Whomp Maze"}, 0}, + {0x2B, 0x3A, {"Shy Guy Showdown"}, 0}, + {0x2C, 0x3B, {"Button Mashers"}, 0}, + {0x2D, 0x3C, {"Get a Rope"}, 0}, + {0x2E, 0x3D, {"Pump 'n' Jump"}, 0}, + {0x2F, 0x3E, {"Head Waiter"}, 0}, + {0x30, 0x3F, {"Blown Away"}, 0}, + {0x31, 0x40, {"Merry Poppings"}, 0}, + {0x32, 0x41, {"Pound Peril"}, 0}, + {0x33, 0x42, {"Piece Out"}, 0}, + {0x34, 0x43, {"Bound of Music"}, 0}, + {0x35, 0x44, {"Wind Wavers"}, 0}, + {0x36, 0x45, {"Sky Survivor"}, 0}, + {0x3A, 0x46, {"Rain of Fire"}, 0}, + {0x3B, 0x47, {"Cage-in Cookin'"}, 0}, + {0x3C, 0x48, {"Scaldin' Cauldron"}, 0}, + {0x3D, 0x49, {"Frightmare"}, 0}, + {0x3E, 0x4A, {"Flower Shower"}, 0}, + {0x3F, 0x4B, {"Dodge Bomb"}, 0}, + {0x40, 0x4C, {"Fish Upon a Star"}, 0}, + {0x41, 0x4D, {"Rumble Fumble"}, 0}, + {0x42, 0x4E, {"Quilt for Speed"}, 0}, + {0x43, 0x4F, {"Tube It or Lose It"}, 0}, + {0x44, 0x50, {"Mathletes"}, 0}, + {0x45, 0x51, {"Fight Cards"}, 0}, + {0x46, 0x52, {"Banana Punch"}, 0}, + {0x47, 0x53, {"Da Vine Climb"}, 0}, + {0x48, 0x54, {"Mass A-peel"}, 0}, + {0x49, 0x55, {"Panic Pinball"}, 0}, + {0x4A, 0x56, {"Banking Coins"}, 0}, + {0x4B, 0x57, {"Frozen Frenzy"}, 0}, + {0x4C, 0x58, {"Curvy Curbs"}, 0}, + {0x4E, 0x59, {"Fish Sticks"}, 0}, + {0x4F, 0x5A, {"Ice Hockey"}, 0}, + {NONE, 0x5C, {"Card Party Menu"}, 0}, + {NONE, 0x5E, {"Bonus Mode Menu"}, 0}, + {NONE, 0x60, {"Party Mode Menu"}, 0}, + {NONE, 0x61, {"Main Menu"}, 0}, + {NONE, 0x62, {"Party Mode Menu"}, 0}, + {NONE, 0x64, {"Free Play"}, 0}, + {NONE, 0x6F, {"Super Duel Mode Menu"}, 0}, + {NONE, 0x76, {"Toy Dream"}, 0}, + {NONE, 0x78, {"Rainbow Dream"}, 0}, + {NONE, 0x7A, {"Pirate Dream"}, 0}, + {NONE, 0x7C, {"Undersea Dream"}, 0}, + {NONE, 0x7E, {"Future Dream"}, 0}, + {NONE, 0x80, {"Bowser Nightmare"}, 0}, + + {NONE, NONE, {""}}}; + +/* ============================================================================ + Mario Party 6 metadata +============================================================================ */ + +const mpn_addresses_t MP6_ADDRESSES = { + 0x00265B74, // Current Turns + 0x00265B75, // Total Turns + 0x00265BA8, // Mini ID + 0x002C0256 // Scene ID +}; + +const mpn_board_t MP6_BOARDS[] = {{1, 0x7B, {"Towering Treetop"}, {"mp6-treetop"}}, + {2, 0x7C, {"E. Gadd's Garage"}, {"mp6-garage"}}, + {3, 0x7D, {"Faire Square"}, {"mp6-square"}}, + {4, 0x7E, {"Snowflake Lake"}, {"mp6-lake"}}, + {5, 0x7F, {"Castaway Bay"}, {"mp6-bay"}}, + {6, 0x80, {"Clockwork Castle"}, {"mp6-castle"}}, + {7, 0x72, {"Thirsty Gultch"}, {"mp6-gultch"}}, + {8, 0x73, {"Astro Avenue"}, {"mp6-avenue"}}, + {9, 0x74, {"Infernal Tower"}, {"mp6-tower"}}, + + {NONE, NONE, {""}, ""}}; + +const mpn_scene_t MP6_GAMESTATES[] = {{NONE, 0x01, {"Title Screen"}, 0}, + {NONE, 0x03, {"File-selection Screen"}, 0}, + //{NONE, 0x04, {"Mini-game Explanation"}, 0}, + {0x00, 0x06, {"Smashdance"}, 0}, + {0x01, 0x07, {"Odd Card Out"}, 0}, + {0x02, 0x08, {"Freeze Frame"}, 0}, + {0x03, 0x09, {"What Goes Up..."}, 0}, + {0x04, 0x0A, {"Granite Getaway"}, 0}, + {0x05, 0x0B, {"Circuit Maximus"}, 0}, + {0x06, 0x0C, {"Catch You Letter"}, 0}, + {0x07, 0x0D, {"Snow Whirled"}, 0}, + {0x08, 0x0E, {"Daft Rafts"}, 0}, + {0x09, 0x0F, {"Tricky Tires"}, 0}, + {0x0A, 0x10, {"Treasure Trawlers"}, 0}, + {0x0B, 0x11, {"Memory Lane"}, 0}, + {0x0C, 0x12, {"Mowtown"}, MPN_NEEDS_SAFE_TEX_CACHE}, + {0x0D, 0x13, {"Cannonball Fun"}, 0}, + {0x0E, 0x14, {"Note to Self"}, 0}, + {0x0F, 0x15, {"Same is Lame"}, 0}, + {0x10, 0x16, {"Light Up My Night"}, 0}, + {0x11, 0x17, {"Lift Leapers"}, 0}, + {0x12, 0x18, {"Blooper Scooper"}, 0}, + {0x13, 0x19, {"Trap Ease Artist"}, 0}, + {0x14, 0x1A, {"Pokey Punch-out"}, 0}, + {0x15, 0x1B, {"Money Belt"}, 0}, + {0x16, 0x1C, {"Cash Flow"}, 0}, + {0x17, 0x1D, {"Cog Jog"}, 0}, + {0x18, 0x1E, {"Sink or Swim"}, 0}, + {0x19, 0x1F, {"Snow Brawl"}, 0}, + {0x1A, 0x20, {"Ball Dozers"}, 0}, + {0x1B, 0x21, {"Surge and Destroy"}, 0}, + {0x1C, 0x22, {"Pop Star"}, 0}, + {0x1D, 0x23, {"Stage Fright"}, 0}, + {0x1E, 0x24, {"Conveyor Bolt"}, 0}, + {0x1F, 0x25, {"Crate and Peril"}, 0}, + {0x20, 0x26, {"Ray of Fright"}, 0}, + {0x21, 0x27, {"Dust 'til Dawn"}, 0}, + {0x22, 0x28, {"Garden Grab"}, 0}, + {0x23, 0x29, {"Pixel Perfect"}, 0}, + {0x24, 0x2A, {"Slot Trot"}, 0}, + {0x25, 0x2B, {"Gondola Glide"}, 0}, + {0x26, 0x2C, {"Light Breeze"}, 0}, + {0x27, 0x2D, {"Body Builder"}, 0}, + {0x28, 0x2E, {"Mole-it!"}, 0}, + {0x29, 0x2F, {"Cashapult"}, 0}, + {0x2A, 0x30, {"Jump the Gun"}, 0}, + {0x2B, 0x31, {"Rocky Road"}, 0}, + {0x2C, 0x32, {"Clean Team"}, 0}, + {0x2D, 0x33, {"Hyper Sniper"}, 0}, + {0x2E, 0x34, {"Insectiride"}, 0}, + {0x2F, 0x35, {"Sunday Drivers"}, 0}, + {0x30, 0x36, {"Stamp By Me"}, 0}, + {0x31, 0x37, {"Throw Me a Bone"}, 0}, + {0x32, 0x38, {"Black Hole Boogie"}, 0}, + {0x33, 0x39, {"Full Tilt"}, 0}, + {0x34, 0x3A, {"Sumo of Doom-o"}, 0}, + {0x35, 0x3B, {"O-Zone"}, 0}, + {0x36, 0x3C, {"Pitifall"}, 0}, + {0x37, 0x3D, {"Mass Meteor"}, 0}, + {0x38, 0x3E, {"Lunar-tics"}, 0}, + {0x39, 0x3F, {"T Minus Five"}, 0}, + {0x3A, 0x40, {"Asteroad Rage"}, 0}, + {0x3B, 0x41, {"Boo'd Off the Stage"}, 0}, + {0x3C, 0x42, {"Boonanza!"}, 0}, + {0x3D, 0x43, {"Trick or Tree"}, 0}, + {0x3E, 0x44, {"Something's Amist"}, 0}, + {0x3F, 0x45, {"Wrasslin' Rapids"}, 0}, + {0x43, 0x46, {"Burnstile"}, 0}, + {0x44, 0x47, {"Word Herd"}, 0}, + {0x45, 0x48, {"Fruit Talktail"}, 0}, + {0x46, 0x4C, {"Pit Boss"}, 0}, + {0x47, 0x4D, {"Dizzy Rotisserie"}, 0}, + {0x48, 0x4E, {"Dark 'n Crispy"}, 0}, + {0x49, 0x4F, {"Tally Me Banana"}, 0}, + {0x4A, 0x50, {"Banana Shake"}, 0}, + {0x4B, 0x51, {"Pier Factor"}, 0}, + {0x4C, 0x52, {"Seer Terror"}, 0}, + {0x4D, 0x53, {"Block Star"}, 0}, + {0x4E, 0x54, {"Lab Brats"}, 0}, + {0x4F, 0x55, {"Strawberry Shortfuse"}, 0}, + {0x50, 0x56, {"Control Shtick"}, 0}, + {0x51, 0x57, {"Dunk Bros."}, 0}, + {NONE, 0x58, {"Star Bank"}, 0}, + {NONE, 0x5A, {"Mini-game Mode"}, 0}, + {NONE, 0x5B, {"Party Mode Menu"}, 0}, + {NONE, 0x5C, {"Final Results"}, 0}, + {NONE, 0x5D, {"Main Menu"}, 0}, + {NONE, 0x5E, {"Solo Mode Menu"}, 0}, + {NONE, 0x60, {"Battle Bridge"}, 0}, + {NONE, 0x61, {"Treetop Bingo"}, 0}, + {NONE, 0x62, {"Mount Duel"}, 0}, + {NONE, 0x63, {"Mini-game Tour"}, MPN_NEEDS_EFB_TO_TEXTURE}, + {NONE, 0x63, {"Decathlon Park"}, 0}, + {NONE, 0x64, {"Endurance Alley"}, 0}, + {NONE, 0x6F, {"Option Mode"}, 0}, + {NONE, 0x71, {"Mini-game Results"}, 0}, + {NONE, 0x72, {"Thirsty Gultch"}, 0}, + {NONE, 0x73, {"Astro Avenue"}, 0}, + {NONE, 0x74, {"Infernal Tower"}, 0}, + {NONE, 0x7B, {"Towering Treetop"}, 0}, + {NONE, 0x7C, {"E. Gadd's Garage"}, 0}, + {NONE, 0x7D, {"Faire Square"}, 0}, + {NONE, 0x7E, {"Snowflake Lake"}, 0}, + {NONE, 0x7F, {"Castaway Bay"}, 0}, + {NONE, 0x80, {"Clockwork Castle"}, 0}, + + {NONE, NONE, {""}}}; + +/* ============================================================================ + Mario Party 7 metadata +============================================================================ */ + +const mpn_addresses_t MP7_ADDRESSES = {0x0029151C, 0x0029151D, 0x00291558, 0x002F2F3E}; + +const mpn_board_t MP7_BOARDS[] = {{1, 0x7A, {"Grand Canal"}, {"mp7-canal"}}, + {2, 0x7B, {"Pagoda Peak"}, {"mp7-peak"}}, + {3, 0x7C, {"Pyramid Park"}, {"mp7-park"}}, + {4, 0x7D, {"Neon Heights"}, {"mp7-heights"}}, + {5, 0x7E, {"Windmillville"}, {"mp7-windmillville"}}, + {6, 0x7F, {"Bowser's Enchanted Inferno!"}, {"mp7-inferno"}}, + + {NONE, NONE, "", ""}}; + +const mpn_scene_t MP7_GAMESTATES[] = {{NONE, 0x03, {"Boot Logos"}, 0}, + {NONE, 0x05, {"File Select"}, 0}, + //{NONE, 0x06, {"Mini-Game Explanation"}, 0}, + {0x00, 0x07, {"Catchy Tunes"}, 0}, + {0x01, 0x08, {"Bubble Brawl"}, 0}, + {0x02, 0x09, {"Track & Yield"}, 0}, + {0x03, 0x0A, {"Fun Run"}, 0}, + {0x04, 0x0B, {"Cointagious"}, 0}, + {0x05, 0x0C, {"Snow Ride"}, 0}, + {0x07, 0x0E, {"Picture This"}, 0}, + {0x08, 0x0F, {"Ghost in the Hall"}, 0}, + {0x09, 0x10, {"Big Dripper"}, 0}, + {0x0A, 0x11, {"Target Tag"}, 0}, + {0x0B, 0x12, {"Pokey Pummel"}, 0}, + {0x0C, 0x13, {"Take Me Ohm"}, 0}, + {0x0D, 0x14, {"Kart Wheeled"}, 0}, + {0x0E, 0x15, {"Balloon Busters"}, 0}, + {0x0F, 0x16, {"Clock Watchers"}, 0}, + {0x10, 0x17, {"Dart Attack"}, 0}, + {0x12, 0x18, {"Oil Crisis"}, 0}, + {0x14, 0x1A, {"La Bomba"}, 0}, + {0x15, 0x1B, {"Spray Anything"}, 0}, + {0x16, 0x1C, {"Balloonatic"}, 0}, + {0x17, 0x1D, {"Spinner Cell"}, 0}, + {0x18, 0x1E, {"Think Tank"}, 0}, + {0x19, 0x1F, {"Flashfright"}, 0}, + {0x1A, 0x20, {"Coin-op Bop"}, 0}, + {0x1B, 0x21, {"Easy Pickings"}, 0}, + {0x1C, 0x22, {"Wheel of Woe"}, 0}, + {0x1D, 0x23, {"Boxing Day"}, 0}, + {0x1E, 0x24, {"Be My Chum!"}, 0}, + {0x1F, 0x25, {"StratosFEAR!"}, 0}, + {0x20, 0x26, {"Pogo-a-go-go"}, 0}, + {0x21, 0x27, {"Buzzstormer"}, 0}, + {0x22, 0x28, {"Tile and Error"}, 0}, + {0x23, 0x29, {"Battery Ram"}, 0}, + {0x24, 0x2A, {"Cardinal Rule"}, 0}, + {0x25, 0x2B, {"Ice Moves"}, 0}, + {0x26, 0x2C, {"Bumper Crop"}, 0}, + {0x27, 0x2D, {"Hop-O-Matic 4000"}, 0}, + {0x28, 0x2E, {"Wingin' It"}, 0}, + {0x29, 0x2F, {"Sphere Factor"}, 0}, + {0x2A, 0x30, {"Herbicidal Maniac"}, 0}, + {0x2B, 0x31, {"Pyramid Scheme"}, 0}, + {0x2C, 0x32, {"World Piece"}, 0}, + {0x2D, 0x33, {"Warp Pipe Dreams"}, 0}, + {0x2E, 0x34, {"Weight for It"}, 0}, + {0x2F, 0x35, {"Helipopper"}, 0}, + {0x30, 0x36, {"Monty's Revenge"}, 0}, + {0x31, 0x37, {"Deck Hands"}, 0}, + {0x32, 0x38, {"Mad Props"}, 0}, + {0x33, 0x39, {"Gimme a Sign"}, 0}, + {0x34, 0x3A, {"Bridge Work"}, 0}, + {0x35, 0x3B, {"Spin Doctor"}, 0}, + {0x36, 0x3C, {"Hip Hop Drop"}, 0}, + {0x37, 0x3D, {"Air Farce"}, 0}, + {0x38, 0x3E, {"The Final Countdown"}, 0}, + {0x39, 0x3F, {"Royal Rumpus"}, 0}, + {0x3A, 0x40, {"Light Speed"}, 0}, + {0x3B, 0x41, {"Apes of Wrath"}, 0}, + {0x3C, 0x42, {"Fish & Cheeps"}, 0}, + {0x3D, 0x43, {"Camp Ukiki"}, 0}, + {0x3E, 0x44, {"Funstacle Course!"}, 0}, + {0x3F, 0x45, {"Funderwall!"}, 0}, + {0x40, 0x46, {"Magmagical Journey!"}, 0}, + {0x41, 0x47, {"Tunnel of Lava!"}, 0}, + {0x42, 0x48, {"Treasure Dome!"}, 0}, + {0x43, 0x49, {"Slot-O-Whirl!"}, 0}, + {0x44, 0x4A, {"Peel Out"}, 0}, + {0x45, 0x4B, {"Bananas Faster"}, 0}, + {0x46, 0x4C, {"Stump Change"}, 0}, + {0x47, 0x4D, {"Jump, Man"}, 0}, + {0x48, 0x4E, {"Vine Country"}, 0}, + {0x49, 0x4F, {"A Bridge Too Short"}, 0}, + {0x4A, 0x50, {"Spider Stomp"}, 0}, + {0x4B, 0x51, {"Stick and Spin"}, 0}, + {0x55, 0x5B, {"Bowser's Lovely Lift!"}, 0}, + {0x57, 0x5D, {"Mathemortician"}, 0}, + {NONE, 0x61, {"Duty-Free Shop"}, 0}, + {NONE, 0x63, {"Deluxe Cruise"}, 0}, + {NONE, 0x64, {"Minigame Cruise"}, 0}, + {NONE, 0x65, {"Control Room"}, 0}, + {NONE, 0x67, {"Main Menu"}, 0}, + {NONE, 0x68, {"Solo Cruise"}, 0}, + {NONE, 0x6A, {"Decathlon Castle"}, 0}, + {NONE, 0x6B, {"Free-Play Sub"}, 0}, + {NONE, 0x6C, {"Waterfall Battle"}, 0}, + {NONE, 0x6E, {"Volcano Peril"}, 0}, + {NONE, 0x6F, {"Pearl Hunt"}, 0}, + {NONE, 0x70, {"King of the River"}, 0}, + {NONE, 0x66, {"Party Cruise"}, 0}, + {NONE, 0x7A, {"Grand Canal"}, 0}, + {NONE, 0x7B, {"Pagoda Peak"}, 0}, + {NONE, 0x7C, {"Pyramid Park"}, 0}, + {NONE, 0x7D, {"Neon Heights"}, 0}, + {NONE, 0x7E, {"Windmillville"}, 0}, + {NONE, 0x7F, {"Bowser's Enchanted Inferno!"}, 0}, + {NONE, 0x73, {"Mini-Game Results"}, 0}, + + {NONE, NONE, {""}, 0}}; + +/* ============================================================================ + Mario Party 8 metadata +============================================================================ */ + +const mpn_addresses_t MP8_ADDRESSES = {0x00228764, 0x00228765, 0x002287CC, 0x002CD222}; + +const mpn_board_t MP8_BOARDS[] = {{1, 0x10, {"DK's Treetop Temple"}, {"mp8-dktt"}}, + {2, 0x11, {"Goomba's Booty Boardwalk"}, {"mp8-gbb"}}, + {3, 0x12, {"King Boo's Haunted Hideaway"}, {"mp8-kbhh"}}, + {4, 0x13, {"Shy Guy's Perplex Express"}, {"mp8-sgpe"}}, + {5, 0x14, {"Koopa's Tycoon Town"}, {"mp8-ktt"}}, + {6, 0x15, {"Bowser's Warped Orbit"}, {"mp8-bwo"}}, + + {NONE, NONE, {""}, ""}}; + +const mpn_scene_t MP8_GAMESTATES[] = { + {NONE, 0x04, {"Main Menu"}, 0}, + {NONE, 0x08, {"Fun Bazaar"}, 0}, + {NONE, 0x0A, {"Free Play Arcade"}, 0}, + {NONE, 0x0B, {"Crown Showdown"}, 0}, + {NONE, 0x0C, {"Flip-Out Frenzy"}, 0}, + {NONE, 0x0D, {"Tic-Tac Drop"}, 0}, + {NONE, 0x0E, {"Test for the Best"}, 0}, + {NONE, 0x10, {"DK's Treetop Temple"}, 0}, + {NONE, 0x11, {"Goomba's Booty Boardwalk"}, 0}, + {NONE, 0x12, {"King Boo's Haunted Hideaway"}, 0}, + {NONE, 0x13, {"Shy Guy's Perplex Express"}, 0}, + {NONE, 0x14, {"Koopa's Tycoon Town"}, 0}, + {NONE, 0x15, {"Bowser's Warped Orbit"}, 0}, + //{NONE, 0x16, {"Mini-Game Explanation"}, 0}, + {0x00, 0x17, {"Speedy Graffiti"}, MPN_NEEDS_EFB_TO_TEXTURE}, + {0x01, 0x18, {"Swing Kings"}, 0}, + {0x02, 0x19, {"Water Ski Spree"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x03, 0x1A, {"Punch-a-Bunch"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x04, 0x1B, {"Crank to Rank"}, 0}, + {0x05, 0x1C, {"At the Chomp Wash"}, 0}, + {0x06, 0x1D, {"Mosh-Pit Playroom"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x07, 0x1E, {"Mario Matrix"}, 0}, + {0x08, 0x1F, {"??? - Hammer de Pokari"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x09, 0x20, {"Grabby Giridion"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x0A, 0x21, {"Lava or Leave 'Em"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x0B, 0x22, {"Kartastrophe"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x0C, 0x23, {"??? - Ribbon Game"}, 0}, + {0x0D, 0x24, {"Aim of the Game"}, 0}, + {0x0E, 0x25, {"Rudder Madness"}, 0}, + {0x0F, 0x26, {"Gun the Runner"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, // 1P is sideways + {0x10, 0x27, {"Grabbin' Gold"}, 0}, + {0x11, 0x28, {"Power Trip"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x12, 0x29, {"Bob-ombs Away"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x13, 0x2A, {"Swervin' Skies"}, 0}, + {0x14, 0x2B, {"Picture Perfect"}, 0}, + {0x15, 0x2C, {"Snow Way Out"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, // 3P are sideways + {0x16, 0x2D, {"Thrash 'n' Crash"}, 0}, + {0x17, 0x2E, {"Chump Rope"}, 0}, + {0x18, 0x2F, {"Sick and Twisted"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x19, 0x30, {"Bumper Balloons"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x1A, 0x31, {"Rowed to Victory"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x1B, 0x32, {"Winner or Dinner"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x1C, 0x33, {"Paint Misbehavin'"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x1D, 0x34, {"Sugar Rush"}, 0}, + {0x1E, 0x35, {"King of the Thrill"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x1F, 0x36, {"Shake It Up"}, 0}, + {0x20, 0x37, {"Lean, Mean Ravine"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x21, 0x38, {"Boo-ting Gallery"}, 0}, + {0x22, 0x39, {"Crops 'n' Robbers"}, 0}, + {0x23, 0x3A, {"In the Nick of Time"}, 0}, + {0x24, 0x3B, {"Cut from the Team"}, 0}, + {0x25, 0x3C, {"Snipe for the Picking"}, 0}, + {0x26, 0x3D, {"Saucer Swarm"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x27, 0x3E, {"Glacial Meltdown"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x28, 0x3F, {"Attention Grabber"}, 0}, + {0x29, 0x40, {"Blazing Lassos"}, 0}, + {0x2A, 0x41, {"Wing and a Scare"}, 0}, + {0x2B, 0x42, {"Lob to Rob"}, 0}, + {0x2C, 0x43, {"Pumper Cars"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x2D, 0x44, {"Cosmic Slalom"}, 0}, + {0x2E, 0x45, {"Lava Lobbers"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x2F, 0x46, {"Loco Motives"}, 0}, + {0x30, 0x47, {"Specter Inspector"}, 0}, + {0x31, 0x48, {"Frozen Assets"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x32, 0x49, {"Breakneck Building"}, MPN_NEEDS_NATIVE_RES}, + {0x33, 0x4A, {"Surf's Way Up"}, 0}, + {0x34, 0x4B, {"??? - Bull Riding"}, 0}, + {0x35, 0x4C, {"Balancing Act"}, 0}, + {0x36, 0x4D, {"Ion the Prize"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x37, 0x4E, {"You're the Bob-omb"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x38, 0x4F, {"Scooter Pursuit"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x39, 0x50, {"Cardiators"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x3A, 0x51, {"Rotation Station"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x3B, 0x52, {"Eyebrawl"}, 0}, + {0x3C, 0x53, {"Table Menace"}, 0}, + {0x3D, 0x54, {"Flagging Rights"}, 0}, + {0x3E, 0x55, {"Trial by Tile"}, 0}, + {0x3F, 0x56, {"Star Carnival Bowling"}, 0}, + {0x40, 0x57, {"Puzzle Pillars"}, 0}, + {0x41, 0x58, {"Canyon Cruisers"}, 0}, + {0x42, 0x59, {"??? - CRASH"}, 0}, + {0x43, 0x5A, {"Settle It in Court"}, 0}, + {0x44, 0x5B, {"Moped Mayhem"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + {0x45, 0x5C, {"Flip the Chimp"}, 0}, + {0x46, 0x5D, {"Pour to Score"}, 0}, + {0x47, 0x5E, {"Fruit Picker"}, 0}, + {0x48, 0x5F, {"Stampede"}, 0}, + {0x49, 0x60, {"Superstar Showdown"}, 0}, + {0x4A, 0x61, {"Alpine Assault"}, 0}, + {0x4B, 0x62, {"Treacherous Tightrope"}, MPN_NEEDS_SIDEWAYS_WIIMOTE}, + + {NONE, NONE, {""}, 0}}; + +#endif diff --git a/Source/Core/Core/Movie.cpp b/Source/Core/Core/Movie.cpp index 25b8f54018..17d33d2238 100644 --- a/Source/Core/Core/Movie.cpp +++ b/Source/Core/Core/Movie.cpp @@ -36,6 +36,7 @@ #include "Core/Boot/Boot.h" #include "Core/Config/MainSettings.h" #include "Core/Config/SYSCONFSettings.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigLoaders/MovieConfigLoader.h" #include "Core/ConfigManager.h" #include "Core/Core.h" @@ -79,9 +80,16 @@ namespace Movie using namespace WiimoteCommon; using namespace WiimoteEmu; +enum class PlayMode +{ + None = 0, + Recording, + Playing, +}; + static bool s_bReadOnly = true; static u32 s_rerecords = 0; -static PlayMode s_playMode = MODE_NONE; +static PlayMode s_playMode = PlayMode::None; static std::array s_controllers{}; static std::array s_wiimotes{}; @@ -169,7 +177,7 @@ std::string GetInputDisplay() s_controllers[i] = ControllerType::GC; else s_controllers[i] = ControllerType::None; - s_wiimotes[i] = WiimoteCommon::GetSource(i) != WiimoteSource::None; + s_wiimotes[i] = Config::Get(Config::GetInfoForWiimoteSource(i)) != WiimoteSource::None; } } @@ -308,7 +316,7 @@ void SetReadOnly(bool bEnabled) bool IsRecordingInput() { - return (s_playMode == MODE_RECORDING); + return (s_playMode == PlayMode::Recording); } bool IsRecordingInputFromSaveState() @@ -328,12 +336,12 @@ bool IsJustStartingPlayingInputFromSaveState() bool IsPlayingInput() { - return (s_playMode == MODE_PLAYING); + return (s_playMode == PlayMode::Playing); } bool IsMovieActive() { - return s_playMode != MODE_NONE; + return s_playMode != PlayMode::None; } bool IsReadOnly() @@ -506,7 +514,7 @@ void ChangeWiiPads(bool instantly) for (int i = 0; i < MAX_WIIMOTES; ++i) { - wiimotes[i] = WiimoteCommon::GetSource(i) != WiimoteSource::None; + wiimotes[i] = Config::Get(Config::GetInfoForWiimoteSource(i)) != WiimoteSource::None; } // This is important for Wiimotes, because they can desync easily if they get re-activated @@ -518,7 +526,8 @@ void ChangeWiiPads(bool instantly) { const bool is_using_wiimote = IsUsingWiimote(i); - WiimoteCommon::SetSource(i, is_using_wiimote ? WiimoteSource::Emulated : WiimoteSource::None); + Config::SetCurrent(Config::GetInfoForWiimoteSource(i), + is_using_wiimote ? WiimoteSource::Emulated : WiimoteSource::None); if (bt != nullptr) bt->AccessWiimoteByIndex(i)->Activate(is_using_wiimote); } @@ -528,7 +537,7 @@ void ChangeWiiPads(bool instantly) bool BeginRecordingInput(const ControllerTypeArray& controllers, const WiimoteEnabledArray& wiimotes) { - if (s_playMode != MODE_NONE || + if (s_playMode != PlayMode::None || (controllers == ControllerTypeArray{} && wiimotes == WiimoteEnabledArray{})) return false; @@ -585,7 +594,7 @@ bool BeginRecordingInput(const ControllerTypeArray& controllers, Wiimote::ResetAllWiimotes(); } - s_playMode = MODE_RECORDING; + s_playMode = PlayMode::Recording; s_author = Config::Get(Config::MAIN_MOVIE_MOVIE_AUTHOR); s_temp_input.clear(); @@ -937,7 +946,7 @@ void ReadHeader() // NOTE: Host Thread bool PlayInput(const std::string& movie_path, std::optional* savestate_path) { - if (s_playMode != MODE_NONE) + if (s_playMode != PlayMode::None) return false; File::IOFile recording_file(movie_path, "rb"); @@ -959,7 +968,7 @@ bool PlayInput(const std::string& movie_path, std::optional* savest s_currentLagCount = 0; s_currentInputCount = 0; - s_playMode = MODE_PLAYING; + s_playMode = PlayMode::Playing; // Wiimotes cause desync issues if they're not reset before launching the game Wiimote::ResetAllWiimotes(); @@ -1139,18 +1148,18 @@ void LoadInput(const std::string& movie_path) { if (s_bReadOnly) { - if (s_playMode != MODE_PLAYING) + if (s_playMode != PlayMode::Playing) { - s_playMode = MODE_PLAYING; + s_playMode = PlayMode::Playing; Core::UpdateWantDeterminism(); Core::DisplayMessage("Switched to playback", 2000); } } else { - if (s_playMode != MODE_RECORDING) + if (s_playMode != PlayMode::Recording) { - s_playMode = MODE_RECORDING; + s_playMode = PlayMode::Recording; Core::UpdateWantDeterminism(); Core::DisplayMessage("Switched to recording", 2000); } @@ -1317,18 +1326,18 @@ void EndPlayInput(bool cont) // If !IsMovieActive(), changing s_playMode requires calling UpdateWantDeterminism ASSERT(IsMovieActive()); - s_playMode = MODE_RECORDING; + s_playMode = PlayMode::Recording; Core::DisplayMessage("Reached movie end. Resuming recording.", 2000); } - else if (s_playMode != MODE_NONE) + else if (s_playMode != PlayMode::None) { // We can be called by EmuThread during boot (CPU::State::PowerDown) bool was_running = Core::IsRunningAndStarted() && !CPU::IsStepping(); - if (was_running) + if (was_running && Config::Get(Config::MAIN_MOVIE_PAUSE_MOVIE)) CPU::Break(); s_rerecords = 0; s_currentByte = 0; - s_playMode = MODE_NONE; + s_playMode = PlayMode::None; Core::DisplayMessage("Movie End.", 2000); s_bRecordingFromSaveState = false; // we don't clear these things because otherwise we can't resume playback if we load a movie @@ -1337,11 +1346,7 @@ void EndPlayInput(bool cont) // delete tmpInput; // tmpInput = nullptr; - Core::QueueHostJob([=] { - Core::UpdateWantDeterminism(); - if (was_running && !Config::Get(Config::MAIN_MOVIE_PAUSE_MOVIE)) - CPU::EnableStepping(false); - }); + Core::QueueHostJob([=] { Core::UpdateWantDeterminism(); }); } } diff --git a/Source/Core/Core/Movie.h b/Source/Core/Core/Movie.h index a774f7ad4e..25747cd8a2 100644 --- a/Source/Core/Core/Movie.h +++ b/Source/Core/Core/Movie.h @@ -37,13 +37,6 @@ class EncryptionKey; namespace Movie { // Enumerations and structs -enum PlayMode -{ - MODE_NONE = 0, - MODE_RECORDING, - MODE_PLAYING -}; - enum class ControllerType { None = 0, diff --git a/Source/Core/Core/NetPlayClient.cpp b/Source/Core/Core/NetPlayClient.cpp index 54aeb83e83..e40c5f0a59 100644 --- a/Source/Core/Core/NetPlayClient.cpp +++ b/Source/Core/Core/NetPlayClient.cpp @@ -37,6 +37,7 @@ #include "Core/Config/MainSettings.h" #include "Core/Config/NetplaySettings.h" #include "Core/Config/SessionSettings.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigManager.h" #include "Core/GeckoCode.h" #include "Core/HW/EXI/EXI.h" @@ -1741,24 +1742,26 @@ bool NetPlayClient::StartGame(const std::string& path) for (unsigned int i = 0; i < 4; ++i) { - WiimoteCommon::SetSource(i, - m_wiimote_map[i] > 0 ? WiimoteSource::Emulated : WiimoteSource::None); + Config::SetCurrent(Config::GetInfoForWiimoteSource(i), + m_wiimote_map[i] > 0 ? WiimoteSource::Emulated : WiimoteSource::None); } // boot game auto boot_session_data = std::make_unique(); - boot_session_data->SetWiiSyncData( - std::move(m_wii_sync_fs), std::move(m_wii_sync_titles), std::move(m_wii_sync_redirect_folder), - [] { - // on emulation end clean up the Wii save sync directory -- see OnSyncSaveDataWii() - const std::string path = File::GetUserPath(D_USER_IDX) + "Wii" GC_MEMCARD_NETPLAY DIR_SEP; - if (File::Exists(path)) - File::DeleteDirRecursively(path); - const std::string redirect_path = - File::GetUserPath(D_USER_IDX) + "Redirect" GC_MEMCARD_NETPLAY DIR_SEP; - if (File::Exists(redirect_path)) - File::DeleteDirRecursively(redirect_path); - }); + boot_session_data->SetWiiSyncData(std::move(m_wii_sync_fs), std::move(m_wii_sync_titles), + std::move(m_wii_sync_redirect_folder), [] { + // on emulation end clean up the Wii save sync directory -- + // see OnSyncSaveDataWii() + const std::string wii_path = File::GetUserPath(D_USER_IDX) + + "Wii" GC_MEMCARD_NETPLAY DIR_SEP; + if (File::Exists(wii_path)) + File::DeleteDirRecursively(wii_path); + const std::string redirect_path = + File::GetUserPath(D_USER_IDX) + + "Redirect" GC_MEMCARD_NETPLAY DIR_SEP; + if (File::Exists(redirect_path)) + File::DeleteDirRecursively(redirect_path); + }); m_dialog->BootGame(path, std::move(boot_session_data)); UpdateDevices(); diff --git a/Source/Core/Core/NetPlayClient.h b/Source/Core/Core/NetPlayClient.h index 684d1a2616..2a43a0b16d 100644 --- a/Source/Core/Core/NetPlayClient.h +++ b/Source/Core/Core/NetPlayClient.h @@ -124,9 +124,12 @@ public: void SendChatMessage(const std::string& msg); void RequestStopGame(); void SendPowerButtonEvent(); + void SendActiveGeckoCodes(); + void GetActiveGeckoCodes(); void RequestGolfControl(PlayerId pid); void RequestGolfControl(); std::string GetCurrentGolfer(); + std::vector v_ActiveGeckoCodes; // Send and receive pads values bool WiimoteUpdate(int _number, u8* data, std::size_t size, u8 reporting_mode); diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index d2335149db..1ca1cef1ff 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -394,9 +394,6 @@ ConnectionError NetPlayServer::OnConnect(ENetPeer* socket, sf::Packet& rpac) std::string npver; rpac >> npver; - // Dolphin netplay version - if (npver != Common::GetScmRevGitStr()) - return ConnectionError::VersionMismatch; // game is currently running or game start is pending if (m_is_running || m_start_pending) @@ -1433,7 +1430,7 @@ bool NetPlayServer::RequestStartGame() } // Check To Send Codes to Clients - if (m_settings.m_SyncCodes && m_players.size() > 1) + if (m_players.size() > 1) { start_now = false; m_start_pending = true; diff --git a/Source/Core/Core/PatchEngine.cpp b/Source/Core/Core/PatchEngine.cpp index f5fe19b7ef..b48ba19e45 100644 --- a/Source/Core/Core/PatchEngine.cpp +++ b/Source/Core/Core/PatchEngine.cpp @@ -27,6 +27,7 @@ #include "Core/ConfigManager.h" #include "Core/GeckoCode.h" #include "Core/GeckoCodeConfig.h" +#include "Core/MarioPartyNetplay/Gamestate.h" #include "Core/PowerPC/MMU.h" #include "Core/PowerPC/PowerPC.h" @@ -298,6 +299,8 @@ bool ApplyFramePatches() ApplyPatches(s_on_frame); + mpn_per_frame(); + // Run the Gecko code handler Gecko::RunCodeHandler(); ActionReplay::RunAllActive(); diff --git a/Source/Core/Core/PowerPC/GDBStub.cpp b/Source/Core/Core/PowerPC/GDBStub.cpp index 91bc4a465d..2fe39b75fd 100644 --- a/Source/Core/Core/PowerPC/GDBStub.cpp +++ b/Source/Core/Core/PowerPC/GDBStub.cpp @@ -40,7 +40,7 @@ typedef SSIZE_T ssize_t; namespace GDBStub { -std::optional s_socket_context; +static std::optional s_socket_context; #define GDB_BFR_MAX 10000 @@ -633,7 +633,7 @@ static void WriteRegister() } else if (id >= 88 && id < 104) { - PowerPC::ppcState.sr[SPR_IBAT0U + id - 88] = re32hex(bufptr); + PowerPC::ppcState.spr[SPR_IBAT0U + id - 88] = re32hex(bufptr); } else { diff --git a/Source/Core/Core/PowerPC/Jit64Common/Jit64AsmCommon.cpp b/Source/Core/Core/PowerPC/Jit64Common/Jit64AsmCommon.cpp index b6fc24e89b..124218fb7f 100644 --- a/Source/Core/Core/PowerPC/Jit64Common/Jit64AsmCommon.cpp +++ b/Source/Core/Core/PowerPC/Jit64Common/Jit64AsmCommon.cpp @@ -369,7 +369,7 @@ const u8* CommonAsmRoutines::GenQuantizedStoreRuntime(bool single, EQuantizeType const u8* load = AlignCode4(); GenQuantizedStore(single, type, -1); RET(); - JitRegister::Register(start, GetCodePtr(), "JIT_QuantizedStore_%i_%i", type, single); + JitRegister::Register(start, GetCodePtr(), "JIT_QuantizedStore_{}_{}", type, single); return load; } @@ -400,7 +400,7 @@ const u8* CommonAsmRoutines::GenQuantizedLoadRuntime(bool single, EQuantizeType const u8* load = AlignCode4(); GenQuantizedLoad(single, type, -1); RET(); - JitRegister::Register(start, GetCodePtr(), "JIT_QuantizedLoad_%i_%i", type, single); + JitRegister::Register(start, GetCodePtr(), "JIT_QuantizedLoad_{}_{}", type, single); return load; } diff --git a/Source/Core/Core/PowerPC/Jit64Common/TrampolineCache.cpp b/Source/Core/Core/PowerPC/Jit64Common/TrampolineCache.cpp index d30b1eacb9..faf0b7ec9e 100644 --- a/Source/Core/Core/PowerPC/Jit64Common/TrampolineCache.cpp +++ b/Source/Core/Core/PowerPC/Jit64Common/TrampolineCache.cpp @@ -48,7 +48,7 @@ const u8* TrampolineCache::GenerateReadTrampoline(const TrampolineInfo& info) JMP(info.start + info.len, true); - JitRegister::Register(trampoline, GetCodePtr(), "JIT_ReadTrampoline_%x", info.pc); + JitRegister::Register(trampoline, GetCodePtr(), "JIT_ReadTrampoline_{:x}", info.pc); return trampoline; } @@ -67,6 +67,6 @@ const u8* TrampolineCache::GenerateWriteTrampoline(const TrampolineInfo& info) JMP(info.start + info.len, true); - JitRegister::Register(trampoline, GetCodePtr(), "JIT_WriteTrampoline_%x", info.pc); + JitRegister::Register(trampoline, GetCodePtr(), "JIT_WriteTrampoline_{:x}", info.pc); return trampoline; } diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp index de55900846..ca090547f9 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp @@ -131,12 +131,12 @@ void JitBaseBlockCache::FinalizeBlock(JitBlock& block, bool block_link, if (JitRegister::IsEnabled() && (symbol = g_symbolDB.GetSymbolFromAddr(block.effectiveAddress)) != nullptr) { - JitRegister::Register(block.checkedEntry, block.codeSize, "JIT_PPC_%s_%08x", + JitRegister::Register(block.checkedEntry, block.codeSize, "JIT_PPC_{}_{:08x}", symbol->function_name.c_str(), block.physicalAddress); } else { - JitRegister::Register(block.checkedEntry, block.codeSize, "JIT_PPC_%08x", + JitRegister::Register(block.checkedEntry, block.codeSize, "JIT_PPC_{:08x}", block.physicalAddress); } } diff --git a/Source/Core/DiscIO/VolumeVerifier.cpp b/Source/Core/DiscIO/VolumeVerifier.cpp index 252cf427b6..593fb49b33 100644 --- a/Source/Core/DiscIO/VolumeVerifier.cpp +++ b/Source/Core/DiscIO/VolumeVerifier.cpp @@ -1113,10 +1113,11 @@ void VolumeVerifier::Process() bytes_to_read = Common::AlignUp(content.size, 0x40); content_read = true; - if (m_content_index + 1 < m_content_offsets.size() && - m_content_offsets[m_content_index + 1] < m_progress + bytes_to_read) + const u16 next_content_index = m_content_index + 1; + if (next_content_index < m_content_offsets.size() && + m_content_offsets[next_content_index] < m_progress + bytes_to_read) { - excess_bytes = m_progress + bytes_to_read - m_content_offsets[m_content_index + 1]; + excess_bytes = m_progress + bytes_to_read - m_content_offsets[next_content_index]; } } else if (m_content_index < m_content_offsets.size() && diff --git a/Source/Core/DolphinLib.props b/Source/Core/DolphinLib.props index c0d465aafe..79557b58c7 100644 --- a/Source/Core/DolphinLib.props +++ b/Source/Core/DolphinLib.props @@ -176,6 +176,7 @@ + @@ -763,6 +764,7 @@ + diff --git a/Source/Core/DolphinLib.vcxproj b/Source/Core/DolphinLib.vcxproj index 5485304bdd..9ee69b2aee 100644 --- a/Source/Core/DolphinLib.vcxproj +++ b/Source/Core/DolphinLib.vcxproj @@ -27,6 +27,14 @@ {41279555-f94f-4ebc-99de-af863c10c5c4} + + + + + + + + \ No newline at end of file diff --git a/Source/Core/DolphinQt/CheatSearchFactoryWidget.cpp b/Source/Core/DolphinQt/CheatSearchFactoryWidget.cpp index 6e566600f8..96dccfd240 100644 --- a/Source/Core/DolphinQt/CheatSearchFactoryWidget.cpp +++ b/Source/Core/DolphinQt/CheatSearchFactoryWidget.cpp @@ -55,7 +55,7 @@ void CheatSearchFactoryWidget::CreateWidgets() auto* custom_address_space_layout = new QVBoxLayout(); custom_address_space_layout->setMargin(6); - auto* custom_address_space_button_group = new QButtonGroup(); + auto* custom_address_space_button_group = new QButtonGroup(this); m_custom_virtual_address_space = new QRadioButton(tr("Use virtual addresses when possible")); m_custom_virtual_address_space->setChecked(true); m_custom_physical_address_space = new QRadioButton(tr("Use physical addresses")); diff --git a/Source/Core/DolphinQt/Config/ARCodeWidget.cpp b/Source/Core/DolphinQt/Config/ARCodeWidget.cpp index b45cfb3772..b528bfb509 100644 --- a/Source/Core/DolphinQt/Config/ARCodeWidget.cpp +++ b/Source/Core/DolphinQt/Config/ARCodeWidget.cpp @@ -5,7 +5,6 @@ #include -#include #include #include #include diff --git a/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientAddServerDialog.cpp b/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientAddServerDialog.cpp index 790b6ca6ce..84185da00d 100644 --- a/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientAddServerDialog.cpp +++ b/Source/Core/DolphinQt/Config/ControllerInterface/DualShockUDPClientAddServerDialog.cpp @@ -5,7 +5,6 @@ #include -#include #include #include #include diff --git a/Source/Core/DolphinQt/Config/Graphics/PostProcessingConfigWindow.cpp b/Source/Core/DolphinQt/Config/Graphics/PostProcessingConfigWindow.cpp index 434aaa6d2f..59907bd39b 100644 --- a/Source/Core/DolphinQt/Config/Graphics/PostProcessingConfigWindow.cpp +++ b/Source/Core/DolphinQt/Config/Graphics/PostProcessingConfigWindow.cpp @@ -227,11 +227,11 @@ u32 PostProcessingConfigWindow::ConfigGroup::AddWidgets(PostProcessingConfigWind switch (m_config_option->m_type) { - case OptionType::OPTION_BOOL: + case OptionType::Bool: return AddBool(parent, grid, row); - case OptionType::OPTION_FLOAT: + case OptionType::Float: return AddFloat(parent, grid, row); - case OptionType::OPTION_INTEGER: + case OptionType::Integer: return AddInteger(parent, grid, row); default: // obviously shouldn't get here @@ -336,7 +336,7 @@ void PostProcessingConfigWindow::ConfigGroup::EnableSuboptions(const bool state) { for (auto& it : m_subgroups) { - if (it->m_config_option->m_type == OptionType::OPTION_BOOL) + if (it->m_config_option->m_type == OptionType::Bool) { it->m_checkbox->setEnabled(state); } diff --git a/Source/Core/DolphinQt/Config/PropertiesDialog.cpp b/Source/Core/DolphinQt/Config/PropertiesDialog.cpp index a7589a4fc1..abfbf7e9b1 100644 --- a/Source/Core/DolphinQt/Config/PropertiesDialog.cpp +++ b/Source/Core/DolphinQt/Config/PropertiesDialog.cpp @@ -86,4 +86,5 @@ PropertiesDialog::PropertiesDialog(QWidget* parent, const UICommon::GameFile& ga layout->addWidget(close_box); setLayout(layout); + tab_widget->setCurrentIndex(3); } diff --git a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp index e5616da4bf..613455ead6 100644 --- a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp +++ b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp @@ -17,7 +17,10 @@ #include #include +#include "Common/Config/Config.h" + #include "Core/Config/MainSettings.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/HW/Wiimote.h" @@ -301,9 +304,9 @@ void WiimoteControllersWidget::LoadSettings() { for (size_t i = 0; i < m_wiimote_groups.size(); i++) { - m_wiimote_boxes[i]->setCurrentIndex(int(WiimoteCommon::GetSource(u32(i)))); + m_wiimote_boxes[i]->setCurrentIndex(int(Config::Get(Config::GetInfoForWiimoteSource(int(i))))); } - m_wiimote_real_balance_board->setChecked(WiimoteCommon::GetSource(WIIMOTE_BALANCE_BOARD) == + m_wiimote_real_balance_board->setChecked(Config::Get(Config::WIIMOTE_BB_SOURCE) == WiimoteSource::Real); m_wiimote_speaker_data->setChecked(Config::Get(Config::MAIN_WIIMOTE_ENABLE_SPEAKER)); m_wiimote_ciface->setChecked(Config::Get(Config::MAIN_CONNECT_WIIMOTES_FOR_CONTROLLER_INTERFACE)); @@ -328,17 +331,15 @@ void WiimoteControllersWidget::SaveSettings() Config::SetBaseOrCurrent(Config::MAIN_BLUETOOTH_PASSTHROUGH_ENABLED, m_wiimote_passthrough->isChecked()); - WiimoteCommon::SetSource(WIIMOTE_BALANCE_BOARD, m_wiimote_real_balance_board->isChecked() ? - WiimoteSource::Real : - WiimoteSource::None); + const WiimoteSource bb_source = + m_wiimote_real_balance_board->isChecked() ? WiimoteSource::Real : WiimoteSource::None; + Config::SetBaseOrCurrent(Config::WIIMOTE_BB_SOURCE, bb_source); for (size_t i = 0; i < m_wiimote_groups.size(); i++) { const int index = m_wiimote_boxes[i]->currentIndex(); - WiimoteCommon::SetSource(u32(i), WiimoteSource(index)); + Config::SetBaseOrCurrent(Config::GetInfoForWiimoteSource(int(i)), WiimoteSource(index)); } - UICommon::SaveWiimoteSources(); - SConfig::GetInstance().SaveSettings(); } diff --git a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp index 77bb8c8bd3..fb300a370f 100644 --- a/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/CodeViewWidget.cpp @@ -376,7 +376,7 @@ void CodeViewWidget::Update() void CodeViewWidget::CalculateBranchIndentation() { - const size_t rows = rowCount(); + const u32 rows = rowCount(); const size_t columns = m_branches.size(); if (rows < 1 || columns < 1) return; @@ -442,7 +442,7 @@ void CodeViewWidget::CalculateBranchIndentation() }; const u32 first_visible_addr = AddressForRow(0); - const u32 last_visible_addr = AddressForRow(static_cast(rows - 1)); + const u32 last_visible_addr = AddressForRow(rows - 1); if (first_visible_addr <= last_visible_addr) { @@ -456,7 +456,7 @@ void CodeViewWidget::CalculateBranchIndentation() // first_visible_addr to fffffffc, and the second for 00000000 to last_visible_addr. // That means we need to find the row corresponding to 00000000. int addr_zero_row = -1; - for (int row = 0; row < rows; row++) + for (u32 row = 0; row < rows; row++) { if (AddressForRow(row) == 0) { diff --git a/Source/Core/DolphinQt/Debugger/MemoryWidget.cpp b/Source/Core/DolphinQt/Debugger/MemoryWidget.cpp index fe1307ec41..04320c8e0d 100644 --- a/Source/Core/DolphinQt/Debugger/MemoryWidget.cpp +++ b/Source/Core/DolphinQt/Debugger/MemoryWidget.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -103,6 +104,12 @@ void MemoryWidget::CreateWidgets() m_address_splitter->setCollapsible(0, false); m_address_splitter->setStretchFactor(1, 2); + auto* search_type_group = new QButtonGroup(this); + m_find_ascii = new QRadioButton(tr("ASCII")); + m_find_hex = new QRadioButton(tr("Hex string")); + search_type_group->addButton(m_find_ascii); + search_type_group->addButton(m_find_hex); + // Dump m_dump_mram = new QPushButton(tr("Dump &MRAM")); m_dump_exram = new QPushButton(tr("Dump &ExRAM")); @@ -116,8 +123,6 @@ void MemoryWidget::CreateWidgets() m_find_next = new QPushButton(tr("Find &Next")); m_find_previous = new QPushButton(tr("Find &Previous")); - m_find_ascii = new QRadioButton(tr("ASCII")); - m_find_hex = new QRadioButton(tr("Hex string")); m_result_label = new QLabel; search_layout->addWidget(m_find_next); diff --git a/Source/Core/DolphinQt/Debugger/NewBreakpointDialog.cpp b/Source/Core/DolphinQt/Debugger/NewBreakpointDialog.cpp index 6a1a3eff7b..3e8bfae69a 100644 --- a/Source/Core/DolphinQt/Debugger/NewBreakpointDialog.cpp +++ b/Source/Core/DolphinQt/Debugger/NewBreakpointDialog.cpp @@ -3,6 +3,7 @@ #include "DolphinQt/Debugger/NewBreakpointDialog.h" +#include #include #include #include @@ -31,10 +32,12 @@ NewBreakpointDialog::NewBreakpointDialog(BreakpointWidget* parent) void NewBreakpointDialog::CreateWidgets() { m_buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + auto* type_group = new QButtonGroup(this); // Instruction BP m_instruction_bp = new QRadioButton(tr("Instruction Breakpoint")); m_instruction_bp->setChecked(true); + type_group->addButton(m_instruction_bp); m_instruction_box = new QGroupBox; m_instruction_address = new QLineEdit; @@ -45,11 +48,15 @@ void NewBreakpointDialog::CreateWidgets() // Memory BP m_memory_bp = new QRadioButton(tr("Memory Breakpoint")); + type_group->addButton(m_memory_bp); m_memory_box = new QGroupBox; + auto* memory_type_group = new QButtonGroup(this); m_memory_use_address = new QRadioButton(tr("Address")); m_memory_use_address->setChecked(true); + memory_type_group->addButton(m_memory_use_address); // i18n: A range of memory addresses m_memory_use_range = new QRadioButton(tr("Range")); + memory_type_group->addButton(m_memory_use_range); m_memory_address_from = new QLineEdit; m_memory_address_to = new QLineEdit; m_memory_address_from_label = new QLabel; // Set by OnAddressTypeChanged diff --git a/Source/Core/DolphinQt/DolphinQt.vcxproj b/Source/Core/DolphinQt/DolphinQt.vcxproj index b5db932b07..0659189f9e 100644 --- a/Source/Core/DolphinQt/DolphinQt.vcxproj +++ b/Source/Core/DolphinQt/DolphinQt.vcxproj @@ -383,9 +383,6 @@ {D79392F7-06D6-4B4B-A39F-4D587C215D3A} - - {41279555-f94f-4ebc-99de-af863c10c5c4} - {0e033be3-2e08-428e-9ae9-bc673efa12b5} @@ -396,13 +393,15 @@ + - + + diff --git a/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp b/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp index be9daf57d3..4227e2af38 100644 --- a/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp +++ b/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp @@ -704,6 +704,8 @@ public: case VertexComponentFormat::Direct: process_simple_component(component_sizes[vtx_attr.GetColorFormat(c)]); break; + case VertexComponentFormat::NotPresent: + break; } } for (u32 t = 0; t < vtx_desc.high.TexCoord.Size(); t++) diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp index 7fc42cc44a..321f9501d4 100644 --- a/Source/Core/DolphinQt/MainWindow.cpp +++ b/Source/Core/DolphinQt/MainWindow.cpp @@ -39,6 +39,7 @@ #include "Core/CommonTitles.h" #include "Core/Config/MainSettings.h" #include "Core/Config/NetplaySettings.h" +#include "Core/Config/WiimoteSettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" #include "Core/FreeLookManager.h" @@ -530,8 +531,6 @@ void MainWindow::ConnectMenuBar() connect(m_menu_bar, &MenuBar::ImportNANDBackup, this, &MainWindow::OnImportNANDBackup); connect(m_menu_bar, &MenuBar::PerformOnlineUpdate, this, &MainWindow::PerformOnlineUpdate); connect(m_menu_bar, &MenuBar::BootWiiSystemMenu, this, &MainWindow::BootWiiSystemMenu); - connect(m_menu_bar, &MenuBar::StartNetPlay, this, &MainWindow::ShowNetPlaySetupDialog); - connect(m_menu_bar, &MenuBar::BrowseNetPlay, this, &MainWindow::ShowNetPlayBrowser); connect(m_menu_bar, &MenuBar::ShowFIFOPlayer, this, &MainWindow::ShowFIFOPlayer); connect(m_menu_bar, &MenuBar::ConnectWiiRemote, this, &MainWindow::OnConnectWiiRemote); @@ -647,6 +646,8 @@ void MainWindow::ConnectToolBar() connect(m_tool_bar, &ToolBar::ControllersPressed, this, &MainWindow::ShowControllersWindow); connect(m_tool_bar, &ToolBar::GraphicsPressed, this, &MainWindow::ShowGraphicsWindow); + connect(m_tool_bar, &ToolBar::StartNetPlayPressed, this, &MainWindow::ShowNetPlaySetupDialog); + connect(m_tool_bar, &ToolBar::StepPressed, m_code_widget, &CodeWidget::Step); connect(m_tool_bar, &ToolBar::StepOverPressed, m_code_widget, &CodeWidget::StepOver); connect(m_tool_bar, &ToolBar::StepOutPressed, m_code_widget, &CodeWidget::StepOut); @@ -1391,10 +1392,11 @@ void MainWindow::NetPlayInit() m_netplay_discord = new DiscordHandler(this); #endif - connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::ForceStop); + connect(m_netplay_dialog, &NetPlayDialog::Stop, this, &MainWindow::RequestStop); connect(m_netplay_dialog, &NetPlayDialog::rejected, this, &MainWindow::NetPlayQuit); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Join, this, &MainWindow::NetPlayJoin); connect(m_netplay_setup_dialog, &NetPlaySetupDialog::Host, this, &MainWindow::NetPlayHost); + connect(m_netplay_setup_dialog, &NetPlaySetupDialog::JoinBrowser, this, &MainWindow::NetPlayJoin); #ifdef USE_DISCORD_PRESENCE connect(m_netplay_discord, &DiscordHandler::Join, this, &MainWindow::NetPlayJoin); @@ -1735,7 +1737,7 @@ void MainWindow::OnStartRecording() controllers[i] = Movie::ControllerType::GC; else controllers[i] = Movie::ControllerType::None; - wiimotes[i] = WiimoteCommon::GetSource(i) != WiimoteSource::None; + wiimotes[i] = Config::Get(Config::GetInfoForWiimoteSource(i)) != WiimoteSource::None; } if (Movie::BeginRecordingInput(controllers, wiimotes)) @@ -1795,7 +1797,7 @@ void MainWindow::ShowTASInput() for (int i = 0; i < num_wii_controllers; i++) { - if (WiimoteCommon::GetSource(i) == WiimoteSource::Emulated && + if (Config::Get(Config::GetInfoForWiimoteSource(i)) == WiimoteSource::Emulated && (!Core::IsRunning() || SConfig::GetInstance().bWii)) { m_wii_tas_input_windows[i]->show(); diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp index 0c08dd3390..f5f6e14725 100644 --- a/Source/Core/DolphinQt/MenuBar.cpp +++ b/Source/Core/DolphinQt/MenuBar.cpp @@ -233,11 +233,6 @@ void MenuBar::AddToolsMenu() tools_menu->addSeparator(); - tools_menu->addAction(tr("Start &NetPlay..."), this, &MenuBar::StartNetPlay); - tools_menu->addAction(tr("Browse &NetPlay Sessions...."), this, &MenuBar::BrowseNetPlay); - - tools_menu->addSeparator(); - QMenu* gc_ipl = tools_menu->addMenu(tr("Load GameCube Main Menu")); m_ntscj_ipl = gc_ipl->addAction(tr("NTSC-J"), this, @@ -305,7 +300,7 @@ void MenuBar::AddToolsMenu() void MenuBar::AddEmulationMenu() { QMenu* emu_menu = addMenu(tr("&Emulation")); - m_play_action = emu_menu->addAction(tr("&Play"), this, &MenuBar::Play); + m_play_action = emu_menu->addAction(tr("&Local Play"), this, &MenuBar::Play); m_pause_action = emu_menu->addAction(tr("&Pause"), this, &MenuBar::Pause); m_stop_action = emu_menu->addAction(tr("&Stop"), this, &MenuBar::Stop); m_reset_action = emu_menu->addAction(tr("&Reset"), this, &MenuBar::Reset); diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp index 348f6de047..3eb4b50f63 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayBrowser.cpp @@ -62,61 +62,7 @@ void NetPlayBrowser::CreateWidgets() { auto* layout = new QVBoxLayout; - m_table_widget = new QTableWidget; - m_table_widget->setTabKeyNavigation(false); - - m_table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); - m_table_widget->setSelectionMode(QAbstractItemView::SingleSelection); - m_table_widget->setWordWrap(false); - - m_region_combo = new QComboBox; - - m_region_combo->addItem(tr("Any Region")); - - for (const auto& region : NetPlayIndex::GetRegions()) - { - m_region_combo->addItem( - tr("%1 (%2)").arg(tr(region.second.c_str())).arg(QString::fromStdString(region.first)), - QString::fromStdString(region.first)); - } - - m_region_combo->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - - m_status_label = new QLabel; - m_button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - m_button_refresh = new QPushButton(tr("Refresh")); - m_edit_name = new QLineEdit; - m_edit_game_id = new QLineEdit; - m_check_hide_incompatible = new QCheckBox(tr("Hide Incompatible Sessions")); - m_check_hide_ingame = new QCheckBox(tr("Hide In-Game Sessions")); - - m_check_hide_incompatible->setChecked(true); - - m_radio_all = new QRadioButton(tr("Private and Public")); - m_radio_private = new QRadioButton(tr("Private")); - m_radio_public = new QRadioButton(tr("Public")); - - m_radio_all->setChecked(true); - - auto* filter_box = new QGroupBox(tr("Filters")); - auto* filter_layout = new QGridLayout; - filter_box->setLayout(filter_layout); - - filter_layout->addWidget(new QLabel(tr("Region:")), 0, 0); - filter_layout->addWidget(m_region_combo, 0, 1, 1, -1); - filter_layout->addWidget(new QLabel(tr("Name:")), 1, 0); - filter_layout->addWidget(m_edit_name, 1, 1, 1, -1); - filter_layout->addWidget(new QLabel(tr("Game ID:")), 2, 0); - filter_layout->addWidget(m_edit_game_id, 2, 1, 1, -1); - filter_layout->addWidget(m_radio_all, 3, 1); - filter_layout->addWidget(m_radio_public, 3, 2); - filter_layout->addWidget(m_radio_private, 3, 3); - filter_layout->addItem(new QSpacerItem(4, 1, QSizePolicy::Expanding), 3, 4); - filter_layout->addWidget(m_check_hide_incompatible, 4, 1, 1, -1); - filter_layout->addWidget(m_check_hide_ingame, 5, 1, 1, -1); - layout->addWidget(m_table_widget); - layout->addWidget(filter_box); layout->addWidget(m_status_label); layout->addWidget(m_button_box); @@ -219,7 +165,7 @@ void NetPlayBrowser::UpdateList() m_table_widget->clear(); m_table_widget->setColumnCount(7); - m_table_widget->setHorizontalHeaderLabels({tr("Region"), tr("Name"), tr("Password?"), + m_table_widget->setHorizontalHeaderLabels({tr("Name"), tr("Password?"), tr("In-Game?"), tr("Game"), tr("Players"), tr("Version")}); @@ -238,26 +184,20 @@ void NetPlayBrowser::UpdateList() { const auto& entry = m_sessions[i]; - auto* region = new QTableWidgetItem(QString::fromStdString(entry.region)); auto* name = new QTableWidgetItem(QString::fromStdString(entry.name)); - auto* password = new QTableWidgetItem(entry.has_password ? tr("Yes") : tr("No")); auto* in_game = new QTableWidgetItem(entry.in_game ? tr("Yes") : tr("No")); auto* game_id = new QTableWidgetItem(QString::fromStdString(entry.game_id)); auto* player_count = new QTableWidgetItem(QStringLiteral("%1").arg(entry.player_count)); - auto* version = new QTableWidgetItem(QString::fromStdString(entry.version)); const bool enabled = Common::GetScmDescStr() == entry.version; - for (const auto& item : {region, name, password, in_game, game_id, player_count, version}) + for (const auto& item : {name, in_game, game_id, player_count}) item->setFlags(enabled ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags); - m_table_widget->setItem(i, 0, region); m_table_widget->setItem(i, 1, name); - m_table_widget->setItem(i, 2, password); - m_table_widget->setItem(i, 3, in_game); - m_table_widget->setItem(i, 4, game_id); - m_table_widget->setItem(i, 5, player_count); - m_table_widget->setItem(i, 6, version); + m_table_widget->setItem(i, 2, in_game); + m_table_widget->setItem(i, 3, game_id); + m_table_widget->setItem(i, 4, player_count); } m_status_label->setText( @@ -376,8 +316,11 @@ void NetPlayBrowser::RestoreSettings() else if (visibility == QStringLiteral("private")) m_radio_private->setChecked(true); - m_check_hide_incompatible->setChecked( + m_check_hide_incompatible->setChecked(true); + m_check_hide_ingame->setChecked(true); + + /* m_check_hide_incompatible->setChecked( settings.value(QStringLiteral("netplaybrowser/hide_incompatible"), true).toBool()); m_check_hide_ingame->setChecked( - settings.value(QStringLiteral("netplaybrowser/hide_ingame")).toBool()); + settings.value(QStringLiteral("netplaybrowser/hide_ingame")).toBool());*/ } diff --git a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp index 674fad4e5e..a9ddc7cd24 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp @@ -105,6 +105,12 @@ void NetPlayDialog::CreateMainLayout() m_game_button = new QPushButton; m_start_button = new QPushButton(tr("Start")); m_buffer_size_box = new QSpinBox; + m_buffer_size_box->setToolTip( + tr("Set the buffer based on the ping. The buffer should be ping ÷ 8 (rounded up).\nFor a " + "simple method, " + "use 8 for 64 ping and less, 12 for 100 ping and less, and 16 for 150 ping and " + "less.\nGames above 150 ping will be very laggy and are not recommended for competitive " + "play.")); m_buffer_label = new QLabel(tr("Buffer:")); m_quit_button = new QPushButton(tr("Quit")); m_splitter = new QSplitter(Qt::Horizontal); @@ -845,7 +851,7 @@ void NetPlayDialog::OnPadBufferChanged(u32 buffer) }); DisplayMessage(m_host_input_authority ? tr("Max buffer size changed to %1").arg(buffer) : tr("Buffer size changed to %1").arg(buffer), - "darkcyan"); + "orange"); m_buffer_size = static_cast(buffer); } diff --git a/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp b/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp index 2f9f00a42e..7b9632faf2 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp +++ b/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.cpp @@ -9,13 +9,19 @@ #include #include #include +#include +#include +#include #include #include #include #include +#include #include #include #include +#include +#include #include "Core/Config/NetplaySettings.h" #include "Core/NetPlayProto.h" @@ -24,6 +30,8 @@ #include "DolphinQt/QtUtils/UTF8CodePointCountValidator.h" #include "DolphinQt/Settings.h" +#include "Common/Version.h" +#include "DolphinQt/NetPlay/NetPlayBrowser.h" #include "UICommon/GameFile.h" #include "UICommon/NetPlayIndex.h" @@ -36,16 +44,11 @@ NetPlaySetupDialog::NetPlaySetupDialog(const GameListModel& game_list_model, QWi CreateMainLayout(); bool use_index = Config::Get(Config::NETPLAY_USE_INDEX); - std::string index_region = Config::Get(Config::NETPLAY_INDEX_REGION); std::string index_name = Config::Get(Config::NETPLAY_INDEX_NAME); - std::string index_password = Config::Get(Config::NETPLAY_INDEX_PASSWORD); std::string nickname = Config::Get(Config::NETPLAY_NICKNAME); std::string traversal_choice = Config::Get(Config::NETPLAY_TRAVERSAL_CHOICE); int connect_port = Config::Get(Config::NETPLAY_CONNECT_PORT); int host_port = Config::Get(Config::NETPLAY_HOST_PORT); - int host_listen_port = Config::Get(Config::NETPLAY_LISTEN_PORT); - bool enable_chunked_upload_limit = Config::Get(Config::NETPLAY_ENABLE_CHUNKED_UPLOAD_LIMIT); - u32 chunked_upload_limit = Config::Get(Config::NETPLAY_CHUNKED_UPLOAD_LIMIT); #ifdef USE_UPNP bool use_upnp = Config::Get(Config::NETPLAY_USE_UPNP); @@ -57,28 +60,41 @@ NetPlaySetupDialog::NetPlaySetupDialog(const GameListModel& game_list_model, QWi m_connect_port_box->setValue(connect_port); m_host_port_box->setValue(host_port); - m_host_force_port_box->setValue(host_listen_port); - m_host_force_port_box->setEnabled(false); - - m_host_server_browser->setChecked(use_index); - - m_host_server_region->setEnabled(use_index); - m_host_server_region->setCurrentIndex( - m_host_server_region->findData(QString::fromStdString(index_region))); - m_host_server_name->setEnabled(use_index); m_host_server_name->setText(QString::fromStdString(index_name)); - m_host_server_password->setEnabled(use_index); - m_host_server_password->setText(QString::fromStdString(index_password)); + // Browser Stuff + const auto& settings = Settings::Instance().GetQSettings(); - m_host_chunked_upload_limit_check->setChecked(enable_chunked_upload_limit); - m_host_chunked_upload_limit_box->setValue(chunked_upload_limit); - m_host_chunked_upload_limit_box->setEnabled(enable_chunked_upload_limit); + const QByteArray geometry = + settings.value(QStringLiteral("netplaybrowser/geometry")).toByteArray(); + if (!geometry.isEmpty()) + restoreGeometry(geometry); + + const QString region = settings.value(QStringLiteral("netplaybrowser/region")).toString(); + const bool valid_region = m_region_combo->findText(region) != -1; + if (valid_region) + m_region_combo->setCurrentText(region); + + m_edit_name->setText(settings.value(QStringLiteral("netplaybrowser/name")).toString()); + + const QString visibility = settings.value(QStringLiteral("netplaybrowser/visibility")).toString(); + if (visibility == QStringLiteral("public")) + m_radio_public->setChecked(true); + else if (visibility == QStringLiteral("private")) + m_radio_private->setChecked(true); + + m_check_hide_ingame->setChecked(true); OnConnectionTypeChanged(m_connection_type->currentIndex()); ConnectWidgets(); + + m_refresh_run.Set(true); + m_refresh_thread = std::thread([this] { RefreshLoopBrowser(); }); + + UpdateListBrowser(); + RefreshBrowser(); } void NetPlaySetupDialog::CreateMainLayout() @@ -87,6 +103,7 @@ void NetPlaySetupDialog::CreateMainLayout() m_button_box = new QDialogButtonBox(QDialogButtonBox::Cancel); m_nickname_edit = new QLineEdit; m_connection_type = new QComboBox; + m_connection_type->setCurrentIndex(1); m_reset_traversal_button = new QPushButton(tr("Reset Traversal Settings")); m_tab_widget = new QTabWidget; @@ -97,6 +114,50 @@ void NetPlaySetupDialog::CreateMainLayout() auto* connection_widget = new QWidget; auto* connection_layout = new QGridLayout; + // NetPlay Browser + auto* browser_widget = new QWidget; + auto* layout = new QVBoxLayout; + + m_table_widget = new QTableWidget; + m_table_widget->setTabKeyNavigation(false); + + m_table_widget->setSelectionBehavior(QAbstractItemView::SelectRows); + m_table_widget->setSelectionMode(QAbstractItemView::SingleSelection); + m_table_widget->setWordWrap(false); + + m_region_combo = new QComboBox; + + m_region_combo->addItem(tr("Any Region")); + + for (const auto& region : NetPlayIndex::GetRegions()) + { + m_region_combo->addItem( + tr("%1 (%2)").arg(tr(region.second.c_str())).arg(QString::fromStdString(region.first)), + QString::fromStdString(region.first)); + } + + m_region_combo->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + + m_status_label = new QLabel; + m_b_button_box = new QDialogButtonBox; + m_button_refresh = new QPushButton(tr("Refresh")); + m_edit_name = new QLineEdit; + m_check_hide_ingame = new QCheckBox(tr("Hide In-Game Sessions")); + + m_radio_all = new QRadioButton(tr("Private and Public")); + m_radio_private = new QRadioButton(tr("Private")); + m_radio_public = new QRadioButton(tr("Public")); + + m_radio_all->setChecked(true); + + layout->addWidget(m_table_widget); + layout->addWidget(m_status_label); + layout->addWidget(m_b_button_box); + + m_b_button_box->addButton(m_button_refresh, QDialogButtonBox::ResetRole); + + browser_widget->setLayout(layout); + m_ip_label = new QLabel; m_ip_edit = new QLineEdit; m_connect_port_label = new QLabel(tr("Port:")); @@ -112,7 +173,7 @@ void NetPlaySetupDialog::CreateMainLayout() connection_layout->addWidget( new QLabel( tr("ALERT:\n\n" - "All players must use the same Dolphin version.\n" + "All players must use the same Dolphin version, unless Orange Dolphin is used to host\n" "If enabled, SD cards must be identical between players.\n" "If DSP LLE is used, DSP ROMs must be identical between players.\n" "If a game is hanging on boot, it may not support Dual Core Netplay." @@ -129,16 +190,10 @@ void NetPlaySetupDialog::CreateMainLayout() // Host widget auto* host_widget = new QWidget; auto* host_layout = new QGridLayout; - m_host_port_label = new QLabel(tr("Port:")); m_host_port_box = new QSpinBox; - m_host_force_port_check = new QCheckBox(tr("Force Listen Port:")); - m_host_force_port_box = new QSpinBox; m_host_chunked_upload_limit_check = new QCheckBox(tr("Limit Chunked Upload Speed:")); m_host_chunked_upload_limit_box = new QSpinBox; - m_host_server_browser = new QCheckBox(tr("Show in server browser")); m_host_server_name = new QLineEdit; - m_host_server_password = new QLineEdit; - m_host_server_region = new QComboBox; #ifdef USE_UPNP m_host_upnp = new QCheckBox(tr("Forward port (UPnP)")); @@ -147,40 +202,16 @@ void NetPlaySetupDialog::CreateMainLayout() m_host_button = new QPushButton(tr("Host")); m_host_port_box->setMaximum(65535); - m_host_force_port_box->setMaximum(65535); - m_host_chunked_upload_limit_box->setRange(1, 1000000); - m_host_chunked_upload_limit_box->setSingleStep(100); - m_host_chunked_upload_limit_box->setSuffix(QStringLiteral(" kbps")); - - m_host_chunked_upload_limit_check->setToolTip(tr( - "This will limit the speed of chunked uploading per client, which is used for save sync.")); m_host_server_name->setToolTip(tr("Name of your session shown in the server browser")); m_host_server_name->setPlaceholderText(tr("Name")); - m_host_server_password->setToolTip(tr("Password for joining your game (leave empty for none)")); - m_host_server_password->setPlaceholderText(tr("Password")); - for (const auto& region : NetPlayIndex::GetRegions()) - { - m_host_server_region->addItem( - tr("%1 (%2)").arg(tr(region.second.c_str())).arg(QString::fromStdString(region.first)), - QString::fromStdString(region.first)); - } - host_layout->addWidget(m_host_port_label, 0, 0); - host_layout->addWidget(m_host_port_box, 0, 1); + host_layout->addWidget(m_host_port_box, 0, 0, Qt::AlignLeft); #ifdef USE_UPNP - host_layout->addWidget(m_host_upnp, 0, 2); + host_layout->addWidget(m_host_upnp, 0, 4, Qt::AlignRight); #endif - host_layout->addWidget(m_host_server_browser, 1, 0); - host_layout->addWidget(m_host_server_region, 1, 1); - host_layout->addWidget(m_host_server_name, 1, 2); - host_layout->addWidget(m_host_server_password, 1, 3); host_layout->addWidget(m_host_games, 2, 0, 1, -1); - host_layout->addWidget(m_host_force_port_check, 3, 0); - host_layout->addWidget(m_host_force_port_box, 3, 1, Qt::AlignLeft); - host_layout->addWidget(m_host_chunked_upload_limit_check, 4, 0); - host_layout->addWidget(m_host_chunked_upload_limit_box, 4, 1, Qt::AlignLeft); host_layout->addWidget(m_host_button, 4, 3, 2, 1, Qt::AlignRight); host_widget->setLayout(host_layout); @@ -199,10 +230,21 @@ void NetPlaySetupDialog::CreateMainLayout() // Tabs m_tab_widget->addTab(connection_widget, tr("Connect")); m_tab_widget->addTab(host_widget, tr("Host")); + m_tab_widget->addTab(browser_widget, tr("Browser")); setLayout(m_main_layout); } +NetPlaySetupDialog::~NetPlaySetupDialog() +{ + m_refresh_run.Set(false); + m_refresh_event.Set(); + if (m_refresh_thread.joinable()) + m_refresh_thread.join(); + + SaveSettings(); +} + void NetPlaySetupDialog::ConnectWidgets() { connect(m_connection_type, qOverload(&QComboBox::currentIndexChanged), this, @@ -221,23 +263,12 @@ void NetPlaySetupDialog::ConnectWidgets() m_host_games->item(index)->text()); }); + // refresh browser on tab changed + connect(m_tab_widget, &QTabWidget::currentChanged, this, &NetPlaySetupDialog::RefreshBrowser); + connect(m_host_games, &QListWidget::itemDoubleClicked, this, &NetPlaySetupDialog::accept); - connect(m_host_force_port_check, &QCheckBox::toggled, - [this](bool value) { m_host_force_port_box->setEnabled(value); }); - connect(m_host_chunked_upload_limit_check, &QCheckBox::toggled, this, [this](bool value) { - m_host_chunked_upload_limit_box->setEnabled(value); - SaveSettings(); - }); - connect(m_host_chunked_upload_limit_box, qOverload(&QSpinBox::valueChanged), this, - &NetPlaySetupDialog::SaveSettings); - - connect(m_host_server_browser, &QCheckBox::toggled, this, &NetPlaySetupDialog::SaveSettings); connect(m_host_server_name, &QLineEdit::textChanged, this, &NetPlaySetupDialog::SaveSettings); - connect(m_host_server_password, &QLineEdit::textChanged, this, &NetPlaySetupDialog::SaveSettings); - connect(m_host_server_region, - static_cast(&QComboBox::currentIndexChanged), this, - &NetPlaySetupDialog::SaveSettings); #ifdef USE_UPNP connect(m_host_upnp, &QCheckBox::stateChanged, this, &NetPlaySetupDialog::SaveSettings); @@ -248,11 +279,26 @@ void NetPlaySetupDialog::ConnectWidgets() connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(m_reset_traversal_button, &QPushButton::clicked, this, &NetPlaySetupDialog::ResetTraversalHost); - connect(m_host_server_browser, &QCheckBox::toggled, this, [this](bool value) { - m_host_server_region->setEnabled(value); - m_host_server_name->setEnabled(value); - m_host_server_password->setEnabled(value); - }); + + // Browser Stuff + connect(m_region_combo, qOverload(&QComboBox::currentIndexChanged), this, + &NetPlaySetupDialog::RefreshBrowser); + + connect(m_button_refresh, &QPushButton::clicked, this, &NetPlaySetupDialog::RefreshBrowser); + + connect(m_radio_all, &QRadioButton::toggled, this, &NetPlaySetupDialog::RefreshBrowser); + connect(m_radio_private, &QRadioButton::toggled, this, &NetPlaySetupDialog::RefreshBrowser); + connect(m_check_hide_ingame, &QRadioButton::toggled, this, &NetPlaySetupDialog::RefreshBrowser); + + connect(m_edit_name, &QLineEdit::textChanged, this, &NetPlaySetupDialog::RefreshBrowser); + + connect(m_table_widget, &QTableWidget::itemDoubleClicked, this, + &NetPlaySetupDialog::acceptBrowser); + + connect(this, &NetPlaySetupDialog::UpdateStatusRequestedBrowser, this, + &NetPlaySetupDialog::OnUpdateStatusRequestedBrowser, Qt::QueuedConnection); + connect(this, &NetPlaySetupDialog::UpdateListRequestedBrowser, this, + &NetPlaySetupDialog::OnUpdateListRequestedBrowser, Qt::QueuedConnection); } void NetPlaySetupDialog::SaveSettings() @@ -270,21 +316,27 @@ void NetPlaySetupDialog::SaveSettings() Config::SetBaseOrCurrent(Config::NETPLAY_USE_UPNP, m_host_upnp->isChecked()); #endif - if (m_host_force_port_check->isChecked()) - Config::SetBaseOrCurrent(Config::NETPLAY_LISTEN_PORT, - static_cast(m_host_force_port_box->value())); - - Config::SetBaseOrCurrent(Config::NETPLAY_ENABLE_CHUNKED_UPLOAD_LIMIT, - m_host_chunked_upload_limit_check->isChecked()); - Config::SetBaseOrCurrent(Config::NETPLAY_CHUNKED_UPLOAD_LIMIT, - m_host_chunked_upload_limit_box->value()); - - Config::SetBaseOrCurrent(Config::NETPLAY_USE_INDEX, m_host_server_browser->isChecked()); - Config::SetBaseOrCurrent(Config::NETPLAY_INDEX_REGION, - m_host_server_region->currentData().toString().toStdString()); + Config::SetBaseOrCurrent(Config::NETPLAY_INDEX_REGION, "NA"); Config::SetBaseOrCurrent(Config::NETPLAY_INDEX_NAME, m_host_server_name->text().toStdString()); - Config::SetBaseOrCurrent(Config::NETPLAY_INDEX_PASSWORD, - m_host_server_password->text().toStdString()); + Config::SetBaseOrCurrent(Config::NETPLAY_INDEX_PASSWORD, ""); + + + // Browser Stuff + auto& settings = Settings::Instance().GetQSettings(); + + settings.setValue(QStringLiteral("netplaybrowser/geometry"), saveGeometry()); + settings.setValue(QStringLiteral("netplaybrowser/region"), m_region_combo->currentText()); + settings.setValue(QStringLiteral("netplaybrowser/name"), m_edit_name->text()); + + QString visibility(QStringLiteral("all")); + if (m_radio_public->isChecked()) + visibility = QStringLiteral("public"); + else if (m_radio_private->isChecked()) + visibility = QStringLiteral("private"); + settings.setValue(QStringLiteral("netplaybrowser/visibility"), visibility); + + settings.setValue(QStringLiteral("netplaybrowser/hide_incompatible"), true); + settings.setValue(QStringLiteral("netplaybrowser/hide_ingame"), m_check_hide_ingame->isChecked()); } void NetPlaySetupDialog::OnConnectionTypeChanged(int index) @@ -292,14 +344,10 @@ void NetPlaySetupDialog::OnConnectionTypeChanged(int index) m_connect_port_box->setHidden(index != 0); m_connect_port_label->setHidden(index != 0); - m_host_port_label->setHidden(index != 0); m_host_port_box->setHidden(index != 0); #ifdef USE_UPNP m_host_upnp->setHidden(index != 0); #endif - m_host_force_port_check->setHidden(index == 0); - m_host_force_port_box->setHidden(index == 0); - m_reset_traversal_button->setHidden(index == 0); std::string address = @@ -314,6 +362,16 @@ void NetPlaySetupDialog::OnConnectionTypeChanged(int index) void NetPlaySetupDialog::show() { + // Here i'm setting the lobby name if it's empty to make + // NetPlay sessions start more easily for first time players + if (m_host_server_name->text().isEmpty()) + { + std::string nickname = Config::Get(Config::NETPLAY_NICKNAME); + m_host_server_name->setText(QString::fromStdString(nickname)); + } + m_connection_type->setCurrentIndex(1); + m_tab_widget->setCurrentIndex(2); // start on browser + PopulateGameList(); QDialog::show(); } @@ -334,20 +392,6 @@ void NetPlaySetupDialog::accept() return; } - if (m_host_server_browser->isChecked() && m_host_server_name->text().isEmpty()) - { - ModalMessageBox::critical(this, tr("Error"), tr("You must provide a name for your session!")); - return; - } - - if (m_host_server_browser->isChecked() && - m_host_server_region->currentData().toString().isEmpty()) - { - ModalMessageBox::critical(this, tr("Error"), - tr("You must provide a region for your session!")); - return; - } - emit Host(*items[0]->data(Qt::UserRole).value>()); } } @@ -390,3 +434,177 @@ void NetPlaySetupDialog::ResetTraversalHost() .arg(QString::fromStdString(Config::NETPLAY_TRAVERSAL_SERVER.GetDefaultValue()), QString::number(Config::NETPLAY_TRAVERSAL_PORT.GetDefaultValue()))); } + +void NetPlaySetupDialog::RefreshBrowser() +{ + std::map filters; + + if (!m_edit_name->text().isEmpty()) + filters["name"] = m_edit_name->text().toStdString(); + + if (true) + filters["version"] = Common::GetScmDescStr(); + + if (!m_radio_all->isChecked()) + filters["password"] = std::to_string(m_radio_private->isChecked()); + + if (m_region_combo->currentIndex() != 0) + filters["region"] = m_region_combo->currentData().toString().toStdString(); + + if (m_check_hide_ingame->isChecked()) + filters["in_game"] = "0"; + + std::unique_lock lock(m_refresh_filters_mutex); + m_refresh_filters = std::move(filters); + m_refresh_event.Set(); + SaveSettings(); +} + +void NetPlaySetupDialog::RefreshLoopBrowser() +{ + while (m_refresh_run.IsSet()) + { + m_refresh_event.Wait(); + + std::unique_lock lock(m_refresh_filters_mutex); + if (m_refresh_filters) + { + auto filters = std::move(*m_refresh_filters); + m_refresh_filters.reset(); + + lock.unlock(); + + emit UpdateStatusRequestedBrowser(tr("Refreshing...")); + + NetPlayIndex client; + + auto entries = client.List(filters); + + if (entries) + { + emit UpdateListRequestedBrowser(std::move(*entries)); + } + else + { + emit UpdateStatusRequestedBrowser(tr("Error obtaining session list: %1") + .arg(QString::fromStdString(client.GetLastError()))); + } + } + } +} + +void NetPlaySetupDialog::UpdateListBrowser() +{ + const int session_count = static_cast(m_sessions.size()); + + m_table_widget->clear(); + m_table_widget->setColumnCount(4); + m_table_widget->setHorizontalHeaderLabels({ + tr("Name"), + tr("Game"), + tr("Players"), + tr("In-Game"), + }); + + auto* hor_header = m_table_widget->horizontalHeader(); + + hor_header->setSectionResizeMode(0, QHeaderView::Stretch); + hor_header->setSectionResizeMode(1, QHeaderView::Stretch); + hor_header->setSectionResizeMode(2, QHeaderView::Stretch); + hor_header->setSectionResizeMode(3, QHeaderView::ResizeToContents); + hor_header->setSectionResizeMode(4, QHeaderView::ResizeToContents); + hor_header->setHighlightSections(false); + + m_table_widget->setRowCount(session_count); + + for (int i = 0; i < session_count; i++) + { + const auto& entry = m_sessions[i]; + + auto* name = new QTableWidgetItem(QString::fromStdString(entry.name)); + auto* in_game = new QTableWidgetItem(entry.in_game ? tr("Yes") : tr("No")); + auto* game_id = new QTableWidgetItem(QString::fromStdString(entry.game_id)); + auto* player_count = new QTableWidgetItem(QStringLiteral("%1").arg(entry.player_count)); + + const bool enabled = Common::GetScmDescStr() == entry.version; + + for (const auto& item : {name, game_id, player_count, in_game}) + item->setFlags(enabled ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags); + + m_table_widget->setItem(i, 1, name); + m_table_widget->setItem(i, 2, game_id); + m_table_widget->setItem(i, 3, player_count); + m_table_widget->setItem(i, 4, in_game); + + } + + m_status_label->setText( + (session_count == 1 ? tr("%1 session found") : tr("%1 sessions found")).arg(session_count)); +} + +void NetPlaySetupDialog::OnSelectionChangedBrowser() +{ + return; +} + +void NetPlaySetupDialog::OnUpdateStatusRequestedBrowser(const QString& status) +{ + m_status_label->setText(status); +} + +void NetPlaySetupDialog::OnUpdateListRequestedBrowser(std::vector sessions) +{ + m_sessions = std::move(sessions); + UpdateListBrowser(); +} + +void NetPlaySetupDialog::acceptBrowser() +{ + if (m_table_widget->selectedItems().isEmpty()) + return; + + const int index = m_table_widget->selectedItems()[0]->row(); + + NetPlaySession& session = m_sessions[index]; + + std::string server_id = session.server_id; + + if (m_sessions[index].has_password) + { + auto* dialog = new QInputDialog(this); + + dialog->setWindowFlags(dialog->windowFlags() & ~Qt::WindowContextHelpButtonHint); + dialog->setWindowTitle(tr("Enter password")); + dialog->setLabelText(tr("This session requires a password:")); + dialog->setWindowModality(Qt::WindowModal); + dialog->setTextEchoMode(QLineEdit::Password); + + if (dialog->exec() != QDialog::Accepted) + return; + + const std::string password = dialog->textValue().toStdString(); + + auto decrypted_id = session.DecryptID(password); + + if (!decrypted_id) + { + ModalMessageBox::warning(this, tr("Error"), tr("Invalid password provided.")); + return; + } + + server_id = decrypted_id.value(); + } + + QDialog::accept(); + + Config::SetBaseOrCurrent(Config::NETPLAY_TRAVERSAL_CHOICE, session.method); + + Config::SetBaseOrCurrent(Config::NETPLAY_CONNECT_PORT, session.port); + + if (session.method == "traversal") + Config::SetBaseOrCurrent(Config::NETPLAY_HOST_CODE, server_id); + else + Config::SetBaseOrCurrent(Config::NETPLAY_ADDRESS, server_id); + + emit JoinBrowser(); +} diff --git a/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.h b/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.h index fbc82ab22b..56b737f344 100644 --- a/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.h +++ b/Source/Core/DolphinQt/NetPlay/NetPlaySetupDialog.h @@ -6,6 +6,7 @@ #include #include "DolphinQt/GameList/GameListModel.h" +#include "UICommon/NetPlayIndex.h" class QCheckBox; class QComboBox; @@ -17,6 +18,9 @@ class QGridLayout; class QPushButton; class QSpinBox; class QTabWidget; +class QGroupBox; +class QTableWidget; +class QRadioButton; namespace UICommon { @@ -28,13 +32,17 @@ class NetPlaySetupDialog : public QDialog Q_OBJECT public: explicit NetPlaySetupDialog(const GameListModel& game_list_model, QWidget* parent); + ~NetPlaySetupDialog(); void accept() override; void show(); signals: bool Join(); + void JoinBrowser(); bool Host(const UICommon::GameFile& game); + void UpdateStatusRequestedBrowser(const QString& status); + void UpdateListRequestedBrowser(std::vector sessions); private: void CreateMainLayout(); @@ -42,6 +50,15 @@ private: void PopulateGameList(); void ResetTraversalHost(); + // Browser Stuff + void RefreshBrowser(); + void RefreshLoopBrowser(); + void UpdateListBrowser(); + void OnSelectionChangedBrowser(); + void OnUpdateStatusRequestedBrowser(const QString& status); + void OnUpdateListRequestedBrowser(std::vector sessions); + void acceptBrowser(); + void SaveSettings(); void OnConnectionTypeChanged(int index); @@ -62,18 +79,32 @@ private: QPushButton* m_connect_button; // Host Widget - QLabel* m_host_port_label; QSpinBox* m_host_port_box; QListWidget* m_host_games; QPushButton* m_host_button; - QCheckBox* m_host_force_port_check; - QSpinBox* m_host_force_port_box; QCheckBox* m_host_chunked_upload_limit_check; QSpinBox* m_host_chunked_upload_limit_box; QCheckBox* m_host_server_browser; QLineEdit* m_host_server_name; - QLineEdit* m_host_server_password; - QComboBox* m_host_server_region; + + QTableWidget* m_table_widget; + QComboBox* m_region_combo; + QLabel* m_status_label; + QDialogButtonBox* m_b_button_box; + QPushButton* m_button_refresh; + QLineEdit* m_edit_name; + QCheckBox* m_check_hide_ingame; + QRadioButton* m_radio_all; + QRadioButton* m_radio_private; + QRadioButton* m_radio_public; + + std::vector m_sessions; + + std::thread m_refresh_thread; + std::optional> m_refresh_filters; + std::mutex m_refresh_filters_mutex; + Common::Flag m_refresh_run; + Common::Event m_refresh_event; #ifdef USE_UPNP QCheckBox* m_host_upnp; diff --git a/Source/Core/DolphinQt/RiivolutionBootWidget.cpp b/Source/Core/DolphinQt/RiivolutionBootWidget.cpp index c70df8e770..ff19d8597a 100644 --- a/Source/Core/DolphinQt/RiivolutionBootWidget.cpp +++ b/Source/Core/DolphinQt/RiivolutionBootWidget.cpp @@ -207,10 +207,10 @@ void RiivolutionBootWidget::MakeGUIForParsedFile(std::string path, std::string r connect(selection, qOverload(&QComboBox::currentIndexChanged), this, [this, selection](int idx) { const auto gui_index = selection->currentData().value(); - auto& disc = m_discs[gui_index.m_disc_index].disc; - auto& section = disc.m_sections[gui_index.m_section_index]; - auto& option = section.m_options[gui_index.m_option_index]; - option.m_selected_choice = static_cast(gui_index.m_choice_index); + auto& selected_disc = m_discs[gui_index.m_disc_index].disc; + auto& selected_section = selected_disc.m_sections[gui_index.m_section_index]; + auto& selected_option = selected_section.m_options[gui_index.m_option_index]; + selected_option.m_selected_choice = static_cast(gui_index.m_choice_index); }); grid_layout->addWidget(label, row, 0, 1, 1); diff --git a/Source/Core/DolphinQt/Settings.cpp b/Source/Core/DolphinQt/Settings.cpp index d22dcc6e25..61e378f736 100644 --- a/Source/Core/DolphinQt/Settings.cpp +++ b/Source/Core/DolphinQt/Settings.cpp @@ -705,10 +705,6 @@ void Settings::SetSDCardInserted(bool inserted) { Config::SetBaseOrCurrent(Config::MAIN_WII_SD_CARD, inserted); emit SDCardInsertionChanged(inserted); - - auto* ios = IOS::HLE::GetIOS(); - if (ios) - ios->SDIO_EventNotify(); } } diff --git a/Source/Core/DolphinQt/Settings/GeneralPane.cpp b/Source/Core/DolphinQt/Settings/GeneralPane.cpp index e8ec3eeab0..19c0a5d095 100644 --- a/Source/Core/DolphinQt/Settings/GeneralPane.cpp +++ b/Source/Core/DolphinQt/Settings/GeneralPane.cpp @@ -25,12 +25,12 @@ #include "DolphinQt/QtUtils/ModalMessageBox.h" #include "DolphinQt/Settings.h" -#include "UICommon/AutoUpdate.h" +//#include "UICommon/AutoUpdate.h" #ifdef USE_DISCORD_PRESENCE #include "UICommon/DiscordPresence.h" #endif -constexpr int AUTO_UPDATE_DISABLE_INDEX = 0; +/* constexpr int AUTO_UPDATE_DISABLE_INDEX = 0; constexpr int AUTO_UPDATE_STABLE_INDEX = 1; constexpr int AUTO_UPDATE_BETA_INDEX = 2; constexpr int AUTO_UPDATE_DEV_INDEX = 3; @@ -38,7 +38,7 @@ constexpr int AUTO_UPDATE_DEV_INDEX = 3; constexpr const char* AUTO_UPDATE_DISABLE_STRING = ""; constexpr const char* AUTO_UPDATE_STABLE_STRING = "stable"; constexpr const char* AUTO_UPDATE_BETA_STRING = "beta"; -constexpr const char* AUTO_UPDATE_DEV_STRING = "dev"; +constexpr const char* AUTO_UPDATE_DEV_STRING = "dev";*/ constexpr int FALLBACK_REGION_NTSCJ_INDEX = 0; constexpr int FALLBACK_REGION_NTSCU_INDEX = 1; @@ -65,8 +65,8 @@ void GeneralPane::CreateLayout() // Create layout here CreateBasic(); - if (AutoUpdateChecker::SystemSupportsAutoUpdates()) - CreateAutoUpdate(); + /* if (AutoUpdateChecker::SystemSupportsAutoUpdates()) + CreateAutoUpdate();*/ CreateFallbackRegion(); @@ -83,7 +83,6 @@ void GeneralPane::OnEmulationStateChanged(Core::State state) const bool running = state != Core::State::Uninitialized; m_checkbox_dualcore->setEnabled(!running); - m_checkbox_cheats->setEnabled(!running); m_checkbox_override_region_settings->setEnabled(!running); #ifdef USE_DISCORD_PRESENCE m_checkbox_discord_presence->setEnabled(!running); @@ -94,7 +93,6 @@ void GeneralPane::OnEmulationStateChanged(Core::State state) void GeneralPane::ConnectLayout() { connect(m_checkbox_dualcore, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); - connect(m_checkbox_cheats, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); connect(m_checkbox_override_region_settings, &QCheckBox::stateChanged, this, &GeneralPane::OnSaveConfig); connect(m_checkbox_auto_disc_change, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); @@ -102,13 +100,13 @@ void GeneralPane::ConnectLayout() connect(m_checkbox_discord_presence, &QCheckBox::toggled, this, &GeneralPane::OnSaveConfig); #endif - if (AutoUpdateChecker::SystemSupportsAutoUpdates()) + /* if (AutoUpdateChecker::SystemSupportsAutoUpdates()) { connect(m_combobox_update_track, qOverload(&QComboBox::currentIndexChanged), this, &GeneralPane::OnSaveConfig); connect(&Settings::Instance(), &Settings::AutoUpdateTrackChanged, this, &GeneralPane::LoadConfig); - } + }*/ // Advanced connect(m_combobox_speedlimit, qOverload(&QComboBox::currentIndexChanged), @@ -136,9 +134,6 @@ void GeneralPane::CreateBasic() m_checkbox_dualcore = new QCheckBox(tr("Enable Dual Core (speedup)")); basic_group_layout->addWidget(m_checkbox_dualcore); - m_checkbox_cheats = new QCheckBox(tr("Enable Cheats")); - basic_group_layout->addWidget(m_checkbox_cheats); - m_checkbox_override_region_settings = new QCheckBox(tr("Allow Mismatched Region Settings")); basic_group_layout->addWidget(m_checkbox_override_region_settings); @@ -172,7 +167,7 @@ void GeneralPane::CreateBasic() speed_limit_layout->addRow(tr("&Speed Limit:"), m_combobox_speedlimit); } -void GeneralPane::CreateAutoUpdate() +/* void GeneralPane::CreateAutoUpdate() { auto* auto_update_group = new QGroupBox(tr("Auto Update Settings")); auto* auto_update_group_layout = new QFormLayout; @@ -189,7 +184,7 @@ void GeneralPane::CreateAutoUpdate() for (const QString& option : {tr("Don't Update"), tr("Stable (once a year)"), tr("Beta (once a month)"), tr("Dev (multiple times a day)")}) m_combobox_update_track->addItem(option); -} +}*/ void GeneralPane::CreateFallbackRegion() { @@ -235,7 +230,7 @@ void GeneralPane::LoadConfig() { const QSignalBlocker blocker(this); - if (AutoUpdateChecker::SystemSupportsAutoUpdates()) + /* if (AutoUpdateChecker::SystemSupportsAutoUpdates()) { const auto track = Settings::Instance().GetAutoUpdateTrack().toStdString(); @@ -247,13 +242,12 @@ void GeneralPane::LoadConfig() m_combobox_update_track->setCurrentIndex(AUTO_UPDATE_BETA_INDEX); else m_combobox_update_track->setCurrentIndex(AUTO_UPDATE_DEV_INDEX); - } + }*/ #if defined(USE_ANALYTICS) && USE_ANALYTICS m_checkbox_enable_analytics->setChecked(Settings::Instance().IsAnalyticsEnabled()); #endif m_checkbox_dualcore->setChecked(Config::Get(Config::MAIN_CPU_THREAD)); - m_checkbox_cheats->setChecked(Settings::Instance().GetCheatsEnabled()); m_checkbox_override_region_settings->setChecked( Config::Get(Config::MAIN_OVERRIDE_REGION_SETTINGS)); m_checkbox_auto_disc_change->setChecked(Config::Get(Config::MAIN_AUTO_DISC_CHANGE)); @@ -279,7 +273,7 @@ void GeneralPane::LoadConfig() m_combobox_fallback_region->setCurrentIndex(FALLBACK_REGION_NTSCJ_INDEX); } -static QString UpdateTrackFromIndex(int index) +/* static QString UpdateTrackFromIndex(int index) { QString value; @@ -300,7 +294,7 @@ static QString UpdateTrackFromIndex(int index) } return value; -} +}*/ static DiscIO::Region UpdateFallbackRegionFromIndex(int index) { @@ -332,11 +326,11 @@ void GeneralPane::OnSaveConfig() Config::ConfigChangeCallbackGuard config_guard; auto& settings = SConfig::GetInstance(); - if (AutoUpdateChecker::SystemSupportsAutoUpdates()) + /* if (AutoUpdateChecker::SystemSupportsAutoUpdates()) { Settings::Instance().SetAutoUpdateTrack( UpdateTrackFromIndex(m_combobox_update_track->currentIndex())); - } + }*/ #ifdef USE_DISCORD_PRESENCE Discord::SetDiscordPresenceEnabled(m_checkbox_discord_presence->isChecked()); @@ -347,11 +341,9 @@ void GeneralPane::OnSaveConfig() DolphinAnalytics::Instance().ReloadConfig(); #endif Config::SetBaseOrCurrent(Config::MAIN_CPU_THREAD, m_checkbox_dualcore->isChecked()); - Settings::Instance().SetCheatsEnabled(m_checkbox_cheats->isChecked()); Config::SetBaseOrCurrent(Config::MAIN_OVERRIDE_REGION_SETTINGS, m_checkbox_override_region_settings->isChecked()); Config::SetBase(Config::MAIN_AUTO_DISC_CHANGE, m_checkbox_auto_disc_change->isChecked()); - Config::SetBaseOrCurrent(Config::MAIN_ENABLE_CHEATS, m_checkbox_cheats->isChecked()); Config::SetBaseOrCurrent(Config::MAIN_EMULATION_SPEED, m_combobox_speedlimit->currentIndex() * 0.1f); Settings::Instance().SetFallbackRegion( diff --git a/Source/Core/DolphinQt/Settings/GeneralPane.h b/Source/Core/DolphinQt/Settings/GeneralPane.h index 476cc67510..0ee62ecf8c 100644 --- a/Source/Core/DolphinQt/Settings/GeneralPane.h +++ b/Source/Core/DolphinQt/Settings/GeneralPane.h @@ -28,7 +28,7 @@ private: void CreateLayout(); void ConnectLayout(); void CreateBasic(); - void CreateAutoUpdate(); + //void CreateAutoUpdate(); void CreateFallbackRegion(); void LoadConfig(); diff --git a/Source/Core/DolphinQt/Settings/InterfacePane.cpp b/Source/Core/DolphinQt/Settings/InterfacePane.cpp index db95fb308c..ea7736ad89 100644 --- a/Source/Core/DolphinQt/Settings/InterfacePane.cpp +++ b/Source/Core/DolphinQt/Settings/InterfacePane.cpp @@ -126,7 +126,7 @@ void InterfacePane::CreateUI() // User Style Combobox m_combobox_userstyle = new QComboBox; - m_label_userstyle = new QLabel(tr("User Style:")); + m_label_userstyle = new QLabel(tr("Window Theme:")); combobox_layout->addRow(m_label_userstyle, m_combobox_userstyle); auto userstyle_search_results = Common::DoFileSearch({File::GetUserPath(D_STYLES_IDX)}); @@ -208,6 +208,7 @@ void InterfacePane::ConnectLayout() { connect(m_checkbox_use_builtin_title_database, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); + connect(m_checkbox_use_userstyle, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_checkbox_use_covers, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_checkbox_disable_screensaver, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); connect(m_checkbox_show_debugging_ui, &QCheckBox::toggled, this, &InterfacePane::OnSaveConfig); diff --git a/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.cpp b/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.cpp index d2272d03b0..1024816e22 100644 --- a/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.cpp +++ b/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.cpp @@ -3,7 +3,6 @@ #include "DolphinQt/Settings/USBDeviceAddToWhitelistDialog.h" -#include #include #include #include diff --git a/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.h b/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.h index 1b0ebcdccc..5ae1199f2e 100644 --- a/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.h +++ b/Source/Core/DolphinQt/Settings/USBDeviceAddToWhitelistDialog.h @@ -7,7 +7,6 @@ class QTimer; class QDialog; -class QButtonGroup; class QHeaderView; class QLabel; class QLineEdit; diff --git a/Source/Core/DolphinQt/ToolBar.cpp b/Source/Core/DolphinQt/ToolBar.cpp index ad79c6f91a..70da064786 100644 --- a/Source/Core/DolphinQt/ToolBar.cpp +++ b/Source/Core/DolphinQt/ToolBar.cpp @@ -119,9 +119,12 @@ void ToolBar::MakeActions() addSeparator(); - m_pause_play_action = addAction(tr("Play"), this, &ToolBar::PlayPressed); - + m_pause_play_action = addAction(tr("Local Play"), this, &ToolBar::PlayPressed); + m_start_netplay_action = addAction(tr("Online Play"), this, &ToolBar::StartNetPlayPressed); m_stop_action = addAction(tr("Stop"), this, &ToolBar::StopPressed); + + addSeparator(); + m_fullscreen_action = addAction(tr("FullScr"), this, &ToolBar::FullScreenPressed); m_screenshot_action = addAction(tr("ScrShot"), this, &ToolBar::ScreenShotPressed); @@ -164,7 +167,7 @@ void ToolBar::UpdatePausePlayButtonState(const bool playing_state) else { disconnect(m_pause_play_action, 0, 0, 0); - m_pause_play_action->setText(tr("Play")); + m_pause_play_action->setText(tr("Local Play")); m_pause_play_action->setIcon(Resources::GetScaledThemeIcon("play")); connect(m_pause_play_action, &QAction::triggered, this, &ToolBar::PlayPressed); } @@ -195,4 +198,5 @@ void ToolBar::UpdateIcons() m_config_action->setIcon(Resources::GetScaledThemeIcon("config")); m_controllers_action->setIcon(Resources::GetScaledThemeIcon("classic")); m_graphics_action->setIcon(Resources::GetScaledThemeIcon("graphics")); + m_start_netplay_action->setIcon(Resources::GetScaledThemeIcon("wifi")); } diff --git a/Source/Core/DolphinQt/ToolBar.h b/Source/Core/DolphinQt/ToolBar.h index 38aa98004f..8aa3fa73c4 100644 --- a/Source/Core/DolphinQt/ToolBar.h +++ b/Source/Core/DolphinQt/ToolBar.h @@ -33,6 +33,8 @@ signals: void ControllersPressed(); void GraphicsPressed(); + void StartNetPlayPressed(); + void StepPressed(); void StepOverPressed(); void StepOutPressed(); @@ -58,6 +60,8 @@ private: QAction* m_controllers_action; QAction* m_graphics_action; + QAction* m_start_netplay_action; + QAction* m_step_action; QAction* m_step_over_action; QAction* m_step_out_action; diff --git a/Source/Core/UICommon/AutoUpdate.cpp b/Source/Core/UICommon/AutoUpdate.cpp index e423b9ec86..62152dba3e 100644 --- a/Source/Core/UICommon/AutoUpdate.cpp +++ b/Source/Core/UICommon/AutoUpdate.cpp @@ -164,7 +164,7 @@ void AutoUpdateChecker::CheckForUpdate(std::string_view update_track, std::string_view version_hash = hash_override.empty() ? Common::GetScmRevGitStr() : hash_override; std::string url = fmt::format("https://dolphin-emu.org/update/check/v1/{}/{}/{}", update_track, version_hash, GetPlatformID()); - + /* Common::HttpRequest req{std::chrono::seconds{10}}; auto resp = req.Get(url); if (!resp) @@ -201,17 +201,18 @@ void AutoUpdateChecker::CheckForUpdate(std::string_view update_track, nvi.changelog_html = GenerateChangelog(obj["changelog"].get()); OnUpdateAvailable(nvi); + */ } void AutoUpdateChecker::TriggerUpdate(const AutoUpdateChecker::NewVersionInformation& info, AutoUpdateChecker::RestartMode restart_mode) { // Check to make sure we don't already have an update triggered - if (s_update_triggered) + /* if (s_update_triggered) { WARN_LOG_FMT(COMMON, "Auto-update: received a redundant trigger request, ignoring"); return; - } + }*/ s_update_triggered = true; #ifdef OS_SUPPORTS_UPDATER diff --git a/Source/Core/UICommon/DiscordPresence.cpp b/Source/Core/UICommon/DiscordPresence.cpp index 63036370ef..7858abe2d5 100644 --- a/Source/Core/UICommon/DiscordPresence.cpp +++ b/Source/Core/UICommon/DiscordPresence.cpp @@ -3,6 +3,9 @@ #include "UICommon/DiscordPresence.h" +#include "Common/Hash.h" +#include "Common/StringUtil.h" + #include "Core/Config/NetplaySettings.h" #include "Core/Config/UISettings.h" #include "Core/ConfigManager.h" @@ -107,11 +110,6 @@ std::string ArtworkForGameId(const std::string& gameid) "GFT", // GFTE01: Mario Golf: Toadstool Tour "RMC", // RMCE01: Mario Kart Wii "GM4", // GM4E01: Mario Kart: Double Dash!! - "GMP", // GMPE01: Mario Party 4 - "GP5", // GP5E01: Mario Party 5 - "GP6", // GP6E01: Mario Party 6 - "GP7", // GP7E01: Mario Party 7 - "RM8", // RM8E01: Mario Party 8 "SSQ", // SSQE01: Mario Party 9 "GOM", // GOME01: Mario Power Tennis "GYQ", // GYQE01: Mario Superstar Baseball @@ -190,7 +188,7 @@ void Init() handlers.joinRequest = HandleDiscordJoinRequest; handlers.joinGame = HandleDiscordJoin; // The number is the client ID for Dolphin, it's used for images and the application name - Discord_Initialize("455712169795780630", &handlers, 1, nullptr); + Discord_Initialize("888655408623943731", &handlers, 1, nullptr); UpdateDiscordPresence(); #endif } @@ -227,31 +225,26 @@ void UpdateDiscordPresence(int party_size, SecretType type, const std::string& s DiscordRichPresence discord_presence = {}; if (game_artwork.empty()) { - discord_presence.largeImageKey = "dolphin_logo"; - discord_presence.largeImageText = "Dolphin is an emulator for the GameCube and the Wii."; + discord_presence.largeImageKey = "dolphin"; } else { discord_presence.largeImageKey = game_artwork.c_str(); discord_presence.largeImageText = title.c_str(); - discord_presence.smallImageKey = "dolphin_logo"; - discord_presence.smallImageText = "Dolphin is an emulator for the GameCube and the Wii."; + discord_presence.smallImageKey = "dolphin"; } discord_presence.details = title.empty() ? "Not in-game" : title.c_str(); - discord_presence.startTimestamp = std::time(nullptr); if (party_size > 0) { if (party_size < 4) { - discord_presence.state = "In a party"; discord_presence.partySize = party_size; discord_presence.partyMax = 4; } else { // others can still join to spectate - discord_presence.state = "In a full party"; discord_presence.partySize = party_size; // Note: joining still works without partyMax } diff --git a/Source/Core/UICommon/UICommon.cpp b/Source/Core/UICommon/UICommon.cpp index 1e6aa4bbb9..a3dbb788cb 100644 --- a/Source/Core/UICommon/UICommon.cpp +++ b/Source/Core/UICommon/UICommon.cpp @@ -108,7 +108,6 @@ void Init() SConfig::Init(); Discord::Init(); Common::Log::LogManager::Init(); - WiimoteReal::LoadSettings(); GCAdapter::Init(); VideoBackendBase::ActivateBackend(Config::Get(Config::MAIN_GFX_BACKEND)); @@ -270,17 +269,8 @@ void SetUserDirectory(std::string custom_path) // Get Documents path in case we need it. // TODO: Maybe use WIL when it's available? PWSTR my_documents = nullptr; - bool my_documents_found = - SUCCEEDED(SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &my_documents)); - if (local) // Case 1-2 - user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; - else if (configPath) // Case 3 - user_path = TStrToUTF8(configPath.get()); - else if (my_documents_found) // Case 4 - user_path = TStrToUTF8(my_documents) + DIR_SEP "Dolphin Emulator" DIR_SEP; - else // Case 5 - user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; + user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP; CoTaskMemFree(my_documents); #else @@ -358,29 +348,6 @@ void SetUserDirectory(std::string custom_path) File::SetUserPath(D_USER_IDX, std::move(user_path)); } -void SaveWiimoteSources() -{ - std::string ini_filename = File::GetUserPath(D_CONFIG_IDX) + WIIMOTE_INI_NAME ".ini"; - - IniFile inifile; - inifile.Load(ini_filename); - - for (unsigned int i = 0; i < MAX_WIIMOTES; ++i) - { - std::string secname("Wiimote"); - secname += (char)('1' + i); - IniFile::Section& sec = *inifile.GetOrCreateSection(secname); - - sec.Set("Source", int(WiimoteCommon::GetSource(i))); - } - - std::string secname("BalanceBoard"); - IniFile::Section& sec = *inifile.GetOrCreateSection(secname); - sec.Set("Source", int(WiimoteCommon::GetSource(WIIMOTE_BALANCE_BOARD))); - - inifile.Save(ini_filename); -} - bool TriggerSTMPowerEvent() { const auto ios = IOS::HLE::GetIOS(); diff --git a/Source/Core/UICommon/UICommon.h b/Source/Core/UICommon/UICommon.h index ea1d44e599..6bdb11f541 100644 --- a/Source/Core/UICommon/UICommon.h +++ b/Source/Core/UICommon/UICommon.h @@ -27,8 +27,6 @@ void SetUserDirectory(std::string custom_path); bool TriggerSTMPowerEvent(); -void SaveWiimoteSources(); - // Return a pretty file size string from byte count. // e.g. 1134278 -> "1.08 MiB" std::string FormatSize(u64 bytes, int decimals = 2); diff --git a/Source/Core/VideoCommon/CommandProcessor.cpp b/Source/Core/VideoCommon/CommandProcessor.cpp index 890d7ebfa4..6ebb726d23 100644 --- a/Source/Core/VideoCommon/CommandProcessor.cpp +++ b/Source/Core/VideoCommon/CommandProcessor.cpp @@ -121,11 +121,6 @@ void DoState(PointerWrap& p) p.Do(s_interrupt_waiting); } -static inline void WriteLow(std::atomic& reg, u16 lowbits) -{ - reg.store((reg.load(std::memory_order_relaxed) & 0xFFFF0000) | lowbits, - std::memory_order_relaxed); -} static inline void WriteHigh(std::atomic& reg, u16 highbits) { reg.store((reg.load(std::memory_order_relaxed) & 0x0000FFFF) | (static_cast(highbits) << 16), @@ -205,6 +200,8 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) {FIFO_WRITE_POINTER_HI, MMIO::Utils::HighPart(&fifo.CPWritePointer), false, WMASK_HI_RESTRICT}, // FIFO_READ_POINTER has different code for single/dual core. + {FIFO_BP_LO, MMIO::Utils::LowPart(&fifo.CPBreakpoint), false, WMASK_LO_ALIGN_32BIT}, + {FIFO_BP_HI, MMIO::Utils::HighPart(&fifo.CPBreakpoint), false, WMASK_HI_RESTRICT}, }; for (auto& mapped_var : directly_mapped_vars) @@ -214,16 +211,6 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) MMIO::DirectWrite(mapped_var.ptr, mapped_var.wmask)); } - mmio->Register(base | FIFO_BP_LO, MMIO::DirectRead(MMIO::Utils::LowPart(&fifo.CPBreakpoint)), - MMIO::ComplexWrite([](u32, u16 val) { - WriteLow(fifo.CPBreakpoint, val & WMASK_LO_ALIGN_32BIT); - })); - mmio->Register(base | FIFO_BP_HI, - MMIO::DirectRead(MMIO::Utils::HighPart(&fifo.CPBreakpoint)), - MMIO::ComplexWrite([WMASK_HI_RESTRICT](u32, u16 val) { - WriteHigh(fifo.CPBreakpoint, val & WMASK_HI_RESTRICT); - })); - // Timing and metrics MMIOs are stubbed with fixed values. struct { diff --git a/Source/Core/VideoCommon/FramebufferManager.cpp b/Source/Core/VideoCommon/FramebufferManager.cpp index b805de77a8..c6cb2fd29e 100644 --- a/Source/Core/VideoCommon/FramebufferManager.cpp +++ b/Source/Core/VideoCommon/FramebufferManager.cpp @@ -593,6 +593,7 @@ void FramebufferManager::DestroyReadbackFramebuffer() void FramebufferManager::PopulateEFBCache(bool depth, u32 tile_index) { + FlushEFBPokes(); g_vertex_manager->OnCPUEFBAccess(); // Force the path through the intermediate texture, as we can't do an image copy from a depth diff --git a/Source/Core/VideoCommon/GXPipelineTypes.h b/Source/Core/VideoCommon/GXPipelineTypes.h index ca3fb89701..b448dc107f 100644 --- a/Source/Core/VideoCommon/GXPipelineTypes.h +++ b/Source/Core/VideoCommon/GXPipelineTypes.h @@ -35,24 +35,6 @@ struct GXPipelineUid // and this map lookup can happen every draw call. However, as using memcmp() will also compare // any padding bytes, we have to ensure these are zeroed out. GXPipelineUid() { std::memset(static_cast(this), 0, sizeof(*this)); } -#ifdef _MSC_VER -#pragma warning(push) -// Disable warning for uninitialized member variables, as MSVC doesn't recognise that memcpy -// performs this initialization. -#pragma warning(disable : 26495) -#endif - GXPipelineUid(const GXPipelineUid& rhs) - { - std::memcpy(static_cast(this), &rhs, sizeof(*this)); - } -#ifdef _MSC_VER -#pragma warning(pop) -#endif - GXPipelineUid& operator=(const GXPipelineUid& rhs) - { - std::memcpy(static_cast(this), &rhs, sizeof(*this)); - return *this; - } bool operator<(const GXPipelineUid& rhs) const { return std::memcmp(this, &rhs, sizeof(*this)) < 0; @@ -74,23 +56,6 @@ struct GXUberPipelineUid BlendingState blending_state; GXUberPipelineUid() { std::memset(static_cast(this), 0, sizeof(*this)); } -#ifdef _MSC_VER -#pragma warning(push) -// Disable warning for uninitialized member variables -#pragma warning(disable : 26495) -#endif - GXUberPipelineUid(const GXUberPipelineUid& rhs) - { - std::memcpy(static_cast(this), &rhs, sizeof(*this)); - } -#ifdef _MSC_VER -#pragma warning(pop) -#endif - GXUberPipelineUid& operator=(const GXUberPipelineUid& rhs) - { - std::memcpy(static_cast(this), &rhs, sizeof(*this)); - return *this; - } bool operator<(const GXUberPipelineUid& rhs) const { return std::memcmp(this, &rhs, sizeof(*this)) < 0; diff --git a/Source/Core/VideoCommon/PostProcessing.cpp b/Source/Core/VideoCommon/PostProcessing.cpp index 69c3dcfa0c..d9f7a8e8c6 100644 --- a/Source/Core/VideoCommon/PostProcessing.cpp +++ b/Source/Core/VideoCommon/PostProcessing.cpp @@ -166,11 +166,11 @@ void PostProcessingConfiguration::LoadOptions(const std::string& code) option.m_dirty = true; if (it.m_type == "OptionBool") - option.m_type = ConfigurationOption::OptionType::OPTION_BOOL; + option.m_type = ConfigurationOption::OptionType::Bool; else if (it.m_type == "OptionRangeFloat") - option.m_type = ConfigurationOption::OptionType::OPTION_FLOAT; + option.m_type = ConfigurationOption::OptionType::Float; else if (it.m_type == "OptionRangeInteger") - option.m_type = ConfigurationOption::OptionType::OPTION_INTEGER; + option.m_type = ConfigurationOption::OptionType::Integer; for (const auto& string_option : it.m_options) { @@ -213,17 +213,17 @@ void PostProcessingConfiguration::LoadOptions(const std::string& code) output_float = &option.m_float_step_values; } - if (option.m_type == ConfigurationOption::OptionType::OPTION_BOOL) + if (option.m_type == ConfigurationOption::OptionType::Bool) { TryParse(string_option.second, &option.m_bool_value); } - else if (option.m_type == ConfigurationOption::OptionType::OPTION_INTEGER) + else if (option.m_type == ConfigurationOption::OptionType::Integer) { TryParseVector(string_option.second, output_integer); if (output_integer->size() > 4) output_integer->erase(output_integer->begin() + 4, output_integer->end()); } - else if (option.m_type == ConfigurationOption::OptionType::OPTION_FLOAT) + else if (option.m_type == ConfigurationOption::OptionType::Float) { TryParseVector(string_option.second, output_float); if (output_float->size() > 4) @@ -245,11 +245,11 @@ void PostProcessingConfiguration::LoadOptionsConfiguration() { switch (it.second.m_type) { - case ConfigurationOption::OptionType::OPTION_BOOL: + case ConfigurationOption::OptionType::Bool: ini.GetOrCreateSection(section)->Get(it.second.m_option_name, &it.second.m_bool_value, it.second.m_bool_value); break; - case ConfigurationOption::OptionType::OPTION_INTEGER: + case ConfigurationOption::OptionType::Integer: { std::string value; ini.GetOrCreateSection(section)->Get(it.second.m_option_name, &value); @@ -257,7 +257,7 @@ void PostProcessingConfiguration::LoadOptionsConfiguration() TryParseVector(value, &it.second.m_integer_values); } break; - case ConfigurationOption::OptionType::OPTION_FLOAT: + case ConfigurationOption::OptionType::Float: { std::string value; ini.GetOrCreateSection(section)->Get(it.second.m_option_name, &value); @@ -279,12 +279,12 @@ void PostProcessingConfiguration::SaveOptionsConfiguration() { switch (it.second.m_type) { - case ConfigurationOption::OptionType::OPTION_BOOL: + case ConfigurationOption::OptionType::Bool: { ini.GetOrCreateSection(section)->Set(it.second.m_option_name, it.second.m_bool_value); } break; - case ConfigurationOption::OptionType::OPTION_INTEGER: + case ConfigurationOption::OptionType::Integer: { std::string value; for (size_t i = 0; i < it.second.m_integer_values.size(); ++i) @@ -295,7 +295,7 @@ void PostProcessingConfiguration::SaveOptionsConfiguration() ini.GetOrCreateSection(section)->Set(it.second.m_option_name, value); } break; - case ConfigurationOption::OptionType::OPTION_FLOAT: + case ConfigurationOption::OptionType::Float: { std::ostringstream value; value.imbue(std::locale("C")); @@ -459,15 +459,14 @@ std::string PostProcessing::GetUniformBufferHeader() const // Custom options/uniforms for (const auto& it : m_config.GetOptions()) { - if (it.second.m_type == - PostProcessingConfiguration::ConfigurationOption::OptionType::OPTION_BOOL) + if (it.second.m_type == PostProcessingConfiguration::ConfigurationOption::OptionType::Bool) { ss << fmt::format(" int {};\n", it.first); for (u32 i = 0; i < 3; i++) ss << " int ubo_align_" << unused_counter++ << "_;\n"; } else if (it.second.m_type == - PostProcessingConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER) + PostProcessingConfiguration::ConfigurationOption::OptionType::Integer) { u32 count = static_cast(it.second.m_integer_values.size()); if (count == 1) @@ -479,7 +478,7 @@ std::string PostProcessing::GetUniformBufferHeader() const ss << " int ubo_align_" << unused_counter++ << "_;\n"; } else if (it.second.m_type == - PostProcessingConfiguration::ConfigurationOption::OptionType::OPTION_FLOAT) + PostProcessingConfiguration::ConfigurationOption::OptionType::Float) { u32 count = static_cast(it.second.m_float_values.size()); if (count == 1) @@ -707,17 +706,17 @@ void PostProcessing::FillUniformBuffer(const MathUtil::Rectangle& src, switch (it.second.m_type) { - case PostProcessingConfiguration::ConfigurationOption::OptionType::OPTION_BOOL: + case PostProcessingConfiguration::ConfigurationOption::OptionType::Bool: value.as_bool[0] = it.second.m_bool_value ? 1 : 0; break; - case PostProcessingConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER: + case PostProcessingConfiguration::ConfigurationOption::OptionType::Integer: ASSERT(it.second.m_integer_values.size() < 4); std::copy_n(it.second.m_integer_values.begin(), it.second.m_integer_values.size(), value.as_int); break; - case PostProcessingConfiguration::ConfigurationOption::OptionType::OPTION_FLOAT: + case PostProcessingConfiguration::ConfigurationOption::OptionType::Float: ASSERT(it.second.m_float_values.size() < 4); std::copy_n(it.second.m_float_values.begin(), it.second.m_float_values.size(), value.as_float); diff --git a/Source/Core/VideoCommon/PostProcessing.h b/Source/Core/VideoCommon/PostProcessing.h index aafee8f1f6..c7f94535f5 100644 --- a/Source/Core/VideoCommon/PostProcessing.h +++ b/Source/Core/VideoCommon/PostProcessing.h @@ -24,11 +24,11 @@ class PostProcessingConfiguration public: struct ConfigurationOption { - enum OptionType + enum class OptionType { - OPTION_BOOL = 0, - OPTION_FLOAT, - OPTION_INTEGER, + Bool = 0, + Float, + Integer, }; bool m_bool_value = false; @@ -45,7 +45,7 @@ public: std::vector m_float_step_values; std::vector m_integer_step_values; - OptionType m_type = OptionType::OPTION_BOOL; + OptionType m_type = OptionType::Bool; std::string m_gui_name; std::string m_option_name; diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index bdd585135b..11c255b3a7 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -569,7 +569,7 @@ void Renderer::DrawDebugText() ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoFocusOnAppearing)) { - ImGui::TextColored(ImVec4(0.0f, 1.0f, 1.0f, 1.0f), "FPS: %.2f", m_fps_counter.GetFPS()); + ImGui::TextColored(ImVec4(1.0f, 0.647f, 0.0f, 1.0f), "FPS: %.2f", m_fps_counter.GetFPS()); } ImGui::End(); } diff --git a/Source/Core/VideoCommon/ShaderGenCommon.h b/Source/Core/VideoCommon/ShaderGenCommon.h index edbd931db9..bec69fe7c0 100644 --- a/Source/Core/VideoCommon/ShaderGenCommon.h +++ b/Source/Core/VideoCommon/ShaderGenCommon.h @@ -4,6 +4,7 @@ #pragma once #include +#include #include #include #include diff --git a/Source/Core/VideoCommon/VertexLoaderX64.cpp b/Source/Core/VideoCommon/VertexLoaderX64.cpp index 40ae508219..7a4929361d 100644 --- a/Source/Core/VideoCommon/VertexLoaderX64.cpp +++ b/Source/Core/VideoCommon/VertexLoaderX64.cpp @@ -50,9 +50,8 @@ VertexLoaderX64::VertexLoaderX64(const TVtxDesc& vtx_desc, const VAT& vtx_att) GenerateVertexLoader(); WriteProtect(); - const std::string name = - fmt::format("VertexLoaderX64\nVtx desc: \n{}\nVAT:\n{}", vtx_desc, vtx_att); - JitRegister::Register(region, GetCodePtr(), name.c_str()); + JitRegister::Register(region, GetCodePtr(), "VertexLoaderX64\nVtx desc: \n{}\nVAT:\n{}", vtx_desc, + vtx_att); } OpArg VertexLoaderX64::GetVertexAddr(CPArray array, VertexComponentFormat attribute) diff --git a/Source/dolphin-emu.sln b/Source/dolphin-emu.sln index c61dea5263..ebcc5dd0a3 100644 --- a/Source/dolphin-emu.sln +++ b/Source/dolphin-emu.sln @@ -37,8 +37,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SoundTouch", "..\Externals\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mbedTLS", "..\Externals\mbedtls\mbedTLS.vcxproj", "{BDB6578B-0691-4E80-A46C-DF21639FD3B8}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SCMRevGen", "Core\Common\SCMRevGen.vcxproj", "{41279555-F94F-4EBC-99DE-AF863C10C5C4}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SFML_Network", "..\Externals\SFML\build\vc2010\SFML_Network.vcxproj", "{93D73454-2512-424E-9CDA-4BB357FE13DD}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libusb-1.0", "..\Externals\libusb\libusb-1.0.vcxproj", "{349EE8F9-7D25-4909-AAF5-FF3FADE72187}" @@ -77,6 +75,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zstd", "..\Externals\zstd\z EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mgba", "..\Externals\mGBA\mgba.vcxproj", "{864C4C8E-296D-3DBC-AD83-F1D5CB6E8EC6}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SCMRevGen", "Core\Common\SCMRevGen.vcxproj", "{41279555-F94F-4EBC-99DE-AF863C10C5C4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 @@ -209,14 +209,6 @@ Global {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|ARM64.Build.0 = Release|ARM64 {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|x64.ActiveCfg = Release|x64 {BDB6578B-0691-4E80-A46C-DF21639FD3B8}.Release|x64.Build.0 = Release|x64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|ARM64.Build.0 = Debug|ARM64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.ActiveCfg = Debug|x64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.Build.0 = Debug|x64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|ARM64.ActiveCfg = Release|ARM64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|ARM64.Build.0 = Release|ARM64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.ActiveCfg = Release|x64 - {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.Build.0 = Release|x64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|ARM64.ActiveCfg = Debug|ARM64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|ARM64.Build.0 = Debug|ARM64 {93D73454-2512-424E-9CDA-4BB357FE13DD}.Debug|x64.ActiveCfg = Debug|x64 @@ -369,6 +361,14 @@ Global {864C4C8E-296D-3DBC-AD83-F1D5CB6E8EC6}.Release|ARM64.Build.0 = Release|ARM64 {864C4C8E-296D-3DBC-AD83-F1D5CB6E8EC6}.Release|x64.ActiveCfg = Release|x64 {864C4C8E-296D-3DBC-AD83-F1D5CB6E8EC6}.Release|x64.Build.0 = Release|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|ARM64.Build.0 = Debug|ARM64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.ActiveCfg = Debug|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Debug|x64.Build.0 = Debug|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|ARM64.ActiveCfg = Release|ARM64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|ARM64.Build.0 = Release|ARM64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.ActiveCfg = Release|x64 + {41279555-F94F-4EBC-99DE-AF863C10C5C4}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE