mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-22 03:09:15 +01:00
Update to r1272
This commit is contained in:
parent
92af55325c
commit
8172a19c42
@ -2,8 +2,8 @@
|
||||
<app version="1">
|
||||
<name> USB Loader GX</name>
|
||||
<coder>USB Loader GX Team</coder>
|
||||
<version>3.0 r1267</version>
|
||||
<release_date>20171214150718</release_date>
|
||||
<version>3.0 r1272</version>
|
||||
<release_date>20190615140527</release_date>
|
||||
<!-- // remove this line to enable arguments
|
||||
<arguments>
|
||||
<arg>--ios=250</arg>
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: David Jelinek (djelinek@hotmail.com) e->e,r->r,u->u, c->c \n"
|
||||
"Language-Team: r1056 - last version on http://djelinek.sweb.cz/_USBLoderGX/czech.lang \n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D Obaly"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Pouze dospelí 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 minut"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: Fox888[dk]\n"
|
||||
"Language-Team: [dk]\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D-Covers"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Voksne 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 min."
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D Hoesjes"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Volwassen 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "Dit spel heeft meerdere disks. Geef aub aan welke er gestart dient te worden."
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "Dit pad moet op de SD kaart zijn!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@ -101,6 +101,9 @@ msgstr ""
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr ""
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: c64rmx\n"
|
||||
"Language-Team: \n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D Kannet"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (K18)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
# USB Loader GX language source file.
|
||||
# French.lang - r1267
|
||||
# French.lang - r1272
|
||||
# don't delete/change this line (é).
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: Cyan\n"
|
||||
"Language-Team: Badablek, Amour, ikya, Cyan & Kin8\n"
|
||||
@ -101,6 +101,9 @@ msgstr "Jaquettes 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Adultes 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 min."
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr "Cette version de Nintendont n'est pas correctement supportée. Démarrag
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "Ce jeu a plusieurs disques, choisissez celui que vous souhaitez lancer."
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr "Ce patch pourrait ne pas fonctionner avec tous les jeux. Si un jeu ne démarre pas, désactivez le dans le menu des options individuelles du jeu."
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "Ce chemin doit être situé sur la carte SD !"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2010-07-03 17:35-0800\n"
|
||||
"Last-Translator: Sabykos\n"
|
||||
"Language-Team: Bertilax, Snoozer, wishmasterf, ZEN.13, TheRealVisitor\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D Cover"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Erwachsene 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 Minuten"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "Dieses Spiel hat mehrere Disks. Bitte wähle, welche Disk gestartet werden soll."
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "Dieser Pfad muss auf der SD sein!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"Last-Translator: nakata6790\n"
|
||||
"Language-Team: nakata6790 (aka0107@gmail.com)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -100,6 +100,9 @@ msgstr "Åîþöõëëá 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Ìïíï ãéá åíÞëéêåò 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 ëåðôÜ"
|
||||
|
||||
@ -2115,6 +2118,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "Ôï ìïíïðÜôé áõôü ðñÝðåé íá êáôåõèýíåé óå áñ÷åßï óôçí êÜñôá SD!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-12-29 11:05+0100\n"
|
||||
"Last-Translator: Springdale\n"
|
||||
"Language-Team: Tusk, Springdale\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D Borítók"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Felnõtteknek 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 perc"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-10-19 14:43+0200\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2011-09-11 12:19+0100\n"
|
||||
"Last-Translator: Zonta85\n"
|
||||
"Language-Team: Zonta85 (zonta_85@hotmail.it)\n"
|
||||
@ -101,6 +101,9 @@ msgstr "Copertine 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Maggiorenni 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 minuti"
|
||||
|
||||
@ -1301,7 +1304,7 @@ msgstr "Luglio"
|
||||
msgid "June"
|
||||
msgstr "Giugno"
|
||||
|
||||
msgid"KPAD Read"
|
||||
msgid "KPAD Read"
|
||||
msgstr "KPAD Read"
|
||||
|
||||
msgid "Keyboard"
|
||||
@ -2116,6 +2119,9 @@ msgstr "Questa versione di Nintendont non è correttamente supportata. Autoboot
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "Questo gioco contiene più di un disco. Selezione quello da avviare."
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "Questo percorso deve essere sulla SD!"
|
||||
|
||||
@ -2495,11 +2501,11 @@ msgstr "di"
|
||||
msgid "seconds left"
|
||||
msgstr "secondi rimasti"
|
||||
|
||||
msgid "Plugins Default Partition"
|
||||
msgstr "Partizione predefinita Plugins"
|
||||
#~ msgid "Plugins Default Partition"
|
||||
#~ msgstr "Partizione predefinita Plugins"
|
||||
|
||||
msgid "Plugin Files Path"
|
||||
msgstr "Percorso files Plugin"
|
||||
#~ msgid "Plugin Files Path"
|
||||
#~ msgstr "Percorso files Plugin"
|
||||
|
||||
#~ msgid "Install WAD to EmuNand"
|
||||
#~ msgstr "Installa WAD nella NAND emulata"
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:02+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: hosigumayuugi\n"
|
||||
"Language-Team: hosigumayuugi\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3Dカバー"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "CERO Zを制限"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5分"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "このパスはSDにないといけません!"
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: raschi\n"
|
||||
"Language-Team: raschi\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D cover"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Voksen 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: ziom666 (zadania_prog@vp.pl)\n"
|
||||
"Language-Team: \n"
|
||||
@ -101,6 +101,9 @@ msgstr "Okladki 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (tylko dla doroslych 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 16:05+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2011-11-03 11:00+0000\n"
|
||||
"Last-Translator: Codemaster(TheCodemastr) <javafangamers@hotmail.com>\n"
|
||||
"Language-Team: Sky8000, pplucky\n"
|
||||
@ -101,6 +101,9 @@ msgstr "Capas 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Adultos 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr "Essa versão do Nintendont não é suportada. Auto boot desativado"
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "Esse jogo utiliza vários discos. Escolha o disco a iniciar"
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "Essa pasta precisa estar no Cartão SD!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2011-11-03 11:00+0000\n"
|
||||
"Last-Translator: pplucky <pplucky@gmail.com>\n"
|
||||
"Language-Team: Sky8000, pplucky\n"
|
||||
@ -101,6 +101,9 @@ msgstr "Capas 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Adultos 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 minutos"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: nikolai_ca\n"
|
||||
"Language-Team: Kir, alendit, nikolai_ca\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D Обложки"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Взрослые 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 мин."
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2013-08-13 07:03+0800\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: oCameLo\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D 封面"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (18 岁以上成人)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 分钟"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "该游戏有多张光盘。请选择想要加载的光盘。"
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "该路径必须位于 SD 卡!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2011-07-25 16:40+0200\n"
|
||||
"Last-Translator: Galen/xFede\n"
|
||||
"Language-Team: Penn, SirPalax, hvy109\n"
|
||||
@ -101,6 +101,9 @@ msgstr "Carátulas 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Sólo Adultos 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 min."
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr "Esta versión de Nintendont no es soportada. El autoarranque será desac
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "Este juego posee varios discos. Por favor, elige el que deseas cargar."
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "¡Esta ruta debe ser en la SD!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2010-01-19 17:39+0200\n"
|
||||
"Last-Translator: Katsurou\n"
|
||||
"Language-Team: Katsurou, pirateX\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D-Omslag"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Endast Vuxna 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr ""
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2010-02-15 21:00+0800\n"
|
||||
"Last-Translator: Jane.H\n"
|
||||
"Language-Team: kyogc, Miller, Mika Li, Jane.H\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3D 封面"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (18歲以上成人)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 分鐘"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr "此遊戲為多重光碟。請選擇光碟啟動。"
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr "此路徑必須是在SD卡上!"
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: Nitro_subzero \n"
|
||||
"Language-Team: Nitro_subzero\n"
|
||||
@ -101,6 +101,9 @@ msgstr "หน้าปก 3D"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (เฉพาะผู้ใหญ่ 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 นาที"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: USB Loader GX\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-12-14 15:50+0100\n"
|
||||
"POT-Creation-Date: 2019-06-15 16:05+0200\n"
|
||||
"PO-Revision-Date: 2009-10-01 01:00+0200\n"
|
||||
"Last-Translator: omercigingelini\n"
|
||||
"Language-Team: omercigingelini\n"
|
||||
@ -101,6 +101,9 @@ msgstr "3B Kapaklar"
|
||||
msgid "4 (Adults Only 18+)"
|
||||
msgstr "4 (Sadece Yetişkin 18+)"
|
||||
|
||||
msgid "480p Pixel Fix Patch"
|
||||
msgstr ""
|
||||
|
||||
msgid "5 min"
|
||||
msgstr "5 dakika"
|
||||
|
||||
@ -2116,6 +2119,9 @@ msgstr ""
|
||||
msgid "This game has multiple discs. Please select the disc to launch."
|
||||
msgstr ""
|
||||
|
||||
msgid "This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."
|
||||
msgstr ""
|
||||
|
||||
msgid "This path must be on SD!"
|
||||
msgstr ""
|
||||
|
||||
|
7
Makefile
7
Makefile
@ -59,7 +59,7 @@ INCLUDES := source
|
||||
# Default cIOS to load into to load the settings
|
||||
#---------------------------------------------------------------------------------
|
||||
ifndef $(IOS)
|
||||
IOS = 249
|
||||
IOS = 58
|
||||
endif
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
@ -67,7 +67,7 @@ endif
|
||||
#---------------------------------------------------------------------------------
|
||||
CFLAGS = -g -ggdb -O3 -Wall -Wno-multichar -Wno-unused-parameter -Wextra $(MACHDEP) $(INCLUDE) -D_GNU_SOURCE -DBUILD_IOS=$(IOS)
|
||||
CXXFLAGS = $(CFLAGS)
|
||||
LDFLAGS = -g -ggdb $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,wiiuse_register
|
||||
LDFLAGS = -g -ggdb $(MACHDEP) -Wl,-Map,$(notdir $@).map,--section-start,.init=0x80B00000,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size
|
||||
|
||||
ifeq ($(BUILDMODE),channel)
|
||||
CFLAGS += -DFULLCHANNEL
|
||||
@ -78,7 +78,7 @@ endif
|
||||
# any extra libraries we wish to link with the project
|
||||
#---------------------------------------------------------------------------------
|
||||
LIBS := -lcustomfat -lcustomntfs -lcustomext2fs -lvorbisidec -lmad -lfreetype \
|
||||
-lgd -ljpeg -lpng -lzip -lm -lz -lwiiuse -lwupc -lbte -lasnd -logc
|
||||
-lgd -ljpeg -lpng -lzip -lm -lz -lwiiuse -lwiidrc -lbte -lasnd -logc -lruntimeiospatch
|
||||
#---------------------------------------------------------------------------------
|
||||
# list of directories containing libraries, this must be the top level containing
|
||||
# include and lib
|
||||
@ -145,6 +145,7 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||
#---------------------------------------------------------------------------------
|
||||
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -L$(CURDIR)/source/libs/libfat/ \
|
||||
-L$(CURDIR)/source/libs/libntfs/ -L$(CURDIR)/source/libs/libext2fs/ \
|
||||
-L$(CURDIR)/source/libs/libruntimeiospatch/ -L$(CURDIR)/source/libs/libdrc/ \
|
||||
-L$(LIBOGC_LIB) -L$(PORTLIBS)/lib
|
||||
|
||||
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||
|
@ -87,7 +87,7 @@ BoxCover::~BoxCover()
|
||||
//! Remove me later
|
||||
void BoxCover::WiiPADControl(GuiTrigger *t)
|
||||
{
|
||||
if((t->wpad.btns_d & WPAD_BUTTON_A) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A) || (t->wupcdata.btns_h & WPAD_CLASSIC_BUTTON_A) || (t->pad.btns_h & PAD_BUTTON_A))
|
||||
if((t->wpad.btns_d & WPAD_BUTTON_A) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A) || (t->pad.btns_h & PAD_BUTTON_A))
|
||||
{
|
||||
if(t->wpad.ir.valid)
|
||||
{
|
||||
@ -128,13 +128,13 @@ void BoxCover::WiiPADControl(GuiTrigger *t)
|
||||
else
|
||||
moveChan = -1;
|
||||
}
|
||||
else if(((t->wpad.btns_h & WPAD_BUTTON_A) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A) || (t->wupcdata.btns_h & WPAD_CLASSIC_BUTTON_A) || (t->pad.btns_h & PAD_BUTTON_A)) && moveChan == t->chan && t->wpad.ir.valid && !effects)
|
||||
else if(((t->wpad.btns_h & WPAD_BUTTON_A) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A) || (t->pad.btns_h & PAD_BUTTON_A)) && moveChan == t->chan && t->wpad.ir.valid && !effects)
|
||||
{
|
||||
movePosX = (t->wpad.ir.x-moveStartPosX) * fabs(PosZ)/3400.f;
|
||||
movePosY = (moveStartPosY-t->wpad.ir.y) * fabs(PosZ)/3400.f;
|
||||
last_manual_move_frame = frameCount;
|
||||
}
|
||||
else if(!(t->wpad.btns_h & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A) && !(t->wupcdata.btns_h & WPAD_CLASSIC_BUTTON_A) && !(t->pad.btns_h & PAD_BUTTON_A) && moveChan == t->chan)
|
||||
else if(!(t->wpad.btns_h & WPAD_BUTTON_A) && !(t->wpad.btns_h & WPAD_CLASSIC_BUTTON_A) && !(t->pad.btns_h & PAD_BUTTON_A) && moveChan == t->chan)
|
||||
{
|
||||
if(moveChan >= 0 && moveChan < 4)
|
||||
{
|
||||
@ -144,27 +144,27 @@ void BoxCover::WiiPADControl(GuiTrigger *t)
|
||||
}
|
||||
}
|
||||
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_UP) || (t->pad.substickY > PADCAL) || (t->wupcdata.substickY > WUPCCAL))
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_UP) || (t->pad.substickY > PADCAL) )
|
||||
{
|
||||
RotX -= 2.0f;
|
||||
last_manual_move_frame = frameCount;
|
||||
}
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_DOWN) || (t->pad.substickY < -PADCAL) || (t->wupcdata.substickY < -WUPCCAL))
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_DOWN) || (t->pad.substickY < -PADCAL) )
|
||||
{
|
||||
RotX += 2.0f;
|
||||
last_manual_move_frame = frameCount;
|
||||
}
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_LEFT) || (t->pad.substickX < -PADCAL) || (t->wupcdata.substickX < -WUPCCAL))
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_LEFT) || (t->pad.substickX < -PADCAL) )
|
||||
{
|
||||
RotY -= 2.0f;
|
||||
last_manual_move_frame = frameCount;
|
||||
}
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_RIGHT) || (t->pad.substickX > PADCAL) || (t->wupcdata.substickX > WUPCCAL))
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_RIGHT) || (t->pad.substickX > PADCAL) )
|
||||
{
|
||||
RotY += 2.0f;
|
||||
last_manual_move_frame = frameCount;
|
||||
}
|
||||
if((t->wpad.btns_d & WPAD_BUTTON_2) || (t->pad.btns_d & PAD_BUTTON_X) || (t->wpad.btns_d & WPAD_CLASSIC_BUTTON_X) || (t->wupcdata.btns_d & WPAD_CLASSIC_BUTTON_X))
|
||||
if((t->wpad.btns_d & WPAD_BUTTON_2) || (t->pad.btns_d & PAD_BUTTON_X) || (t->wpad.btns_d & WPAD_CLASSIC_BUTTON_X) )
|
||||
{
|
||||
if(RotY < 180.0f)
|
||||
SetEffect(EFFECT_BOX_ROTATE_X, 10, 180);
|
||||
@ -172,12 +172,12 @@ void BoxCover::WiiPADControl(GuiTrigger *t)
|
||||
SetEffect(EFFECT_BOX_ROTATE_X, -10, -180);
|
||||
last_manual_move_frame = frameCount;
|
||||
}
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_PLUS) || (t->pad.btns_h & PAD_TRIGGER_R) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_FULL_R) || (t->wupcdata.btns_h & WPAD_CLASSIC_BUTTON_FULL_R))
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_PLUS) || (t->pad.btns_h & PAD_TRIGGER_R) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_FULL_R) )
|
||||
{
|
||||
if(PosZ < -2.8f)
|
||||
PosZ += 0.4f*fabs(PosZ)/19.f;
|
||||
}
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_MINUS) || (t->pad.btns_h & PAD_TRIGGER_L) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_FULL_L) || (t->wupcdata.btns_h & WPAD_CLASSIC_BUTTON_FULL_L))
|
||||
if((t->wpad.btns_h & WPAD_BUTTON_MINUS) || (t->pad.btns_h & PAD_TRIGGER_L) || (t->wpad.btns_h & WPAD_CLASSIC_BUTTON_FULL_L) )
|
||||
{
|
||||
if(PosZ > -43.0f)
|
||||
PosZ -= 0.4f*fabs(PosZ)/19.f;
|
||||
|
@ -375,7 +375,7 @@ int PartitionHandle::CheckGPT(u8 PartNum)
|
||||
|
||||
bool bootable = (memcmp(part_entry->part_type_guid, TYPE_BIOS, 16) == 0);
|
||||
|
||||
AddPartition("GUID-Entry", le64(part_entry->part_first_lba), le64(part_entry->part_last_lba), bootable, PARTITION_TYPE_GPT, PartNum, GPT);
|
||||
AddPartition("GUID-Entry", le64(part_entry->part_first_lba), le64(part_entry->part_last_lba), bootable, PARTITION_TYPE_GPT, i, GPT);
|
||||
}
|
||||
|
||||
next_lba++;
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "video.h"
|
||||
#include "input.h"
|
||||
|
||||
extern bool isWiiVC; // in sys.cpp
|
||||
|
||||
Mtx44 WiiPointer::projection;
|
||||
|
||||
@ -66,50 +67,32 @@ void WiiPointer::Draw(GuiTrigger *t)
|
||||
else
|
||||
{
|
||||
angle = 0.0f;
|
||||
|
||||
// dynamic deadzone value required for WiiU gamepad when using Virtual Console Wii channels. Fixes diagonal sticks.
|
||||
// dirty fix. could be in input.h ?
|
||||
u8 deadzone = isWiiVC ? 20 : PADCAL;
|
||||
|
||||
// GC PAD
|
||||
// x-axis
|
||||
if(t->pad.stickX < -PADCAL)
|
||||
if(t->pad.stickX < -deadzone)
|
||||
{
|
||||
posX += (t->pad.stickX + PADCAL) * Settings.PointerSpeed;
|
||||
posX += (t->pad.stickX + deadzone) * Settings.PointerSpeed;
|
||||
lastActivity = 0;
|
||||
}
|
||||
else if(t->pad.stickX > PADCAL)
|
||||
else if(t->pad.stickX > deadzone)
|
||||
{
|
||||
posX += (t->pad.stickX - PADCAL) * Settings.PointerSpeed;
|
||||
posX += (t->pad.stickX - deadzone) * Settings.PointerSpeed;
|
||||
lastActivity = 0;
|
||||
}
|
||||
// y-axis
|
||||
if(t->pad.stickY < -PADCAL)
|
||||
if(t->pad.stickY < -deadzone)
|
||||
{
|
||||
posY -= (t->pad.stickY + PADCAL) * Settings.PointerSpeed;
|
||||
posY -= (t->pad.stickY + deadzone) * Settings.PointerSpeed;
|
||||
lastActivity = 0;
|
||||
}
|
||||
else if(t->pad.stickY > PADCAL)
|
||||
else if(t->pad.stickY > deadzone)
|
||||
{
|
||||
posY -= (t->pad.stickY - PADCAL) * Settings.PointerSpeed;
|
||||
lastActivity = 0;
|
||||
}
|
||||
|
||||
//Wii u pro x-axis
|
||||
if(t->wupcdata.stickX < -WUPCCAL)
|
||||
{
|
||||
posX += (t->wupcdata.stickX + WUPCCAL) * Settings.PointerSpeed/8;
|
||||
lastActivity = 0;
|
||||
}
|
||||
else if(t->wupcdata.stickX > WUPCCAL)
|
||||
{
|
||||
posX += (t->wupcdata.stickX - WUPCCAL) * Settings.PointerSpeed/8;
|
||||
lastActivity = 0;
|
||||
}
|
||||
//Wii u pro y-axis
|
||||
if(t->wupcdata.stickY < -WUPCCAL)
|
||||
{
|
||||
posY -= (t->wupcdata.stickY + WUPCCAL) * Settings.PointerSpeed/8;
|
||||
lastActivity = 0;
|
||||
}
|
||||
else if(t->wupcdata.stickY > WUPCCAL)
|
||||
{
|
||||
posY -= (t->wupcdata.stickY - WUPCCAL) * Settings.PointerSpeed/8;
|
||||
posY -= (t->pad.stickY - deadzone) * Settings.PointerSpeed;
|
||||
lastActivity = 0;
|
||||
}
|
||||
|
||||
@ -140,7 +123,7 @@ void WiiPointer::Draw(GuiTrigger *t)
|
||||
lastActivity = 0;
|
||||
}
|
||||
|
||||
if(t->pad.btns_h || t->wpad.btns_h || t->wupcdata.btns_h)
|
||||
if(t->pad.btns_h || t->wpad.btns_h)
|
||||
lastActivity = 0;
|
||||
|
||||
posX = LIMIT(posX, -50.0f, screenwidth+50.0f);
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <math.h>
|
||||
#include <asndlib.h>
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <wupc/wupc.h>
|
||||
#include "gui_imagedata.h"
|
||||
#include "FreeTypeGX.h"
|
||||
#include "video.h"
|
||||
@ -108,15 +107,6 @@ typedef struct _paddata
|
||||
u8 triggerR;
|
||||
} PADData;
|
||||
|
||||
typedef struct _wupcfulldata {
|
||||
u32 btns_d;
|
||||
u32 btns_u;
|
||||
u32 btns_h;
|
||||
s16 stickX;
|
||||
s16 stickY;
|
||||
s16 substickX;
|
||||
s16 substickY;
|
||||
} WUPCFULLData;
|
||||
|
||||
#define EFFECT_SLIDE_TOP 1
|
||||
#define EFFECT_SLIDE_BOTTOM 2
|
||||
@ -175,7 +165,6 @@ class GuiTrigger
|
||||
u8 type; //!< trigger type (TRIGGER_SIMPLE, TRIGGER_HELD, TRIGGER_BUTTON_ONLY)
|
||||
s32 chan; //!< Trigger controller channel (0-3, -1 for all)
|
||||
WPADData wpad; //!< Wii controller trigger data
|
||||
WUPCFULLData wupcdata;//!< Wii U pro controller trigger data
|
||||
PADData pad; //!< GameCube controller trigger data
|
||||
};
|
||||
|
||||
|
@ -444,7 +444,7 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
// button triggers
|
||||
if (this->IsClickable() && scrollison == 0)
|
||||
{
|
||||
s32 wm_btns, wm_btns_trig, cc_btns, cc_btns_trig, wupc_btns, wupc_btns_trig;
|
||||
s32 wm_btns, wm_btns_trig, cc_btns, cc_btns_trig;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
if (trigger[i] && (trigger[i]->chan == -1 || trigger[i]->chan == t->chan))
|
||||
@ -457,15 +457,9 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
cc_btns = t->wpad.btns_d >> 16;
|
||||
cc_btns_trig = trigger[i]->wpad.btns_d >> 16;
|
||||
|
||||
// lower 16 bits only (WiiU Pro controller)
|
||||
wupc_btns = t->wupcdata.btns_d >> 16;
|
||||
wupc_btns_trig = trigger[i]->wupcdata.btns_d >> 16;
|
||||
|
||||
|
||||
if( ((t->wpad.btns_d > 0 && wm_btns == wm_btns_trig)
|
||||
|| (t->wpad.exp.type == WPAD_EXP_CLASSIC && cc_btns == cc_btns_trig))
|
||||
|| (t->pad.btns_d > 0 && t->pad.btns_d == trigger[i]->pad.btns_d)
|
||||
|| (t->wupcdata.btns_d > 0 && wupc_btns == wupc_btns_trig))
|
||||
|| (t->pad.btns_d > 0 && t->pad.btns_d == trigger[i]->pad.btns_d))
|
||||
{
|
||||
if (t->chan == stateChan || stateChan == -1)
|
||||
{
|
||||
@ -489,7 +483,7 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
if (this->IsHoldable())
|
||||
{
|
||||
bool held = false;
|
||||
s32 wm_btns, wm_btns_h, wm_btns_trig, cc_btns, cc_btns_h, cc_btns_trig, wupc_btns, wupc_btns_h, wupc_btns_trig;
|
||||
s32 wm_btns, wm_btns_h, wm_btns_trig, cc_btns, cc_btns_h, cc_btns_trig;
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
@ -505,15 +499,9 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
cc_btns_h = t->wpad.btns_h >> 16;
|
||||
cc_btns_trig = trigger[i]->wpad.btns_h >> 16;
|
||||
|
||||
// lower 16 bits only (WiiU Pro controller)
|
||||
wupc_btns = t->wupcdata.btns_d >> 16;
|
||||
wupc_btns_h = t->wupcdata.btns_h >> 16;
|
||||
wupc_btns_trig = trigger[i]->wupcdata.btns_h >> 16;
|
||||
|
||||
if( (t->wpad.btns_d > 0 && wm_btns == wm_btns_trig)
|
||||
|| (t->wpad.exp.type == WPAD_EXP_CLASSIC && cc_btns == cc_btns_trig)
|
||||
|| (t->pad.btns_d > 0 && t->pad.btns_d == trigger[i]->pad.btns_d)
|
||||
|| (t->wupcdata.btns_d > 0 && wupc_btns == wupc_btns_trig))
|
||||
|| (t->pad.btns_d > 0 && t->pad.btns_d == trigger[i]->pad.btns_d))
|
||||
{
|
||||
if (trigger[i]->type == TRIGGER_HELD && state == STATE_SELECTED && (t->chan == stateChan || stateChan == -1))
|
||||
this->SetState(STATE_CLICKED, t->chan);
|
||||
@ -522,7 +510,6 @@ void GuiButton::Update(GuiTrigger * t)
|
||||
if( (t->wpad.btns_h > 0 && wm_btns_h == wm_btns_trig)
|
||||
|| (t->wpad.exp.type == WPAD_EXP_CLASSIC && cc_btns_h == cc_btns_trig)
|
||||
|| (t->pad.btns_h > 0 && t->pad.btns_h == trigger[i]->pad.btns_h)
|
||||
|| (t->wupcdata.btns_h > 0 && wupc_btns_h == wupc_btns_trig)
|
||||
)
|
||||
{
|
||||
if (trigger[i]->type == TRIGGER_HELD)
|
||||
|
@ -187,13 +187,12 @@ void GuiCheckboxBrowser::Update(GuiTrigger *t)
|
||||
|
||||
if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT |
|
||||
WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) ||
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)) ||
|
||||
(t->wupcdata.btns_d & (WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)))
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)))
|
||||
pressedChan = t->chan;
|
||||
|
||||
for(u32 i = 0; i < checkBoxDrawn.size(); i++)
|
||||
{
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h && !t->wupcdata.btns_h))
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h))
|
||||
{
|
||||
if(i != (u32) selectedItem && checkBoxDrawn[i]->GetState() == STATE_SELECTED) {
|
||||
textLineList[i]->SetMaxWidth(maxTextWidth, DOTTED);
|
||||
@ -214,7 +213,7 @@ void GuiCheckboxBrowser::Update(GuiTrigger *t)
|
||||
markImg->SetPosition(5, 15+i*(checkBoxDrawn[i]->GetHeight()+6)+(checkBoxDrawn[i]->GetHeight()-markImg->GetHeight())/2);
|
||||
}
|
||||
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h && !t->wupcdata.btns_d && !t->wupcdata.btns_h)
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h)
|
||||
pressedChan = -1;
|
||||
|
||||
scrollBar.SetPageSize(checkBoxDrawn.size());
|
||||
|
@ -184,14 +184,13 @@ void GuiFileBrowser::Update(GuiTrigger * t)
|
||||
|
||||
if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT |
|
||||
WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) ||
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)) ||
|
||||
(t->wupcdata.btns_d & (WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)))
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)))
|
||||
pressedChan = t->chan;
|
||||
|
||||
if(browser->browserList.size() > FILEBROWSERSIZE)
|
||||
scrollBar.Update(t);
|
||||
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h && !t->wupcdata.btns_h))
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h))
|
||||
{
|
||||
for (int i = 0; i < FILEBROWSERSIZE; i++)
|
||||
{
|
||||
@ -208,7 +207,7 @@ void GuiFileBrowser::Update(GuiTrigger * t)
|
||||
}
|
||||
|
||||
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h && !t->wupcdata.btns_d && !t->wupcdata.btns_h)
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h)
|
||||
pressedChan = -1;
|
||||
|
||||
scrollBar.SetPageSize(FILEBROWSERSIZE);
|
||||
|
@ -337,7 +337,7 @@ void GuiGameCarousel::Update(GuiTrigger * t)
|
||||
// Left/Right Navigation
|
||||
if (btnLeft->GetState() == STATE_CLICKED)
|
||||
{
|
||||
u32 buttons = t->wpad.btns_h | t->wupcdata.btns_h;
|
||||
u32 buttons = t->wpad.btns_h;
|
||||
u32 buttonsPAD = t->pad.btns_h;
|
||||
if (!((buttons & WPAD_BUTTON_A) || (buttons & WPAD_BUTTON_MINUS) ||
|
||||
(buttons & WPAD_CLASSIC_BUTTON_A) || (buttons & WPAD_CLASSIC_BUTTON_MINUS) ||
|
||||
@ -353,7 +353,7 @@ void GuiGameCarousel::Update(GuiTrigger * t)
|
||||
}
|
||||
else if (btnRight->GetState() == STATE_CLICKED)
|
||||
{
|
||||
u32 buttons = t->wpad.btns_h | t->wupcdata.btns_h;
|
||||
u32 buttons = t->wpad.btns_h;
|
||||
u32 buttonsPAD = t->pad.btns_h;
|
||||
if (!((buttons & WPAD_BUTTON_A) || (buttons & WPAD_BUTTON_PLUS) ||
|
||||
(buttons & WPAD_CLASSIC_BUTTON_A) || (buttons & WPAD_CLASSIC_BUTTON_PLUS) ||
|
||||
|
@ -472,7 +472,7 @@ void GuiGameGrid::Update(GuiTrigger * t)
|
||||
|
||||
if (btnLeft->GetState() == STATE_CLICKED)
|
||||
{
|
||||
u32 buttons = t->wpad.btns_h | t->wupcdata.btns_h;
|
||||
u32 buttons = t->wpad.btns_h;
|
||||
u32 buttonsPAD = t->pad.btns_h;
|
||||
if (!((buttons & WPAD_BUTTON_A) || (buttons & WPAD_BUTTON_MINUS) ||
|
||||
(buttons & WPAD_CLASSIC_BUTTON_A) || (buttons & WPAD_CLASSIC_BUTTON_MINUS) ||
|
||||
@ -488,7 +488,7 @@ void GuiGameGrid::Update(GuiTrigger * t)
|
||||
}
|
||||
else if (btnRight->GetState() == STATE_CLICKED)
|
||||
{
|
||||
u32 buttons = t->wpad.btns_h | t->wupcdata.btns_h;
|
||||
u32 buttons = t->wpad.btns_h;
|
||||
u32 buttonsPAD = t->pad.btns_h;
|
||||
if (!((buttons & WPAD_BUTTON_A) || (buttons & WPAD_BUTTON_PLUS) ||
|
||||
(buttons & WPAD_CLASSIC_BUTTON_A) || (buttons & WPAD_CLASSIC_BUTTON_PLUS) ||
|
||||
|
@ -258,14 +258,13 @@ void GuiGameList::Update(GuiTrigger * t)
|
||||
|
||||
if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT |
|
||||
WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) ||
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)) ||
|
||||
(t->wupcdata.btns_d & (WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)))
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)))
|
||||
pressedChan = t->chan;
|
||||
|
||||
// update the location of the scroll box based on the position in the option list
|
||||
scrollBar.Update(t);
|
||||
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h && !t->wupcdata.btns_h))
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h))
|
||||
{
|
||||
for (int i = 0, next = listOffset; i < pagesize; ++i, ++next)
|
||||
{
|
||||
@ -284,7 +283,7 @@ void GuiGameList::Update(GuiTrigger * t)
|
||||
}
|
||||
}
|
||||
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h && !t->wupcdata.btns_d && !t->wupcdata.btns_h)
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h)
|
||||
pressedChan = -1;
|
||||
|
||||
scrollBar.SetPageSize(pagesize);
|
||||
|
@ -227,14 +227,13 @@ void GuiOptionBrowser::Update(GuiTrigger * t)
|
||||
|
||||
if((t->wpad.btns_d & (WPAD_BUTTON_B | WPAD_BUTTON_DOWN | WPAD_BUTTON_UP | WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT |
|
||||
WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)) ||
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)) ||
|
||||
(t->wupcdata.btns_d & (WPAD_CLASSIC_BUTTON_B | WPAD_CLASSIC_BUTTON_UP | WPAD_CLASSIC_BUTTON_DOWN | WPAD_CLASSIC_BUTTON_LEFT | WPAD_CLASSIC_BUTTON_RIGHT)))
|
||||
(t->pad.btns_d & (PAD_BUTTON_UP | PAD_BUTTON_DOWN)))
|
||||
pressedChan = t->chan;
|
||||
|
||||
// update the location of the scroll box based on the position in the option list
|
||||
scrollBar.Update(t);
|
||||
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h && !t->wupcdata.btns_h))
|
||||
if(pressedChan == -1 || (!t->wpad.btns_h && !t->pad.btns_h))
|
||||
{
|
||||
for(int i = 0; i < listSize; i++)
|
||||
{
|
||||
@ -254,7 +253,7 @@ void GuiOptionBrowser::Update(GuiTrigger * t)
|
||||
}
|
||||
}
|
||||
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h && !t->wupcdata.btns_d && !t->wupcdata.btns_h)
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h)
|
||||
pressedChan = -1;
|
||||
|
||||
if(selectedItem != oldSelectedItem)
|
||||
|
@ -439,7 +439,7 @@ void GuiScrollbar::ScrollByButton(GuiTrigger *t)
|
||||
if(!t->wpad.ir.valid || ScrollState < ButtonScrollSpeed-ButtonScrollSpeed*fabs(pressedPosition-t->wpad.ir.y)/250.f)
|
||||
return;
|
||||
|
||||
if(pressedChan == -1 && ((t->wpad.btns_d & ButtonScroll) || (t->wupcdata.btns_d & ButtonScroll) ) &&
|
||||
if(pressedChan == -1 && (t->wpad.btns_d & ButtonScroll) &&
|
||||
parentElement && parentElement->IsInside(t->wpad.ir.x, t->wpad.ir.y))
|
||||
{
|
||||
pressedPosition = t->wpad.ir.y;
|
||||
@ -447,7 +447,7 @@ void GuiScrollbar::ScrollByButton(GuiTrigger *t)
|
||||
oneButtonScrollImg->SetPosition(t->wpad.ir.x-oneButtonScrollImg->GetWidth()/2, t->wpad.ir.y-oneButtonScrollImg->GetHeight()/2);
|
||||
}
|
||||
|
||||
if(pressedChan == t->chan && ((t->wpad.btns_h & ButtonScroll) || (t->wupcdata.btns_h & ButtonScroll) ))
|
||||
if(pressedChan == t->chan && (t->wpad.btns_h & ButtonScroll) )
|
||||
{
|
||||
if(pressedPosition-oneButtonScrollImg->GetHeight()/2 > t->wpad.ir.y)
|
||||
ScrollOneUp();
|
||||
@ -458,7 +458,7 @@ void GuiScrollbar::ScrollByButton(GuiTrigger *t)
|
||||
listChanged(SelItem, SelInd);
|
||||
}
|
||||
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h && !t->wupcdata.btns_d && !t->wupcdata.btns_h)
|
||||
if(pressedChan == t->chan && !t->wpad.btns_d && !t->wpad.btns_h)
|
||||
{
|
||||
pressedChan = -1;
|
||||
pressedPosition = -1;
|
||||
|
@ -18,7 +18,6 @@ static int scrollDelay = 0;
|
||||
GuiTrigger::GuiTrigger()
|
||||
{
|
||||
chan = -1;
|
||||
memset(&wupcdata, 0, sizeof(WUPCFULLData));
|
||||
memset(&wpad, 0, sizeof(WPADData));
|
||||
memset(&pad, 0, sizeof(PADData));
|
||||
}
|
||||
@ -39,7 +38,6 @@ void GuiTrigger::SetSimpleTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_SIMPLE;
|
||||
chan = ch;
|
||||
wupcdata.btns_d = wiibtns;
|
||||
wpad.btns_d = wiibtns;
|
||||
pad.btns_d = gcbtns;
|
||||
}
|
||||
@ -53,7 +51,6 @@ void GuiTrigger::SetHeldTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_HELD;
|
||||
chan = ch;
|
||||
wupcdata.btns_h = wiibtns;
|
||||
wpad.btns_h = wiibtns;
|
||||
pad.btns_h = gcbtns;
|
||||
}
|
||||
@ -66,7 +63,6 @@ void GuiTrigger::SetButtonOnlyTrigger(s32 ch, u32 wiibtns, u16 gcbtns)
|
||||
{
|
||||
type = TRIGGER_BUTTON_ONLY;
|
||||
chan = ch;
|
||||
wupcdata.btns_d = wiibtns;
|
||||
wpad.btns_d = wiibtns;
|
||||
pad.btns_d = gcbtns;
|
||||
}
|
||||
@ -130,15 +126,13 @@ s8 GuiTrigger::WPAD_Stick(u8 right, int axis)
|
||||
bool GuiTrigger::Left()
|
||||
{
|
||||
u32 wiibtn = WPAD_BUTTON_LEFT;
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC || (wupcdata.btns_d | wupcdata.btns_h) > 0)
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC)
|
||||
wiibtn |= WPAD_CLASSIC_BUTTON_LEFT;
|
||||
|
||||
if( ((wpad.btns_d | wpad.btns_h) & wiibtn)
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & wiibtn)
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_LEFT))
|
||||
{
|
||||
if( (wpad.btns_d & wiibtn)
|
||||
|| (wupcdata.btns_d & wiibtn)
|
||||
|| (pad.btns_d & PAD_BUTTON_LEFT))
|
||||
{
|
||||
scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay.
|
||||
@ -156,16 +150,14 @@ bool GuiTrigger::Left()
|
||||
bool GuiTrigger::Right()
|
||||
{
|
||||
u32 wiibtn = WPAD_BUTTON_RIGHT;
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC || (wupcdata.btns_d | wupcdata.btns_h))
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC)
|
||||
wiibtn |= WPAD_CLASSIC_BUTTON_RIGHT;
|
||||
|
||||
if( ((wpad.btns_d | wpad.btns_h) & wiibtn)
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_RIGHT)
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & wiibtn))
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_RIGHT))
|
||||
{
|
||||
if( (wpad.btns_d & wiibtn)
|
||||
|| (pad.btns_d & PAD_BUTTON_RIGHT)
|
||||
|| (wupcdata.btns_d & wiibtn))
|
||||
|| (pad.btns_d & PAD_BUTTON_RIGHT))
|
||||
{
|
||||
scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay.
|
||||
return true;
|
||||
@ -182,15 +174,13 @@ bool GuiTrigger::Right()
|
||||
bool GuiTrigger::Up()
|
||||
{
|
||||
u32 wiibtn = WPAD_BUTTON_UP;
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC || (wupcdata.btns_d | wupcdata.btns_h))
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC)
|
||||
wiibtn |= WPAD_CLASSIC_BUTTON_UP;
|
||||
|
||||
if( ((wpad.btns_d | wpad.btns_h) & wiibtn)
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_UP)
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & wiibtn))
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_UP))
|
||||
{
|
||||
if( (wpad.btns_d & wiibtn)
|
||||
|| (wupcdata.btns_d & wiibtn)
|
||||
|| (pad.btns_d & PAD_BUTTON_UP))
|
||||
{
|
||||
scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay.
|
||||
@ -208,16 +198,14 @@ bool GuiTrigger::Up()
|
||||
bool GuiTrigger::Down()
|
||||
{
|
||||
u32 wiibtn = WPAD_BUTTON_DOWN;
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC || (wupcdata.btns_d | wupcdata.btns_h))
|
||||
if(wpad.exp.type == WPAD_EXP_CLASSIC)
|
||||
wiibtn |= WPAD_CLASSIC_BUTTON_DOWN;
|
||||
|
||||
if( ((wpad.btns_d | wpad.btns_h) & wiibtn)
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN)
|
||||
|| ((wupcdata.btns_d | wupcdata.btns_h) & wiibtn))
|
||||
|| ((pad.btns_d | pad.btns_h) & PAD_BUTTON_DOWN))
|
||||
{
|
||||
if( (wpad.btns_d & wiibtn)
|
||||
|| (pad.btns_d & PAD_BUTTON_DOWN)
|
||||
|| (wupcdata.btns_d & wiibtn))
|
||||
|| (pad.btns_d & PAD_BUTTON_DOWN))
|
||||
{
|
||||
scrollDelay = SCROLL_INITIAL_DELAY; // reset scroll delay.
|
||||
return true;
|
||||
|
@ -20,12 +20,12 @@
|
||||
#include <gctypes.h>
|
||||
|
||||
#define NIN_MAGIC 0x01070CF6
|
||||
#define NIN_CFG_VERSION 0x00000007
|
||||
#define NIN_CFG_VERSION 0x00000008
|
||||
|
||||
typedef struct NIN_CFG
|
||||
{
|
||||
u32 Magicbytes; // 0x01070CF6
|
||||
u32 Version; // v4 since v3.354, v5 since v3.358, v6 since v3.368, v7 since 4.424
|
||||
u32 Version; // v4 since v3.354, v5 since v3.358, v6 since v3.368, v7 since 4.424, v8 since 4.431
|
||||
u32 Config;
|
||||
u32 VideoMode;
|
||||
u32 Language;
|
||||
@ -66,8 +66,8 @@ enum ninconfig
|
||||
NIN_CFG_NATIVE_SI = (1<<14), // v2.189
|
||||
NIN_CFG_WIIU_WIDE = (1<<15), // v2.258
|
||||
NIN_CFG_ARCADE_MODE = (1<<16), // v4.424
|
||||
NIN_CFG_CC_RUMBLE = (1 << 17),// v4.43x
|
||||
NIN_CFG_SKIP_IPL = (1 << 18),// v4.43x
|
||||
NIN_CFG_CC_RUMBLE = (1 << 17),// v4.431 cfg version 8
|
||||
NIN_CFG_SKIP_IPL = (1 << 18),// v4.435
|
||||
};
|
||||
|
||||
enum ninvideomode
|
||||
|
@ -10,7 +10,7 @@
|
||||
#include "wad/nandtitle.h"
|
||||
#include "SystemMenu/SystemMenuResources.h"
|
||||
#include "system/IosLoader.h"
|
||||
#include "system/runtimeiospatch.h"
|
||||
#include "libs/libruntimeiospatch/runtimeiospatch.h"
|
||||
#include "utils/timer.h"
|
||||
#include "settings/CSettings.h"
|
||||
#include "settings/CGameSettings.h"
|
||||
@ -25,6 +25,8 @@
|
||||
#include "sys.h"
|
||||
#include "svnrev.h"
|
||||
|
||||
extern bool isWiiVC; // in sys.cpp
|
||||
|
||||
StartUpProcess::StartUpProcess()
|
||||
{
|
||||
//! Load default font for the next text outputs
|
||||
@ -55,7 +57,7 @@ StartUpProcess::StartUpProcess()
|
||||
versionTxt->SetTextf("v3.0 Rev. %s", GetRev());
|
||||
#endif
|
||||
|
||||
#if 0 // enable if you release a modded version
|
||||
#if 1 // enable if you release a modded version - enabled by default to differentiate official releases
|
||||
versionTxt->SetTextf("v3.0 Rev. %s mod", GetRev());
|
||||
#endif
|
||||
|
||||
@ -267,7 +269,8 @@ int StartUpProcess::Execute()
|
||||
SetTextf("Initialize sd card\n");
|
||||
DeviceHandler::Instance()->MountSD();
|
||||
|
||||
if(Settings.USBAutoMount == ON)
|
||||
// Do not mount USB if not needed. USB is not available with WiiU WiiVC injected channel.
|
||||
if(Settings.USBAutoMount == ON && !isWiiVC)
|
||||
{
|
||||
SetTextf("Initialize usb device\n");
|
||||
USBSpinUp();
|
||||
@ -283,7 +286,9 @@ int StartUpProcess::Execute()
|
||||
gprintf("\tLoading game categories...%s\n", GameCategories.Load(Settings.ConfigPath) ? "done" : "failed");
|
||||
if(Settings.CacheTitles)
|
||||
gprintf("\tLoading cached titles...%s\n", GameTitles.ReadCachedTitles(Settings.titlestxt_path) ? "done" : "failed (using default)");
|
||||
if(Settings.LoaderIOS != IOS_GetVersion())
|
||||
|
||||
// Reload to user's settings if different than current IOS, and if not using an injected WiiU WiiVC IOS255 (fw.img)
|
||||
if(Settings.LoaderIOS != IOS_GetVersion() && !isWiiVC)
|
||||
{
|
||||
SetTextf("Reloading to config file's cIOS...\n");
|
||||
|
||||
@ -294,7 +299,6 @@ int StartUpProcess::Execute()
|
||||
|
||||
// Shut down pads
|
||||
WPAD_Shutdown();
|
||||
WUPC_Shutdown();
|
||||
|
||||
// Loading now the cios setup in the settings
|
||||
IosLoader::LoadAppCios();
|
||||
@ -320,7 +324,7 @@ int StartUpProcess::Execute()
|
||||
}
|
||||
else if(Settings.USBPort == 1 && USBStorage2_GetPort() != Settings.USBPort)
|
||||
{
|
||||
if(Settings.USBAutoMount == ON)
|
||||
if(Settings.USBAutoMount == ON && !isWiiVC)
|
||||
{
|
||||
SetTextf("Changing USB Port to %i\n", Settings.USBPort);
|
||||
DeviceHandler::Instance()->UnMountAllUSB();
|
||||
@ -329,18 +333,18 @@ int StartUpProcess::Execute()
|
||||
}
|
||||
else if(Settings.USBPort == 2)
|
||||
{
|
||||
if(Settings.USBAutoMount == ON)
|
||||
if(Settings.USBAutoMount == ON && !isWiiVC)
|
||||
{
|
||||
SetTextf("Mounting USB Port to 1\n");
|
||||
DeviceHandler::Instance()->MountUSBPort1();
|
||||
}
|
||||
}
|
||||
|
||||
// enable isfs permission if using IOS+AHB or Hermes v4
|
||||
if(IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4))
|
||||
// enable isfs permission if using Hermes v4 without AHB, or WiiU WiiVC (IOS255 fw.img)
|
||||
if(IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4) || isWiiVC)
|
||||
{
|
||||
SetTextf("Patching %sIOS%d...\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion());
|
||||
if (IosPatch_RUNTIME(true, false, false, false) == ERROR_PATCH)
|
||||
if (IosPatch_RUNTIME(!isWiiVC, false, false, isWiiVC, false) == ERROR_PATCH)
|
||||
gprintf("Patching %sIOS%d failed!\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion());
|
||||
else
|
||||
NandTitles.Get(); // get NAND channel's titles
|
||||
|
112
source/input.cpp
112
source/input.cpp
@ -15,7 +15,7 @@
|
||||
#include <ogcsys.h>
|
||||
#include <unistd.h>
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <wupc/wupc.h>
|
||||
#include "libs/libdrc/wiidrc.h"
|
||||
|
||||
#include "menu.h"
|
||||
#include "video.h"
|
||||
@ -27,6 +27,7 @@
|
||||
int rumbleRequest[4] = { 0, 0, 0, 0 };
|
||||
GuiTrigger userInput[4];
|
||||
static int rumbleCount[4] = { 0, 0, 0, 0 };
|
||||
extern bool isWiiVC; // in sys.cpp
|
||||
|
||||
/****************************************************************************
|
||||
* UpdatePads
|
||||
@ -35,7 +36,6 @@ static int rumbleCount[4] = { 0, 0, 0, 0 };
|
||||
***************************************************************************/
|
||||
void UpdatePads()
|
||||
{
|
||||
WUPC_UpdateButtonStats();
|
||||
WPAD_ScanPads();
|
||||
PAD_ScanPads();
|
||||
|
||||
@ -53,21 +53,6 @@ void UpdatePads()
|
||||
userInput[i].pad.triggerL = PAD_TriggerL(i);
|
||||
userInput[i].pad.triggerR = PAD_TriggerR(i);
|
||||
|
||||
|
||||
// WiiU Pro Controller
|
||||
userInput[i].wupcdata.btns_d = WUPC_ButtonsDown(i);
|
||||
userInput[i].wupcdata.btns_u = WUPC_ButtonsUp(i);
|
||||
userInput[i].wupcdata.btns_h = WUPC_ButtonsHeld(i);
|
||||
userInput[i].wupcdata.stickX = WUPC_lStickX(i);
|
||||
userInput[i].wupcdata.stickY = WUPC_lStickY(i);
|
||||
userInput[i].wupcdata.substickX = WUPC_rStickX(i);
|
||||
userInput[i].wupcdata.substickY = WUPC_rStickY(i);
|
||||
// Don't use only held to disconnect, on reconnect the pad sends last held state for a short time.
|
||||
if((WUPC_ButtonsHeld(i) & WUPC_EXTRA_BUTTON_RSTICK && WUPC_ButtonsDown(i) & WUPC_EXTRA_BUTTON_LSTICK) // R3+L3
|
||||
||(WUPC_ButtonsHeld(i) & WUPC_EXTRA_BUTTON_LSTICK && WUPC_ButtonsDown(i) & WUPC_EXTRA_BUTTON_RSTICK))
|
||||
WUPC_Disconnect(i);
|
||||
|
||||
|
||||
if (Settings.rumble == ON) DoRumble(i);
|
||||
|
||||
if(userInput[i].wpad.exp.type == WPAD_EXP_NUNCHUK)
|
||||
@ -78,6 +63,23 @@ void UpdatePads()
|
||||
if((userInput[i].pad.btns_h & PAD_TRIGGER_R) && (userInput[i].pad.btns_d & PAD_TRIGGER_Z))
|
||||
ScreenShot();
|
||||
}
|
||||
|
||||
// WiiU gamepad (DRC) when using WiiVC injected WiiU channels
|
||||
// Copy the drc state to Gamecube pad state
|
||||
if(WiiDRC_Inited() && WiiDRC_Connected())
|
||||
{
|
||||
WiiDRC_ScanPads();
|
||||
|
||||
// DRC buttons state written to gamecube pad data
|
||||
userInput[0].pad.btns_d |= wiidrc_to_pad(WiiDRC_ButtonsDown());
|
||||
userInput[0].pad.btns_u |= wiidrc_to_pad(WiiDRC_ButtonsUp());
|
||||
userInput[0].pad.btns_h |= wiidrc_to_pad(WiiDRC_ButtonsHeld());
|
||||
// DRC stick state written to gamecube pad data
|
||||
userInput[0].pad.stickX = WiiDRC_lStickX();
|
||||
userInput[0].pad.stickY = WiiDRC_lStickY();
|
||||
userInput[0].pad.substickX = WiiDRC_rStickX();
|
||||
userInput[0].pad.substickY = WiiDRC_rStickY();
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -136,10 +138,14 @@ bool ControlActivityTimeout(void)
|
||||
***************************************************************************/
|
||||
void SetupPads()
|
||||
{
|
||||
WUPC_Init();
|
||||
PAD_Init();
|
||||
WPAD_Init();
|
||||
|
||||
// check WiiVC to init WiiU gamepad
|
||||
WiiDRC_Init();
|
||||
isWiiVC = WiiDRC_Inited();
|
||||
|
||||
|
||||
// read wiimote accelerometer and IR data
|
||||
WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR);
|
||||
WPAD_SetVRes(WPAD_CHAN_ALL, screenwidth, screenheight);
|
||||
@ -159,7 +165,6 @@ void ShutoffRumble()
|
||||
{
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
WUPC_Rumble(i, 0);
|
||||
WPAD_Rumble(i, 0);
|
||||
rumbleCount[i] = 0;
|
||||
}
|
||||
@ -172,7 +177,6 @@ void DoRumble(int i)
|
||||
{
|
||||
if (rumbleRequest[i] && rumbleCount[i] < 3)
|
||||
{
|
||||
WUPC_Rumble(i, 1);
|
||||
WPAD_Rumble(i, 1); // rumble on
|
||||
rumbleCount[i]++;
|
||||
}
|
||||
@ -185,7 +189,73 @@ void DoRumble(int i)
|
||||
{
|
||||
if (rumbleCount[i]) rumbleCount[i]--;
|
||||
WPAD_Rumble(i, 0); // rumble off
|
||||
WUPC_Rumble(i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* WiiDRC to WPAD
|
||||
*
|
||||
* Sets WPAD button state based on WiiDRC (WiiU gamepad in WiiVC) pressed buttons.
|
||||
***************************************************************************/
|
||||
u32 wiidrc_to_wpad(u32 btns) {
|
||||
u32 ret = 0;
|
||||
|
||||
if(btns & WIIDRC_BUTTON_LEFT)
|
||||
ret |= WPAD_BUTTON_LEFT;
|
||||
if(btns & WIIDRC_BUTTON_RIGHT)
|
||||
ret |= WPAD_BUTTON_RIGHT;
|
||||
if(btns & WIIDRC_BUTTON_UP)
|
||||
ret |= WPAD_BUTTON_UP;
|
||||
if(btns & WIIDRC_BUTTON_DOWN)
|
||||
ret |= WPAD_BUTTON_DOWN;
|
||||
if(btns & WIIDRC_BUTTON_A)
|
||||
ret |= WPAD_BUTTON_A;
|
||||
if(btns & WIIDRC_BUTTON_B)
|
||||
ret |= WPAD_BUTTON_B;
|
||||
if(btns & WIIDRC_BUTTON_X)
|
||||
ret |= WPAD_BUTTON_1;
|
||||
if(btns & WIIDRC_BUTTON_Y)
|
||||
ret |= WPAD_BUTTON_2;
|
||||
if((btns & WIIDRC_BUTTON_L) || (btns & WIIDRC_BUTTON_ZL) || (btns & WIIDRC_BUTTON_MINUS))
|
||||
ret |= WPAD_BUTTON_MINUS;
|
||||
if((btns & WIIDRC_BUTTON_R) || (btns & WIIDRC_BUTTON_ZR) || (btns & WIIDRC_BUTTON_PLUS))
|
||||
ret |= WPAD_BUTTON_PLUS;
|
||||
if(btns & WIIDRC_BUTTON_HOME)
|
||||
ret |= WPAD_BUTTON_HOME;
|
||||
|
||||
return (ret&0xffff) ;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* WiiDRC to PAD
|
||||
*
|
||||
* Sets PAD button state based on WiiDRC (WiiU gamepad in WiiVC) pressed buttons.
|
||||
***************************************************************************/
|
||||
u32 wiidrc_to_pad(u32 btns) {
|
||||
u32 ret = 0;
|
||||
|
||||
if(btns & WIIDRC_BUTTON_LEFT)
|
||||
ret |= PAD_BUTTON_LEFT;
|
||||
if(btns & WIIDRC_BUTTON_RIGHT)
|
||||
ret |= PAD_BUTTON_RIGHT;
|
||||
if(btns & WIIDRC_BUTTON_UP)
|
||||
ret |= PAD_BUTTON_UP;
|
||||
if(btns & WIIDRC_BUTTON_DOWN)
|
||||
ret |= PAD_BUTTON_DOWN;
|
||||
if(btns & WIIDRC_BUTTON_A)
|
||||
ret |= PAD_BUTTON_A;
|
||||
if(btns & WIIDRC_BUTTON_B)
|
||||
ret |= PAD_BUTTON_B;
|
||||
if(btns & WIIDRC_BUTTON_X)
|
||||
ret |= PAD_BUTTON_X;
|
||||
if(btns & WIIDRC_BUTTON_Y)
|
||||
ret |= PAD_BUTTON_Y;
|
||||
if((btns & WIIDRC_BUTTON_L) || (btns & WIIDRC_BUTTON_ZL) || (btns & WIIDRC_BUTTON_MINUS))
|
||||
ret |= PAD_TRIGGER_L;
|
||||
if((btns & WIIDRC_BUTTON_R) || (btns & WIIDRC_BUTTON_ZR) || (btns & WIIDRC_BUTTON_PLUS))
|
||||
ret |= PAD_TRIGGER_R;
|
||||
if(btns & WIIDRC_BUTTON_HOME)
|
||||
ret |= PAD_BUTTON_START;
|
||||
|
||||
return (ret&0xffff) ;
|
||||
}
|
@ -14,7 +14,6 @@
|
||||
|
||||
#define PI 3.14159265f
|
||||
#define PADCAL 50
|
||||
#define WUPCCAL 400
|
||||
|
||||
extern int rumbleRequest[4];
|
||||
|
||||
@ -24,5 +23,7 @@ void ShutoffRumble();
|
||||
void DoRumble(int i);
|
||||
void SetWPADTimeout();
|
||||
bool ControlActivityTimeout(void);
|
||||
u32 wiidrc_to_wpad(u32 btns);
|
||||
u32 wiidrc_to_pad(u32 btns);
|
||||
|
||||
#endif
|
||||
|
BIN
source/libs/libdrc/libwiidrc.a
Normal file
BIN
source/libs/libdrc/libwiidrc.a
Normal file
Binary file not shown.
67
source/libs/libdrc/wiidrc.h
Normal file
67
source/libs/libdrc/wiidrc.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (C) 2017 FIX94
|
||||
*
|
||||
* This software may be modified and distributed under the terms
|
||||
* of the MIT license. See the LICENSE file for details.
|
||||
*/
|
||||
#ifndef _WIIDRC_H_
|
||||
#define _WIIDRC_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct WiiDRCData {
|
||||
s16 xAxisL;
|
||||
s16 xAxisR;
|
||||
s16 yAxisL;
|
||||
s16 yAxisR;
|
||||
u16 button;
|
||||
u8 battery;
|
||||
u8 extra;
|
||||
};
|
||||
|
||||
#define WIIDRC_BUTTON_A 0x8000
|
||||
#define WIIDRC_BUTTON_B 0x4000
|
||||
#define WIIDRC_BUTTON_X 0x2000
|
||||
#define WIIDRC_BUTTON_Y 0x1000
|
||||
#define WIIDRC_BUTTON_LEFT 0x0800
|
||||
#define WIIDRC_BUTTON_RIGHT 0x0400
|
||||
#define WIIDRC_BUTTON_UP 0x0200
|
||||
#define WIIDRC_BUTTON_DOWN 0x0100
|
||||
#define WIIDRC_BUTTON_ZL 0x0080
|
||||
#define WIIDRC_BUTTON_ZR 0x0040
|
||||
#define WIIDRC_BUTTON_L 0x0020
|
||||
#define WIIDRC_BUTTON_R 0x0010
|
||||
#define WIIDRC_BUTTON_PLUS 0x0008
|
||||
#define WIIDRC_BUTTON_MINUS 0x0004
|
||||
#define WIIDRC_BUTTON_HOME 0x0002
|
||||
#define WIIDRC_BUTTON_SYNC 0x0001
|
||||
|
||||
#define WIIDRC_EXTRA_BUTTON_L3 0x80
|
||||
#define WIIDRC_EXTRA_BUTTON_R3 0x40
|
||||
#define WIIDRC_EXTRA_BUTTON_TV 0x20
|
||||
#define WIIDRC_EXTRA_OVERLAY_TV 0x10
|
||||
#define WIIDRC_EXTRA_OVERLAY_POWER 0x01
|
||||
|
||||
bool WiiDRC_Init();
|
||||
bool WiiDRC_Inited();
|
||||
bool WiiDRC_Recalibrate();
|
||||
bool WiiDRC_ScanPads();
|
||||
bool WiiDRC_Connected();
|
||||
bool WiiDRC_ShutdownRequested();
|
||||
const u8 *WiiDRC_GetRawI2CAddr();
|
||||
const struct WiiDRCData *WiiDRC_Data();
|
||||
u32 WiiDRC_ButtonsUp();
|
||||
u32 WiiDRC_ButtonsDown();
|
||||
u32 WiiDRC_ButtonsHeld();
|
||||
s16 WiiDRC_lStickX();
|
||||
s16 WiiDRC_lStickY();
|
||||
s16 WiiDRC_rStickX();
|
||||
s16 WiiDRC_rStickY();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
BIN
source/libs/libruntimeiospatch/libruntimeiospatch.a
Normal file
BIN
source/libs/libruntimeiospatch/libruntimeiospatch.a
Normal file
Binary file not shown.
@ -105,26 +105,28 @@ s32 IosPatch_AHBPROT(bool verbose);
|
||||
/**
|
||||
* This function applies patches on current IOS
|
||||
* @see Patchsets
|
||||
* @param wii Flag determing whether or not to apply Wii patches.
|
||||
* @param sciifii Flag determing whether or not to apply extra Sciifii patches.
|
||||
* @param vwii Flag determing whether or not to apply extra vWii patches.
|
||||
* @param verbose Flag determing whether or not to print messages on-screen.
|
||||
* @param wii Flag determining whether or not to apply Wii patches.
|
||||
* @param sciifii Flag determining whether or not to apply extra Sciifii patches.
|
||||
* @param vwii Flag determining whether or not to apply extra vWii patches.
|
||||
* @param wiivc Flag determining whether or not to apply WiiVC patches.
|
||||
* @param verbose Flag determining whether or not to print messages on-screen.
|
||||
* @example if(AHBPROT_DISABLED) IosPatch_FULL(true, false, false, false);
|
||||
* @return Signed 32bit integer representing code
|
||||
* > 0 : Success - return equals to number of applied patches
|
||||
* ERROR_AHBPROT : Error - No HW_AHBPROT access
|
||||
* ERROR_PATCH : Error - Patching HW_AHBPROT access failed
|
||||
*/
|
||||
s32 IosPatch_RUNTIME(bool wii, bool sciifii, bool vwii, bool verbose);
|
||||
s32 IosPatch_RUNTIME(bool wii, bool sciifii, bool vwii, bool wiivc, bool verbose);
|
||||
|
||||
|
||||
/**
|
||||
* This function combines IosPatch_AHBPROT + IOS_ReloadIOS + IosPatch_RUNTIME
|
||||
* @see Patchsets
|
||||
* @param wii Flag determing whether or not to apply Wii patches.
|
||||
* @param sciifii Flag determing whether or not to apply extra Sciifii patches.
|
||||
* @param vwii Flag determing whether or not to apply extra vWii patches.
|
||||
* @param verbose Flag determing whether or not to print messages on-screen.
|
||||
* @param wii Flag determining whether or not to apply Wii patches.
|
||||
* @param sciifii Flag determining whether or not to apply extra Sciifii patches.
|
||||
* @param vwii Flag determining whether or not to apply extra vWii patches.
|
||||
* @param wiivc Flag determining whether or not to apply WiiVC patches.
|
||||
* @param verbose Flag determining whether or not to print messages on-screen.
|
||||
* @param IOS Which IOS to reload into.
|
||||
* @example if(AHBPROT_DISABLED) IosPatch_FULL(true, false, false, false, 58);
|
||||
* @return Signed 32bit integer representing code
|
||||
@ -132,7 +134,7 @@ s32 IosPatch_RUNTIME(bool wii, bool sciifii, bool vwii, bool verbose);
|
||||
* ERROR_AHBPROT : Error - No HW_AHBPROT access
|
||||
* ERROR_PATCH : Error - Patching HW_AHBPROT access failed
|
||||
*/
|
||||
s32 IosPatch_FULL(bool wii, bool sciifii, bool vwii, bool verbose, int IOS);
|
||||
s32 IosPatch_FULL(bool wii, bool sciifii, bool vwii, bool wiivc, bool verbose, int IOS);
|
||||
|
||||
/**
|
||||
* This function patches only SSL certificate check
|
@ -33,6 +33,7 @@ const struct block emptyblock = { 0, NULL };
|
||||
//The maximum amount of bytes to send per net_write() call
|
||||
//#define NET_BUFFER_SIZE 1024
|
||||
#define NET_BUFFER_SIZE 3600
|
||||
//#define VERBOSE
|
||||
|
||||
// Write our message to the server
|
||||
static s32 send_message(s32 server, char *msg)
|
||||
@ -231,16 +232,21 @@ struct block downloadfile(const char *url)
|
||||
char* headerformat = "GET %s HTTP/1.0\r\nHost: %s\r\n%sUser-Agent: USBLoaderGX r%s\r\n\r\n";
|
||||
char header[strlen(headerformat) + strlen(path) + strlen(domain) + strlen(referer) + 100];
|
||||
sprintf(header, headerformat, path, domain, referer, GetRev());
|
||||
//gprintf("\nHTTP Request:\n");
|
||||
//gprintf("%s\n",header);
|
||||
|
||||
#ifdef VERBOSE
|
||||
gprintf("\nHTTP Request:\n");
|
||||
gprintf("%s\n",header);
|
||||
#endif
|
||||
|
||||
//Do the request and get the response
|
||||
send_message(connection, header);
|
||||
struct block response = read_message(connection);
|
||||
net_close(connection);
|
||||
|
||||
#ifdef VERBOSE
|
||||
// dump response
|
||||
// hexdump(response.data, response.size);
|
||||
hexdump(response.data, response.size);
|
||||
#endif
|
||||
|
||||
//Search for the 4-character sequence \r\n\r\n in the response which signals the start of the http payload (file)
|
||||
unsigned char *filestart = NULL;
|
||||
@ -269,7 +275,9 @@ struct block downloadfile(const char *url)
|
||||
int code;
|
||||
if (sscanf(codep+1, "%d", &code) == 1)
|
||||
{
|
||||
//gprintf("HTTP response code: %d\n", code);
|
||||
#ifdef VERBOSE
|
||||
gprintf("HTTP response code: %d\n", code);
|
||||
#endif
|
||||
if (code == 302) // 302 FOUND (redirected link)
|
||||
{
|
||||
char *ptr = strcasestr((char*)response.data, "Location: ");
|
||||
@ -280,18 +288,24 @@ struct block downloadfile(const char *url)
|
||||
*(strchr(newURL, '\r'))=0;
|
||||
|
||||
redirect = true;
|
||||
//gprintf("New URL to download = %s \n", newURL);
|
||||
#ifdef VERBOSE
|
||||
gprintf("New URL to download = %s \n", newURL);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
//gprintf("HTTP ERROR: %s\n", htstat);
|
||||
#ifdef VERBOSE
|
||||
gprintf("HTTP ERROR: %s\n", htstat);
|
||||
#endif
|
||||
free(response.data);
|
||||
return emptyblock;
|
||||
}
|
||||
}
|
||||
if (code >=400) // Not found
|
||||
{
|
||||
//gprintf("HTTP ERROR: %s\n", htstat);
|
||||
#ifdef VERBOSE
|
||||
gprintf("HTTP ERROR: %s\n", htstat);
|
||||
#endif
|
||||
free(response.data);
|
||||
return emptyblock;
|
||||
}
|
||||
@ -319,7 +333,9 @@ struct block downloadfile(const char *url)
|
||||
u8 * tmp = realloc(response.data, redirected.size);
|
||||
if (tmp == NULL)
|
||||
{
|
||||
//gprintf("Could not allocate enough memory for new URL. Download canceled.\n");
|
||||
#ifdef VERBOSE
|
||||
gprintf("Could not allocate enough memory for new URL. Download canceled.\n");
|
||||
#endif
|
||||
free(response.data);
|
||||
free(redirected.data);
|
||||
return emptyblock;
|
||||
|
@ -3,7 +3,7 @@
|
||||
#include <gccore.h>
|
||||
#include <string.h>
|
||||
#include "ssl.h"
|
||||
#include "system/runtimeiospatch.h"
|
||||
#include "libs/libruntimeiospatch/runtimeiospatch.h"
|
||||
|
||||
#define ISALIGNED(x) ((((u32)x)&0x1F)==0)
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "memory/memory.h"
|
||||
#include "memory/mem2.h"
|
||||
#include "settings/SettingsEnums.h"
|
||||
#include "svnrev.h"
|
||||
|
||||
typedef struct _appDOL
|
||||
{
|
||||
@ -114,6 +115,108 @@ bool Anti_002_fix(u8 * Address, int Size)
|
||||
return PatchDOL(Address, Size, (const u8 *) SearchPattern, sizeof(SearchPattern), (const u8 *) PatchData, sizeof(PatchData));
|
||||
}
|
||||
|
||||
|
||||
/** 480p Pixel Fix Patch by leseratte
|
||||
fix for a Nintendo Revolution SDK bug found by Extrems affecting early Wii console when using 480p video mode.
|
||||
https://shmups.system11.org/viewtopic.php?p=1361158#p1361158
|
||||
https://github.com/ExtremsCorner/libogc-rice/commit/941d687e271fada68c359bbed98bed1fbb454448
|
||||
**/
|
||||
void PatchFix480p()
|
||||
{
|
||||
u8 prefix[2] = { 0x4b, 0xff };
|
||||
|
||||
/// Patch offset: ----------VVVVVVVV
|
||||
u32 Pattern_MKW[8] = { 0x38000065, 0x9b810019, 0x38810018, 0x386000e0, 0x98010018, 0x38a00002};
|
||||
u32 patches_MKW[2] = { 0x38600003, 0x98610019 };
|
||||
/// Used by: MKWii, Wii Play, Need for Speed Nitro, Wii Sports, ...
|
||||
|
||||
/// Patch offset: ----------------------------------------------VVVVVVVV
|
||||
u32 Pattern_NSMB[8] = { 0x38000065, 0x9801001c, 0x3881001c, 0x386000e0, 0x9b81001d, 0x38a00002};
|
||||
u32 patches_NSMB[2] = { 0x38a00003, 0x98a1001d };
|
||||
/// Used by: New Super Mario Bros, ...
|
||||
|
||||
/*
|
||||
* Code block that is being patched (in MKW):
|
||||
*
|
||||
* 4bffe30d: bl WaitMicroTime
|
||||
* 38000065: li r0, 0x65
|
||||
* 9b810019: stb r28, 25(r1) // store the wrong value (1)
|
||||
* 38810018: addi r4, r1, 0x18
|
||||
* 386000e0: li r3, 0xe0
|
||||
* 98010018: stb r0, 24(r1)
|
||||
* 38a00002: li r5, 2
|
||||
* 4bffe73d: bl __VISendI2CData
|
||||
*
|
||||
* r28 is a register that is set to 1 at the beginning of the function.
|
||||
* However, its contents are used elsewhere as well, so we can't just modify this one function.
|
||||
*
|
||||
* The following code first searches for one of the patterns above, then replaces the
|
||||
* "stb r28, 25(r1)" instruction that stores the wrong value on the stack with a branch instead
|
||||
* That branch branches to the injected custom code ("li r3, 3; stb r3, 25(r1)") that stores the
|
||||
* correct value (3) instead. At the end of the injected code will be another branch that branches
|
||||
* back to the instruction after the one that has been replaced (so, to "addi r4, r1, 0x18").
|
||||
* r3 can safely be used as a temporary register because its contents will be replaced immediately
|
||||
* afterwards anyways.
|
||||
*
|
||||
*/
|
||||
|
||||
void * offset = NULL;
|
||||
void * addr = (void*)0x80000000;
|
||||
u32 len = 0x900000;
|
||||
|
||||
void * patch_ptr = 0 ;
|
||||
void * a = addr;
|
||||
|
||||
while ((char*)a < ((char*)addr + len)) {
|
||||
if (memcmp(a, &Pattern_MKW, 6 * 4) == 0) {
|
||||
// Found pattern?
|
||||
if (memcmp(a - 4, &prefix, 2) == 0) {
|
||||
if (memcmp(a + 8*4, &prefix, 2) == 0) {
|
||||
offset = a + 4;
|
||||
hexdump (a, 30);
|
||||
patch_ptr = &patches_MKW;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (memcmp(a, &Pattern_NSMB, 6 * 4) == 0) {
|
||||
// Found pattern?
|
||||
if (memcmp(a - 4, &prefix, 2) == 0) {
|
||||
if (memcmp(a + 8*4, &prefix, 2) == 0) {
|
||||
offset = a + 16;
|
||||
hexdump (a, 30);
|
||||
patch_ptr = &patches_NSMB;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
a+= 4;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (offset == 0) {
|
||||
// offset is still 0, we didn't find the pattern, return
|
||||
gprintf("Didn't find offset for 480p patch!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// If we are here, we found the offset. Lets grab some space
|
||||
// from the heap for our patch
|
||||
u32 old_heap_ptr = *(u32*)0x80003110;
|
||||
*((u32*)0x80003110) = (old_heap_ptr - 0x20);
|
||||
u32 heap_space = old_heap_ptr-0x20;
|
||||
|
||||
gprintf("Found offset for 480p patch - create branch from 0x%x to heap (0x%x)\n", offset, heap_space);
|
||||
hexdump (offset, 30);
|
||||
|
||||
memcpy((void*)heap_space, patch_ptr, 8);
|
||||
|
||||
*((u32*)offset) = 0x48000000 + (((u32)(heap_space) - ((u32)(offset))) & 0x3ffffff);
|
||||
*((u32*)((u32)heap_space + 8)) = 0x48000000 + (((u32)((u32)offset + 4) - ((u32)(heap_space + 8))) & 0x3ffffff);
|
||||
return;
|
||||
}
|
||||
|
||||
/** Patch URLs for private Servers - Thanks to ToadKing/wiilauncher-nossl **/
|
||||
void PrivateServerPatcher(void *addr, u32 len, u8 privateServer)
|
||||
{
|
||||
@ -134,13 +237,252 @@ void PrivateServerPatcher(void *addr, u32 len, u8 privateServer)
|
||||
|
||||
// Patch nintendowifi.net -> private server domain
|
||||
if(privateServer == PRIVSERV_WIIMMFI )
|
||||
{
|
||||
domainpatcher(addr, len, "wiimmfi.de");
|
||||
}
|
||||
|
||||
//else if(privateServer == PRIVSERV_CUSTOM)
|
||||
//domainpatcher(dst, len, Settings.CustomPrivateServer);
|
||||
|
||||
}
|
||||
|
||||
u32 do_new_wiimmfi()
|
||||
{
|
||||
|
||||
// As of November 2018, Wiimmfi requires a special Wiimmfi patcher
|
||||
// update which does a bit more than just patch the server adresses.
|
||||
// This function is being called by GameBooter.cpp, right before
|
||||
// jumping to the entry point (only for Mario Kart Wii & Wiimmfi),
|
||||
// and applies all the necessary new patches to the game.
|
||||
// This includes support for the new patcher update plus
|
||||
// support for StaticR.rel patching.
|
||||
|
||||
// This function has been implemented by Leseratte. Please don't
|
||||
// try to modify it without speaking to the Wiimmfi team because
|
||||
// doing so could have unintended side effects.
|
||||
|
||||
// check region:
|
||||
char region = *((char *)(0x80000003));
|
||||
char * patched;
|
||||
void * patch1_offset, *patch2_offset, *patch3_offset;
|
||||
|
||||
// define some offsets and variables depending on the region:
|
||||
switch (region) {
|
||||
case 'P':
|
||||
patched = (char*)0x80276054;
|
||||
patch1_offset = (void*)0x800ee3a0;
|
||||
patch2_offset = (void*)0x801d4efc;
|
||||
patch3_offset = (void*)0x801A72E0;
|
||||
break;
|
||||
case 'E':
|
||||
patched = (char*)0x80271d14;
|
||||
patch1_offset = (void*)0x800ee300;
|
||||
patch2_offset = (void*)0x801d4e5c;
|
||||
patch3_offset = (void*)0x801A7240;
|
||||
break;
|
||||
case 'J':
|
||||
patched = (char*)0x802759f4;
|
||||
patch1_offset = (void*)0x800ee2c0;
|
||||
patch2_offset = (void*)0x801d4e1c;
|
||||
patch3_offset = (void*)0x801A7200;
|
||||
break;
|
||||
case 'K':
|
||||
patched = (char*)0x80263E34;
|
||||
patch1_offset = (void*)0x800ee418;
|
||||
patch2_offset = (void*)0x801d5258;
|
||||
patch3_offset = (void*)0x801A763c;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*patched != '*') return -2; // ISO already patched
|
||||
|
||||
// This RAM address is set (no asterisk) by all officially
|
||||
// updated patchers, so if it is modified, the image is already
|
||||
// patched with a new patcher and we don't need to patch anything.
|
||||
|
||||
// For statistics and easier debugging in case of problems, Wiimmfi
|
||||
// wants to know what patcher a game has been patched with, thus,
|
||||
// let the game know the exact USB-Loader version.
|
||||
char * fmt = "USB-Loader GX v3.0 R%-30s";
|
||||
char patcher[50] = {0};
|
||||
snprintf((char *)&patcher, 49, fmt, GetRev());
|
||||
strncpy(patched, (char *)&patcher, 42);
|
||||
|
||||
// Do the plain old patching with the string search
|
||||
PrivateServerPatcher((void*)0x80004000, 0x385200, PRIVSERV_WIIMMFI);
|
||||
|
||||
// Replace some URLs for Wiimmfi's new update system
|
||||
char newURL1[] = "http://ca.nas.wiimmfi.de/ca";
|
||||
char newURL2[] = "http://naswii.wiimmfi.de/ac";
|
||||
char newURL3P[] = "https://main.nas.wiimmfi.de/pp";
|
||||
char newURL3E[] = "https://main.nas.wiimmfi.de/pe";
|
||||
char newURL3J[] = "https://main.nas.wiimmfi.de/pj";
|
||||
char newURL3K[] = "https://main.nas.wiimmfi.de/pk";
|
||||
|
||||
|
||||
// Write the URLs to the proper place and do some other patching.
|
||||
switch (region) {
|
||||
case 'P':
|
||||
memcpy((void*)0x8027A400, newURL1, sizeof(newURL1));
|
||||
memcpy((void*)0x8027A400 + 0x28, newURL2, sizeof(newURL2));
|
||||
memcpy((void*)0x8027A400 + 0x4C, newURL3P, sizeof(newURL3P));
|
||||
*(u32*)0x802a146c = 0x733a2f2f;
|
||||
*(u32*)0x800ecaac = 0x3bc00000;
|
||||
break;
|
||||
case 'E':
|
||||
memcpy((void*)0x802760C0, newURL1, sizeof(newURL1));
|
||||
memcpy((void*)0x802760C0 + 0x28, newURL2, sizeof(newURL2));
|
||||
memcpy((void*)0x802760C0 + 0x4C, newURL3E, sizeof(newURL3E));
|
||||
*(u32*)0x8029D12C = 0x733a2f2f;
|
||||
*(u32*)0x800ECA0C = 0x3bc00000;
|
||||
break;
|
||||
case 'J':
|
||||
memcpy((void*)0x80279DA0, newURL1, sizeof(newURL1));
|
||||
memcpy((void*)0x80279DA0 + 0x28, newURL2, sizeof(newURL2));
|
||||
memcpy((void*)0x80279DA0 + 0x4C, newURL3J, sizeof(newURL3J));
|
||||
*(u32*)0x802A0E0C = 0x733a2f2f;
|
||||
*(u32*)0x800EC9CC = 0x3bc00000;
|
||||
break;
|
||||
case 'K':
|
||||
memcpy((void*)0x802682B0, newURL1, sizeof(newURL1));
|
||||
memcpy((void*)0x802682B0 + 0x28, newURL2, sizeof(newURL2));
|
||||
memcpy((void*)0x802682B0 + 0x4C, newURL3K, sizeof(newURL3K));
|
||||
*(u32*)0x8028F474 = 0x733a2f2f;
|
||||
*(u32*)0x800ECB24 = 0x3bc00000;
|
||||
break;
|
||||
}
|
||||
|
||||
// Make some space on heap (0x400) for our custom code.
|
||||
u32 old_heap_ptr = *(u32*)0x80003110;
|
||||
*((u32*)0x80003110) = (old_heap_ptr - 0x400);
|
||||
u32 heap_space = old_heap_ptr-0x400;
|
||||
memset((void*)old_heap_ptr-0x400, 0xed, 0x400);
|
||||
|
||||
// Binary blobs with Wiimmfi patches. Do not modify.
|
||||
// Provided by Leseratte on 2018-12-14.
|
||||
|
||||
int binary[] = { 0x37C849A2, 0x8BC32FA4, 0xC9A34B71, 0x1BCB49A2,
|
||||
0x2F119304, 0x5F402684, 0x3E4FDA29, 0x50849A21,
|
||||
0xB88B3452, 0x627FC9C1, 0xDC24D119, 0x5844350F,
|
||||
0xD893444F, 0x19A588DC, 0x16C91184, 0x0C3E237C,
|
||||
0x75906CED, 0x6E68A55E, 0x58791842, 0x072237E9,
|
||||
0xAB24906F, 0x0A8BDF21, 0x4D11BE42, 0x1AAEDDC8,
|
||||
0x1C42F908, 0x280CF2B2, 0x453A1BA4, 0x9A56C869,
|
||||
0x786F108E, 0xE8DF05D2, 0x6DB641EB, 0x6DFC84BB,
|
||||
0x7E980914, 0x0D7FB324, 0x23442185, 0xA7744966,
|
||||
0x53901359, 0xBF2103CC, 0xC24A4EB7, 0x32049A02,
|
||||
0xC1683466, 0xCA93689D, 0xD8245106, 0xA84987CF,
|
||||
0xEC9B47C9, 0x6FA688FE, 0x0A4D11A6, 0x8B653C7B,
|
||||
0x09D27E30, 0x5B936208, 0x5DD336DE, 0xCD092487,
|
||||
0xEF2C6D36, 0x1E09DF2D, 0x75B1BE47, 0xE68A7F22,
|
||||
0xB0E5F90D, 0xEC49F216, 0xAD1DCC24, 0xE2B5C841,
|
||||
0x066F6F63, 0xF4D90926, 0x299F42CD, 0xA3F125D6,
|
||||
0x077B093C, 0xB5721268, 0x1BE424D1, 0xEBC30BF0,
|
||||
0x77867BED, 0x4F0C9BCA, 0x3E195930, 0xDC32DE2C,
|
||||
0x1865D189, 0x70C67E7A, 0x71FA7329, 0x532233D3,
|
||||
0x06D2E87B, 0x6CBEBA7F, 0x99F08532, 0x52FA601C,
|
||||
0x05F4B82C, 0x4B64839C, 0xB5C65009, 0x1B8396E3,
|
||||
0x0A8B2DAF, 0x0DB85BE6, 0x12F1B71D, 0x186F6E4D,
|
||||
0x2870DC2E, 0x5960B8E6, 0x8F4D71BD, 0x0614E3C3,
|
||||
0x05E8C725, 0x365D8E3D, 0x74351CDE, 0xE1AB3930,
|
||||
0xFEDA721B, 0xE53AE4E9, 0xC3B4C9A6, 0xBAE59346,
|
||||
0x6D45269D, 0x634E4D1A, 0x2FD99A30, 0x26393449,
|
||||
0xE49768D1, 0x81E1D1A1, 0xFCE1A34A, 0x7EB44697,
|
||||
0xEB2F8D2D, 0xCECFE5AF, 0x81BD34B6, 0xB1F1696E,
|
||||
0x5E6ED2B2, 0xA473A4A0, 0x41664B70, 0xBF40968A,
|
||||
0x662F2CCB, 0xC5DF5B8C, 0xB632B772, 0x74EB6F39,
|
||||
0xE017DC71, 0xFDA3B890, 0xE3C9713D, 0xCE53E397,
|
||||
0xA12BC743, 0x5AD98EA5, 0xBC721C9F, 0x4568395A,
|
||||
0x925E72B4, 0x2D7DE4D7, 0x6777C9C7, 0xD6619396,
|
||||
0xA502268A, 0x77884D75, 0xF79E9AF0, 0xE6FC3461,
|
||||
0xF07468A5, 0xF866D11D, 0xF90CA342, 0xCF9546FF,
|
||||
0x87A48D81, 0x06881A51, 0x309C34D1, 0x79B669CE,
|
||||
0xFAADD2D7, 0xC8D7A5D1, 0x89214BE5, 0x1B8396EF,
|
||||
0x0A8B2DE9, 0x0D985B06, 0x12F1B711, 0x186F6E57,
|
||||
0x2850DC0E, 0x5960B8EA, 0x8F4D71AC, 0x0614E3E3,
|
||||
0x05E8C729, 0x365D8E39, 0x74351CFE, 0x518E3943,
|
||||
0x4A397268, 0x9D58E4B8, 0xD394C9A2, 0x0E069344,
|
||||
0xB522268B, 0x636E4D77, 0x2FF99A37, 0xF6DC346D,
|
||||
0xE49268B4, 0x2001D1A0, 0x4929A365, 0x7B764691,
|
||||
0xFFC68D49, 0x16A81A53, 0x247A34D2, 0xA1D16967,
|
||||
0x4B6DD2D5, 0xDDF4A5B7, 0x454A4B70, 0x0FAE96E2,
|
||||
0x0A8A2DC7, 0x0D98A47A, 0x06DCB71D, 0x0CCC6E38,
|
||||
0x55F25CFB, 0xB08C1E88, 0xDF4259C9, 0x0714E387,
|
||||
0xB00D47AF, 0x7B722975, 0x48BE349A, 0x29CC393C,
|
||||
0xEA797228, 0x98986471, 0x3778E1A3, 0xD7626D06,
|
||||
0x1567268D, 0x668ECD00, 0xD614F5C8, 0x133037CF,
|
||||
0x92F26CF2, 0x00000000, 0x00000000, 0x00000000};
|
||||
|
||||
// Prepare patching process ....
|
||||
int i = 3;
|
||||
int idx = 0;
|
||||
for (; i < 202; i++) {
|
||||
if (i == 67 || i == 82) idx++;
|
||||
binary[i] = binary[i] ^ binary[idx];
|
||||
binary[idx] = ((binary[idx] << 1) | ((binary[idx] >> (32 - 1)) & ~(0xfffffffe)));
|
||||
}
|
||||
|
||||
|
||||
// Binary blob needs some changes for regions other than PAL ...
|
||||
switch (region) {
|
||||
case 'E':
|
||||
binary[29] = binary[67];
|
||||
binary[37] = binary[68];
|
||||
binary[43] = binary[69];
|
||||
binary[185] = 0x61295C74;
|
||||
binary[189] = 0x61295D40;
|
||||
binary[198] = 0x61086F5C;
|
||||
break;
|
||||
case 'J':
|
||||
binary[29] = binary[70];
|
||||
binary[37] = binary[71];
|
||||
binary[43] = binary[72];
|
||||
binary[185] = 0x612997CC;
|
||||
binary[189] = 0x61299898;
|
||||
binary[198] = 0x61086F1C;
|
||||
break;
|
||||
case 'K':
|
||||
binary[6] = binary[73];
|
||||
binary[9] = binary[74];
|
||||
binary[11] = binary[75];
|
||||
binary[23] = binary[76];
|
||||
binary[29] = binary[77];
|
||||
binary[33] = binary[78];
|
||||
binary[37] = binary[79];
|
||||
binary[43] = binary[80];
|
||||
binary[63] = binary[81];
|
||||
binary[184] = 0x3D208088;
|
||||
binary[185] = 0x61298AA4;
|
||||
binary[188] = 0x3D208088;
|
||||
binary[189] = 0x61298B58;
|
||||
binary[198] = 0x61087358;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Installing all the patches.
|
||||
|
||||
memcpy((void*)heap_space, (void*)binary, 820);
|
||||
u32 code_offset_1 = heap_space + 12;
|
||||
u32 code_offset_2 = heap_space + 88;
|
||||
u32 code_offset_3 = heap_space + 92;
|
||||
u32 code_offset_4 = heap_space + 264;
|
||||
u32 code_offset_5 = heap_space + 328;
|
||||
|
||||
|
||||
*((u32*)patch1_offset) = 0x48000000 + (((u32)(code_offset_1) - ((u32)(patch1_offset))) & 0x3ffffff);
|
||||
*((u32*)code_offset_2) = 0x48000000 + (((u32)(patch1_offset + 4) - ((u32)(code_offset_2))) & 0x3ffffff);
|
||||
*((u32*)patch2_offset) = 0x48000000 + (((u32)(code_offset_3) - ((u32)(patch2_offset))) & 0x3ffffff);
|
||||
*((u32*)code_offset_4) = 0x48000000 + (((u32)(patch2_offset + 4) - ((u32)(code_offset_4))) & 0x3ffffff);
|
||||
*((u32*)patch3_offset) = 0x48000000 + (((u32)(code_offset_5) - ((u32)(patch3_offset))) & 0x3ffffff);
|
||||
|
||||
// Patches successfully installed
|
||||
// returns 0 when all patching is done and game is ready to be booted.
|
||||
return 0;
|
||||
}
|
||||
|
||||
void domainpatcher(void *addr, u32 len, const char* domain)
|
||||
{
|
||||
if(strlen("nintendowifi.net") < strlen(domain))
|
||||
|
@ -13,6 +13,8 @@ void gamepatches(u8 videoSelected, u8 videoPatchDol, u8 aspectForce, u8 language
|
||||
u8 vipatch, u8 sneekVideoPatch, u8 hooktype, u64 returnTo, u8 privateServer);
|
||||
bool Anti_002_fix(u8 * Address, int Size);
|
||||
void PrivateServerPatcher(void *addr, u32 len, u8 privateServer);
|
||||
void PatchFix480p();
|
||||
u32 do_new_wiimmfi();
|
||||
void domainpatcher(void *addr, u32 len, const char* domain);
|
||||
bool NSMBPatch();
|
||||
bool PoPPatch();
|
||||
|
@ -188,6 +188,7 @@ bool CGameSettings::Save()
|
||||
fprintf(f, "game:%s = ", GameList[i].id);
|
||||
fprintf(f, "video:%d; ", GameList[i].video);
|
||||
fprintf(f, "videoPatchDol:%d; ", GameList[i].videoPatchDol);
|
||||
fprintf(f, "patchFix480p:%d; ", GameList[i].patchFix480p);
|
||||
fprintf(f, "aspectratio:%d; ", GameList[i].aspectratio);
|
||||
fprintf(f, "language:%d; ", GameList[i].language);
|
||||
fprintf(f, "ocarina:%d; ", GameList[i].ocarina);
|
||||
@ -258,11 +259,16 @@ bool CGameSettings::SetSetting(GameCFG & game, const char *name, const char *val
|
||||
game.video = atoi(value);
|
||||
return true;
|
||||
}
|
||||
if (strcmp(name, "videoPatchDol") == 0)
|
||||
else if (strcmp(name, "videoPatchDol") == 0)
|
||||
{
|
||||
game.videoPatchDol = atoi(value);
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(name, "patchFix480p") == 0)
|
||||
{
|
||||
game.patchFix480p = atoi(value);
|
||||
return true;
|
||||
}
|
||||
else if(strcmp(name, "aspectratio") == 0)
|
||||
{
|
||||
game.aspectratio = atoi(value);
|
||||
@ -646,6 +652,7 @@ void CGameSettings::SetDefault(GameCFG &game)
|
||||
memset(game.id, 0, sizeof(game.id));
|
||||
game.video = INHERIT;
|
||||
game.videoPatchDol = INHERIT;
|
||||
game.patchFix480p = INHERIT;
|
||||
game.aspectratio = INHERIT;
|
||||
game.language = INHERIT;
|
||||
game.ocarina = INHERIT;
|
||||
|
@ -12,6 +12,7 @@ typedef struct _GameCFG
|
||||
char id[7];
|
||||
short video;
|
||||
short videoPatchDol;
|
||||
short patchFix480p;
|
||||
short aspectratio;
|
||||
short language;
|
||||
short ocarina;
|
||||
@ -74,6 +75,7 @@ typedef struct _GameCFG
|
||||
memcpy(this->id, game.id, sizeof(game.id));
|
||||
this->video = game.video;
|
||||
this->videoPatchDol = game.videoPatchDol;
|
||||
this->patchFix480p = game.patchFix480p;
|
||||
this->aspectratio = game.aspectratio;
|
||||
this->language = game.language;
|
||||
this->ocarina = game.ocarina;
|
||||
@ -109,6 +111,8 @@ typedef struct _GameCFG
|
||||
this->NINVideoOffset = game.NINVideoOffset;
|
||||
this->NINRemlimit = game.NINRemlimit;
|
||||
this->NINArcadeMode = game.NINArcadeMode;
|
||||
this->NINCCRumble = game.NINCCRumble;
|
||||
this->NINSkipIPL = game.NINSkipIPL;
|
||||
this->NINMCEmulation = game.NINMCEmulation;
|
||||
this->NINMCSize = game.NINMCSize;
|
||||
this->NINUSBHID = game.NINUSBHID;
|
||||
|
@ -72,13 +72,13 @@ void CSettings::SetDefault()
|
||||
snprintf(WiinnertagPath, sizeof(WiinnertagPath), "%s", ConfigPath);
|
||||
snprintf(theme_path, sizeof(theme_path), "%stheme/", ConfigPath);
|
||||
snprintf(dolpath, sizeof(dolpath), "%s/", BootDevice);
|
||||
snprintf(NandEmuPath, sizeof(NandEmuPath), "%s/nand/", BootDevice);
|
||||
snprintf(NandEmuPath, sizeof(NandEmuPath), "%s/nands/01/", BootDevice);
|
||||
snprintf(DEVOLoaderPath, sizeof(DEVOLoaderPath), "%s/apps/gc_devo/", BootDevice);
|
||||
snprintf(NINLoaderPath, sizeof(NINLoaderPath), "%s/apps/nintendont/", BootDevice);
|
||||
strlcpy(NandEmuChanPath, NandEmuPath, sizeof(NandEmuChanPath));
|
||||
strlcpy(GameCubePath, "usb1:/games/", sizeof(GameCubePath));
|
||||
strlcpy(GameCubeSDPath, "sd:/games/", sizeof(GameCubeSDPath));
|
||||
strlcpy(CustomBannersURL, "http://nintendont.gxarena.com/banners/", sizeof(CustomBannersURL));
|
||||
strlcpy(CustomBannersURL, "http://banner.rc24.xyz/", sizeof(CustomBannersURL));
|
||||
theme[0] = 0;
|
||||
language_path[0] = 0;
|
||||
ogg_path[0] = 0;
|
||||
@ -94,6 +94,7 @@ void CSettings::SetDefault()
|
||||
videomode = VIDEO_MODE_DISCDEFAULT;
|
||||
videopatch = OFF;
|
||||
videoPatchDol = OFF;
|
||||
patchFix480p = OFF;
|
||||
language = CONSOLE_DEFAULT;
|
||||
ocarina = OFF;
|
||||
hddinfo = CLOCK_HR12;
|
||||
@ -107,7 +108,7 @@ void CSettings::SetDefault()
|
||||
gamesound = ON;
|
||||
parentalcontrol = PARENTAL_LVL_ADULT;
|
||||
LoaderIOS = BUILD_IOS;
|
||||
cios = BUILD_IOS;
|
||||
cios = 249;
|
||||
gridRows = 3;
|
||||
partition = 0;
|
||||
discart = DISCARTS_ORIGINALS_CUSTOMS;
|
||||
@ -302,6 +303,7 @@ bool CSettings::Save()
|
||||
fprintf(file, "videomode = %d\n", videomode);
|
||||
fprintf(file, "videopatch = %d\n", videopatch);
|
||||
fprintf(file, "videoPatchDol = %d\n", videoPatchDol);
|
||||
fprintf(file, "patchFix480p = %d\n", patchFix480p);
|
||||
fprintf(file, "language = %d\n", language);
|
||||
fprintf(file, "ocarina = %d\n", ocarina);
|
||||
fprintf(file, "hddinfo = %d\n", hddinfo);
|
||||
@ -504,6 +506,11 @@ bool CSettings::SetSetting(char *name, char *value)
|
||||
videoPatchDol = atoi(value);
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(name, "patchFix480p") == 0)
|
||||
{
|
||||
patchFix480p = atoi(value);
|
||||
return true;
|
||||
}
|
||||
else if (strcmp(name, "language") == 0)
|
||||
{
|
||||
language = atoi(value);
|
||||
@ -1225,10 +1232,12 @@ bool CSettings::SetSetting(char *name, char *value)
|
||||
}
|
||||
else if (strcmp(name, "CustomBannersURL") == 0)
|
||||
{
|
||||
// update banner URL
|
||||
if( strcmp(value, "http://dl.dropbox.com/u/101209384/") == 0 ||
|
||||
strcmp(value, "http://dl.dropboxusercontent.com/u/101209384/") == 0 ||
|
||||
strcmp(value, "http://copy.com/vRN3HgFVyk9u7YuB/Public/") == 0)
|
||||
strlcpy(CustomBannersURL, "http://nintendont.gxarena.com/banners/", sizeof(CustomBannersURL)); // update banner URL
|
||||
strcmp(value, "http://copy.com/vRN3HgFVyk9u7YuB/Public/") == 0 ||
|
||||
strcmp(value, "http://nintendont.gxarena.com/banners/") == 0) // Thanks to AbdallahTerro for this one and previous URLs
|
||||
strlcpy(CustomBannersURL, "http://banner.rc24.xyz/", sizeof(CustomBannersURL)); // Thanks to Larsenv
|
||||
else
|
||||
strlcpy(CustomBannersURL, value, sizeof(CustomBannersURL));
|
||||
return true;
|
||||
|
@ -95,6 +95,7 @@ class CSettings
|
||||
short ocarina;
|
||||
short videopatch;
|
||||
short videoPatchDol;
|
||||
short patchFix480p;
|
||||
short sinfo;
|
||||
short hddinfo;
|
||||
short rumble;
|
||||
|
@ -184,6 +184,7 @@ void GameLoadSM::SetOptionNames()
|
||||
Options->SetName(Idx++, "%s", tr( "Favorite Level" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Video Mode" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Dol Video Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "480p Pixel Fix Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Sneek Video Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "VIDTV Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Aspect Ratio" ));
|
||||
@ -237,6 +238,12 @@ void GameLoadSM::SetOptionValues()
|
||||
else
|
||||
Options->SetValue(Idx++, "%s", tr(VideoPatchDolText[GameConfig.videoPatchDol]));
|
||||
|
||||
//! Settings: 480p Pixel Fix Patch
|
||||
if(GameConfig.patchFix480p == INHERIT)
|
||||
Options->SetValue(Idx++, tr("Use global"));
|
||||
else
|
||||
Options->SetValue(Idx++, "%s", tr(OnOffText[GameConfig.patchFix480p]));
|
||||
|
||||
//! Settings: Sneek Video Patch
|
||||
if(GameConfig.sneekVideoPatch == INHERIT)
|
||||
Options->SetValue(Idx++, tr("Use global"));
|
||||
@ -411,6 +418,12 @@ int GameLoadSM::GetMenuInternal()
|
||||
if (++GameConfig.videoPatchDol >= VIDEO_PATCH_DOL_MAX) GameConfig.videoPatchDol = INHERIT;
|
||||
}
|
||||
|
||||
//! Settings: 480p Pixel Fix Patch
|
||||
else if (ret == ++Idx)
|
||||
{
|
||||
if (++GameConfig.patchFix480p >= MAX_ON_OFF) GameConfig.patchFix480p = INHERIT;
|
||||
}
|
||||
|
||||
//! Settings: Sneek Video Patch
|
||||
else if (ret == ++Idx)
|
||||
{
|
||||
|
@ -229,6 +229,7 @@ void LoaderSettings::SetOptionNames()
|
||||
|
||||
Options->SetName(Idx++, "%s", tr( "Video Mode" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Dol Video Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "480p Pixel Fix Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Sneek Video Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "VIDTV Patch" ));
|
||||
Options->SetName(Idx++, "%s", tr( "Aspect Ratio" ));
|
||||
@ -309,6 +310,9 @@ void LoaderSettings::SetOptionValues()
|
||||
//! Settings: Dol Video Patch
|
||||
Options->SetValue(Idx++, "%s", tr( VideoPatchDolText[Settings.videoPatchDol] ));
|
||||
|
||||
//! Settings: 480p Pixel Fix Patch
|
||||
Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.patchFix480p] ));
|
||||
|
||||
//! Settings: Sneek Video Patch
|
||||
Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.sneekVideoPatch] ));
|
||||
|
||||
@ -540,6 +544,14 @@ int LoaderSettings::GetMenuInternal()
|
||||
if (++Settings.videoPatchDol >= VIDEO_PATCH_DOL_MAX) Settings.videoPatchDol = 0;
|
||||
}
|
||||
|
||||
//! Settings: 480p Pixel Fix Patch
|
||||
if (ret == ++Idx)
|
||||
{
|
||||
if (++Settings.patchFix480p >= MAX_ON_OFF) Settings.patchFix480p = 0;
|
||||
if(Settings.patchFix480p)
|
||||
WindowPrompt(tr("Warning:"), tr("This patch might not work with all games. If a game doesn't boot, disable it in individual game settings menu."), tr("OK"));
|
||||
}
|
||||
|
||||
//! Settings: Sneek Video Patch
|
||||
else if (ret == ++Idx )
|
||||
{
|
||||
|
6
source/svnrev.c
Normal file
6
source/svnrev.c
Normal file
@ -0,0 +1,6 @@
|
||||
#define SVN_REV "1272"
|
||||
|
||||
const char *GetRev()
|
||||
{
|
||||
return SVN_REV;
|
||||
}
|
@ -46,6 +46,13 @@ void wiilight(int enable) // Toggle wiilight (thanks Bool for wiilight source)
|
||||
u8 shutdown = 0;
|
||||
u8 reset = 0;
|
||||
|
||||
/*
|
||||
* True if running from a WiiU Wii Virtual console channel.
|
||||
* Checked when initializing gamepad in input.c
|
||||
* Thanks to Fix94
|
||||
*/
|
||||
bool isWiiVC = false;
|
||||
|
||||
void __Sys_ResetCallback(void)
|
||||
{
|
||||
/* Reboot console */
|
||||
@ -302,5 +309,5 @@ void ScreenShot()
|
||||
*/
|
||||
bool isWiiU()
|
||||
{
|
||||
return ((*(vu32*)(0xCD8005A0) >> 16 ) == 0xCAFE);
|
||||
return (((*(vu32*)(0xCD8005A0) >> 16 ) == 0xCAFE) || isWiiVC);
|
||||
}
|
||||
|
@ -1,224 +0,0 @@
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// Copyright (C) 2010 Joseph Jordan <joe.ftpii@psychlaw.com.au>
|
||||
// Copyright (C) 2012-2013 damysteryman
|
||||
// Copyright (C) 2012-2015 Christopher Bratusek <nano@jpberlin.de>
|
||||
// Copyright (C) 2013 DarkMatterCore
|
||||
// Copyright (C) 2014 megazig
|
||||
// Copyright (C) 2015 FIX94
|
||||
|
||||
#include <gccore.h>
|
||||
#include <ogc/machine/processor.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "runtimeiospatch.h"
|
||||
|
||||
#define MEM_REG_BASE 0xd8b4000
|
||||
#define MEM_PROT (MEM_REG_BASE + 0x20a)
|
||||
|
||||
|
||||
static inline void disable_memory_protection(void) {
|
||||
write32(MEM_PROT, read32(MEM_PROT) & 0x0000FFFF);
|
||||
}
|
||||
|
||||
static const u8 di_readlimit_old[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0A, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
|
||||
0x7E, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08
|
||||
};
|
||||
static const u8 di_readlimit_patch[] = { 0x7e, 0xd4 };
|
||||
|
||||
static const u8 isfs_permissions_old[] = { 0x42, 0x8B, 0xD0, 0x01, 0x25, 0x66 };
|
||||
static const u8 isfs_permissions_patch[] = { 0x42, 0x8B, 0xE0, 0x01, 0x25, 0x66 };
|
||||
#if 0
|
||||
static const u8 setuid_old[] = { 0xD1, 0x2A, 0x1C, 0x39 };
|
||||
static const u8 setuid_patch[] = { 0x46, 0xC0 };
|
||||
#endif
|
||||
static const u8 es_identify_old[] = { 0x28, 0x03, 0xD1, 0x23 };
|
||||
static const u8 es_identify_patch[] = { 0x00, 0x00 };
|
||||
static const u8 hash_old[] = { 0x20, 0x07, 0x23, 0xA2 };
|
||||
static const u8 hash_patch[] = { 0x00 };
|
||||
static const u8 new_hash_old[] = { 0x20, 0x07, 0x4B, 0x0B };
|
||||
#if 0
|
||||
static const u8 addticket_vers_check[] = { 0xD2, 0x01, 0x4E, 0x56 };
|
||||
static const u8 addticket_patch[] = { 0xE0 };
|
||||
#endif
|
||||
static const u8 es_set_ahbprot_old[] = { 0x68, 0x5B, 0x22, 0xEC, 0x00, 0x52, 0x18, 0x9B, 0x68, 0x1B, 0x46, 0x98, 0x07, 0xDB };
|
||||
static const u8 es_set_ahbprot_patch[] = { 0x01 };
|
||||
|
||||
/* SSL patches made by FIX94 for Nintendont. Ported to libruntimeiospatch by DarkMatterCore */
|
||||
static const u8 ssl_patch1_old[] = { 0xFE, 0x0E, 0xE3, 0x50, 0x00, 0x00, 0x05, 0x9F };
|
||||
static const u8 ssl_patch1_new[] = { 0xFE, 0x0E, 0xE3, 0x28, 0xF1, 0x02, 0x05, 0x9F }; // Fixes SSL error -9 (wrong host)
|
||||
static const u8 ssl_patch2_old[] = { 0x00, 0x00, 0x0A, 0x00, 0x00, 0x09, 0xEA, 0x00 };
|
||||
static const u8 ssl_patch2_new[] = { 0x00, 0x00, 0xEA, 0x00, 0x00, 0x09, 0xEA, 0x00 }; // Fixes SSL error -10 (part 1) (wrong root cert)
|
||||
static const u8 ssl_patch3_old[] = { 0x00, 0x00, 0x1A, 0x00, 0x00, 0x08, 0xE3, 0xE0 };
|
||||
static const u8 ssl_patch3_new[] = { 0x00, 0x00, 0xEA, 0x00, 0x00, 0x08, 0xE3, 0xE0 }; // Fixes SSL error -10 (part 2) (wrong root cert)
|
||||
static const u8 ssl_patch4_old[] = { 0x00, 0x00, 0xDA, 0x00, 0x00, 0x16, 0xE7, 0x96 };
|
||||
static const u8 ssl_patch4_new[] = { 0x00, 0x00, 0xEA, 0x00, 0x00, 0x16, 0xE7, 0x96 }; // Fixes SSL error -11 (wrong client cert)
|
||||
|
||||
//Following patches added to iospatch.c by damysteryman, taken from sciifii v5
|
||||
static const u8 MEM2_prot_old[] = { 0xB5, 0x00, 0x4B, 0x09, 0x22, 0x01, 0x80, 0x1A, 0x22, 0xF0 };
|
||||
static const u8 MEM2_prot_patch[] = { 0xB5, 0x00, 0x4B, 0x09, 0x22, 0x00, 0x80, 0x1A, 0x22, 0xF0 };
|
||||
static const u8 ES_OpenTitleContent1_old[] = { 0x9D, 0x05, 0x42, 0x9D, 0xD0, 0x03 };
|
||||
static const u8 ES_OpenTitleContent1_patch[] = { 0x9D, 0x05, 0x42, 0x9D, 0xE0, 0x03 };
|
||||
static const u8 ES_OpenTitleContent2_old[] = { 0xD4, 0x01, 0x4C, 0x36, 0xE0, 0x3B };
|
||||
static const u8 ES_OpenTitleContent2_patch[] = { 0xE0, 0x01, 0x4C, 0x36, 0xE0, 0x3B };
|
||||
static const u8 ES_ReadContent_old[] = { 0xFC, 0x0F, 0xB5, 0x30, 0x1C, 0x14, 0x1C, 0x1D, 0x4B,
|
||||
0x0E, 0x68, 0x9B, 0x2B, 0x00, 0xD0, 0x03, 0x29, 0x00, 0xDB, 0x01,
|
||||
0x29, 0x0F, 0xDD, 0x01 };
|
||||
static const u8 ES_ReadContent_patch[] = { 0xFC, 0x0F, 0xB5, 0x30, 0x1C, 0x14, 0x1C, 0x1D, 0x4B,
|
||||
0x0E, 0x68, 0x9B, 0x2B, 0x00, 0x46, 0xC0, 0x29, 0x00, 0x46, 0xC0,
|
||||
0x29, 0x0F, 0xE0, 0x01 };
|
||||
static const u8 ES_CloseContent_old[] = { 0xB5, 0x10, 0x4B, 0x10, 0x68, 0x9B, 0x2B, 0x00, 0xD0,
|
||||
0x03, 0x29, 0x00, 0xDB, 0x01, 0x29, 0x0F, 0xDD, 0x01 };
|
||||
static const u8 ES_CloseContent_patch[] = { 0xB5, 0x10, 0x4B, 0x10, 0x68, 0x9B, 0x2B, 0x00, 0x46,
|
||||
0xC0, 0x29, 0x00, 0x46, 0xC0, 0x29, 0x0F, 0xE0, 0x01 };
|
||||
static const u8 ES_TitleVersionCheck_old[] = { 0xD2, 0x01, 0x4E, 0x56 };
|
||||
static const u8 ES_TitleVersionCheck_patch[] = { 0xE0, 0x01, 0x4E, 0x56 };
|
||||
static const u8 ES_TitleDeleteCheck_old[] = { 0xD8, 0x00, 0x4A, 0x04 };
|
||||
static const u8 ES_TitleDeleteCheck_patch[] = { 0xE0, 0x00, 0x4A, 0x04 };
|
||||
|
||||
//Following set of patches made by damysteryman for use with Wii U's vWii
|
||||
static const u8 Kill_AntiSysTitleInstallv3_pt1_old[] = { 0x68, 0x1A, 0x2A, 0x01, 0xD0, 0x05 }; // Make sure that the pt1
|
||||
static const u8 Kill_AntiSysTitleInstallv3_pt1_patch[] = { 0x68, 0x1A, 0x2A, 0x01, 0x46, 0xC0 }; // patch is applied twice. -dmm
|
||||
static const u8 Kill_AntiSysTitleInstallv3_pt2_old[] = { 0xD0, 0x02, 0x33, 0x06, 0x42, 0x9A, 0xD1, 0x01 }; // Make sure that the pt2 patch
|
||||
static const u8 Kill_AntiSysTitleInstallv3_pt2_patch[] = { 0x46, 0xC0, 0x33, 0x06, 0x42, 0x9A, 0xE0, 0x01 }; // is also applied twice. -dmm
|
||||
static const u8 Kill_AntiSysTitleInstallv3_pt3_old[] = { 0x68, 0xFB, 0x2B, 0x00, 0xDB, 0x01 };
|
||||
static const u8 Kill_AntiSysTitleInstallv3_pt3_patch[] = { 0x68, 0xFB, 0x2B, 0x00, 0xDB, 0x10 };
|
||||
|
||||
/* ISFS_SetAttr patches made by megazig */
|
||||
#if 0
|
||||
static const u8 isfs_setattr_pt1_old[] = { 0x42, 0xAB, 0xD0, 0x02, 0x20, 0x66 };
|
||||
static const u8 isfs_setattr_pt1_patch[] = { 0x42, 0xAB, 0xE0, 0x02, 0x20, 0x66 };
|
||||
static const u8 isfs_setattr_pt2_old[] = { 0x2D, 0x00, 0xD0, 0x02, 0x20, 0x66 };
|
||||
static const u8 isfs_setattr_pt2_patch[] = { 0x2D, 0x00, 0xE0, 0x02, 0x20, 0x66 };
|
||||
#endif
|
||||
|
||||
static u8 apply_patch(const char *name, const u8 *old, u32 old_size, const u8 *patch, size_t patch_size, u32 patch_offset, bool verbose) {
|
||||
u8 *ptr_start = (u8*)*((u32*)0x80003134), *ptr_end = (u8*)0x94000000;
|
||||
u8 found = 0;
|
||||
if(verbose)
|
||||
printf(" Patching %-30s", name);
|
||||
u8 *location = NULL;
|
||||
while (ptr_start < (ptr_end - patch_size)) {
|
||||
if (!memcmp(ptr_start, old, old_size)) {
|
||||
found++;
|
||||
location = ptr_start + patch_offset;
|
||||
u8 *start = location;
|
||||
u32 i;
|
||||
for (i = 0; i < patch_size; i++) {
|
||||
*location++ = patch[i];
|
||||
}
|
||||
DCFlushRange((u8 *)(((u32)start) >> 5 << 5), (patch_size >> 5 << 5) + 64);
|
||||
ICInvalidateRange((u8 *)(((u32)start) >> 5 << 5), (patch_size >> 5 << 5) + 64);
|
||||
}
|
||||
ptr_start++;
|
||||
}
|
||||
if(verbose){
|
||||
if (found)
|
||||
printf(" patched\n");
|
||||
else
|
||||
printf(" not patched\n");
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
s32 IosPatch_AHBPROT(bool verbose) {
|
||||
if (AHBPROT_DISABLED) {
|
||||
disable_memory_protection();
|
||||
s32 ret = apply_patch("es_set_ahbprot", es_set_ahbprot_old, sizeof(es_set_ahbprot_old), es_set_ahbprot_patch, sizeof(es_set_ahbprot_patch), 25, verbose);
|
||||
if (ret)
|
||||
return ret;
|
||||
else
|
||||
return ERROR_PATCH;
|
||||
}
|
||||
return ERROR_AHBPROT;
|
||||
}
|
||||
|
||||
s32 IosPatch_RUNTIME(bool wii, bool sciifii, bool vwii, bool verbose) {
|
||||
s32 count = 0;
|
||||
|
||||
if (AHBPROT_DISABLED) {
|
||||
disable_memory_protection();
|
||||
if(wii)
|
||||
{
|
||||
if(verbose) printf(">> Applying standard Wii patches:\n");
|
||||
count += apply_patch("di_readlimit", di_readlimit_old, sizeof(di_readlimit_old), di_readlimit_patch, sizeof(di_readlimit_patch), 12, verbose);
|
||||
count += apply_patch("isfs_permissions", isfs_permissions_old, sizeof(isfs_permissions_old), isfs_permissions_patch, sizeof(isfs_permissions_patch), 0, verbose);
|
||||
//count += apply_patch("es_setuid", setuid_old, sizeof(setuid_old), setuid_patch, sizeof(setuid_patch), 0, verbose);
|
||||
count += apply_patch("es_identify", es_identify_old, sizeof(es_identify_old), es_identify_patch, sizeof(es_identify_patch), 2, verbose);
|
||||
count += apply_patch("hash_check", hash_old, sizeof(hash_old), hash_patch, sizeof(hash_patch), 1, verbose);
|
||||
count += apply_patch("new_hash_check", new_hash_old, sizeof(new_hash_old), hash_patch, sizeof(hash_patch), 1, verbose);
|
||||
//count += apply_patch("isfs_setattr_pt1", isfs_setattr_pt1_old, sizeof(isfs_setattr_pt1_old), isfs_setattr_pt1_patch, sizeof(isfs_setattr_pt1_patch), 0, verbose);
|
||||
//count += apply_patch("isfs_setattr_pt2", isfs_setattr_pt2_old, sizeof(isfs_setattr_pt2_old), isfs_setattr_pt2_patch, sizeof(isfs_setattr_pt2_patch), 0, verbose);
|
||||
//count += apply_patch("ssl_patch1", ssl_patch1_old, sizeof(ssl_patch1_old), ssl_patch1_new, sizeof(ssl_patch1_new), 0, verbose);
|
||||
//count += apply_patch("ssl_patch2", ssl_patch2_old, sizeof(ssl_patch2_old), ssl_patch2_new, sizeof(ssl_patch2_new), 0, verbose);
|
||||
//count += apply_patch("ssl_patch3", ssl_patch3_old, sizeof(ssl_patch3_old), ssl_patch3_new, sizeof(ssl_patch3_new), 0, verbose);
|
||||
//count += apply_patch("ssl_patch4", ssl_patch4_old, sizeof(ssl_patch4_old), ssl_patch4_new, sizeof(ssl_patch4_new), 0, verbose);
|
||||
}
|
||||
if(sciifii)
|
||||
{
|
||||
if(verbose) printf(">> Applying Sciifii patches:\n");
|
||||
count += apply_patch("MEM2_prot", MEM2_prot_old, sizeof(MEM2_prot_old), MEM2_prot_patch, sizeof(MEM2_prot_patch), 0, verbose);
|
||||
count += apply_patch("ES_OpenTitleContent1", ES_OpenTitleContent1_old, sizeof(ES_OpenTitleContent1_old), ES_OpenTitleContent1_patch, sizeof(ES_OpenTitleContent1_patch), 0, verbose);
|
||||
count += apply_patch("ES_OpenTitleContent2", ES_OpenTitleContent2_old, sizeof(ES_OpenTitleContent2_old), ES_OpenTitleContent2_patch, sizeof(ES_OpenTitleContent2_patch), 0, verbose);
|
||||
count += apply_patch("ES_ReadContent_prot", ES_ReadContent_old, sizeof(ES_ReadContent_old), ES_ReadContent_patch, sizeof(ES_ReadContent_patch), 0, verbose);
|
||||
count += apply_patch("ES_CloseContent", ES_CloseContent_old, sizeof(ES_CloseContent_old), ES_CloseContent_patch, sizeof(ES_CloseContent_patch), 0, verbose);
|
||||
count += apply_patch("ES_TitleVersionCheck", ES_TitleVersionCheck_old, sizeof(ES_TitleVersionCheck_old), ES_TitleVersionCheck_patch, sizeof(ES_TitleVersionCheck_patch), 0, verbose);
|
||||
count += apply_patch("ES_TitleDeleteCheck", ES_TitleDeleteCheck_old, sizeof(ES_TitleDeleteCheck_old), ES_TitleDeleteCheck_patch, sizeof(ES_TitleDeleteCheck_patch), 0, verbose);
|
||||
}
|
||||
if(vwii)
|
||||
{
|
||||
if(verbose) printf(">> Applying vWii patches:\n");
|
||||
count += apply_patch("Kill_AntiSysTitleInstallv3_pt1", Kill_AntiSysTitleInstallv3_pt1_old, sizeof(Kill_AntiSysTitleInstallv3_pt1_old), Kill_AntiSysTitleInstallv3_pt1_patch, sizeof(Kill_AntiSysTitleInstallv3_pt1_patch), 0, verbose);
|
||||
count += apply_patch("Kill_AntiSysTitleInstallv3_pt2", Kill_AntiSysTitleInstallv3_pt2_old, sizeof(Kill_AntiSysTitleInstallv3_pt2_old), Kill_AntiSysTitleInstallv3_pt2_patch, sizeof(Kill_AntiSysTitleInstallv3_pt2_patch), 0, verbose);
|
||||
count += apply_patch("Kill_AntiSysTitleInstallv3_pt3", Kill_AntiSysTitleInstallv3_pt3_old, sizeof(Kill_AntiSysTitleInstallv3_pt3_old), Kill_AntiSysTitleInstallv3_pt3_patch, sizeof(Kill_AntiSysTitleInstallv3_pt3_patch), 0, verbose);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
return ERROR_AHBPROT;
|
||||
}
|
||||
|
||||
s32 IosPatch_FULL(bool wii, bool sciifii, bool vwii, bool verbose, int IOS) {
|
||||
s32 ret = 0;
|
||||
s32 xret = 0;
|
||||
|
||||
if (AHBPROT_DISABLED)
|
||||
ret = IosPatch_AHBPROT(verbose);
|
||||
else
|
||||
return ERROR_AHBPROT;
|
||||
|
||||
if (ret) {
|
||||
IOS_ReloadIOS(IOS);
|
||||
xret = IosPatch_RUNTIME(wii, sciifii, vwii, verbose);
|
||||
} else {
|
||||
xret = ERROR_PATCH;
|
||||
}
|
||||
|
||||
return xret;
|
||||
|
||||
}
|
||||
|
||||
s32 IosPatch_SSL(bool verbose) {
|
||||
s32 count = 0;
|
||||
|
||||
if (AHBPROT_DISABLED) {
|
||||
disable_memory_protection();
|
||||
if(verbose) printf(">> Applying SSL patches:\n");
|
||||
count += apply_patch("ssl_patch1", ssl_patch1_old, sizeof(ssl_patch1_old), ssl_patch1_new, sizeof(ssl_patch1_new), 0, verbose);
|
||||
count += apply_patch("ssl_patch2", ssl_patch2_old, sizeof(ssl_patch2_old), ssl_patch2_new, sizeof(ssl_patch2_new), 0, verbose);
|
||||
count += apply_patch("ssl_patch3", ssl_patch3_old, sizeof(ssl_patch3_old), ssl_patch3_new, sizeof(ssl_patch3_new), 0, verbose);
|
||||
count += apply_patch("ssl_patch4", ssl_patch4_old, sizeof(ssl_patch4_old), ssl_patch4_new, sizeof(ssl_patch4_new), 0, verbose);
|
||||
return count;
|
||||
}
|
||||
return ERROR_AHBPROT;
|
||||
}
|
@ -20,7 +20,7 @@
|
||||
#include "mload/mload.h"
|
||||
#include "mload/mload_modules.h"
|
||||
#include "system/IosLoader.h"
|
||||
#include "system/runtimeiospatch.h"
|
||||
#include "libs/libruntimeiospatch/runtimeiospatch.h"
|
||||
#include "Controls/DeviceHandler.hpp"
|
||||
#include "Channels/channels.h"
|
||||
#include "usbloader/disc.h"
|
||||
@ -59,6 +59,7 @@
|
||||
//appentrypoint has to be global because of asm
|
||||
u32 AppEntrypoint = 0;
|
||||
|
||||
extern bool isWiiVC; // in sys.cpp
|
||||
extern u32 hdd_sector_size[2];
|
||||
extern "C"
|
||||
{
|
||||
@ -255,6 +256,7 @@ int GameBooter::BootGame(struct discHdr *gameHdr)
|
||||
GameCFG * game_cfg = GameSettings.GetGameCFG(gameHeader.id);
|
||||
u8 videoChoice = game_cfg->video == INHERIT ? Settings.videomode : game_cfg->video;
|
||||
u8 videoPatchDolChoice = game_cfg->videoPatchDol == INHERIT ? Settings.videoPatchDol : game_cfg->videoPatchDol;
|
||||
u8 patchFix480pChoice = game_cfg->patchFix480p == INHERIT ? Settings.patchFix480p : game_cfg->patchFix480p;
|
||||
u8 aspectChoice = game_cfg->aspectratio == INHERIT ? Settings.GameAspectRatio : game_cfg->aspectratio;
|
||||
u8 languageChoice = game_cfg->language == INHERIT ? Settings.language : game_cfg->language;
|
||||
u8 ocarinaChoice = game_cfg->ocarina == INHERIT ? Settings.ocarina : game_cfg->ocarina;
|
||||
@ -312,7 +314,7 @@ int GameBooter::BootGame(struct discHdr *gameHdr)
|
||||
if(IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4))
|
||||
{
|
||||
gprintf("Patching IOS%d...\n", IOS_GetVersion());
|
||||
if (IosPatch_RUNTIME(true, false, false, false) == ERROR_PATCH)
|
||||
if (IosPatch_RUNTIME(true, false, false, false, false) == ERROR_PATCH)
|
||||
gprintf("Patching %sIOS%d failed!\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion());
|
||||
}
|
||||
|
||||
@ -415,11 +417,55 @@ int GameBooter::BootGame(struct discHdr *gameHdr)
|
||||
|
||||
//! Do all the game patches
|
||||
gprintf("Applying game patches...\n");
|
||||
gamepatches(videoChoice, videoPatchDolChoice, aspectChoice, languageChoice, countrystrings, viChoice, sneekChoice, Hooktype, returnToChoice, PrivServChoice);
|
||||
|
||||
|
||||
//! Now this code block is responsible for the private server patch
|
||||
//! and the gecko code handler loading
|
||||
|
||||
//! If a server other than Wiimmfi is selected, do the normal patching
|
||||
//! If Wiimmfi is selected for other games than MKWii, do normal patching as well
|
||||
//! If Wiimmfi is selected for MKWii, skip normal patching (PRIVSERV_OFF)
|
||||
//! and let the new code in do_new_wiimmfi() handle the complete server patch
|
||||
|
||||
//! Also, the new Wiimmfi server patch should be loaded into memory after
|
||||
//! the code handler and the cheat codes.
|
||||
|
||||
if (PrivServChoice != PRIVSERV_WIIMMFI || memcmp(((void *)(0x80000000)), (char*)"RMC", 3) != 0) {
|
||||
//! Either the server is not Wiimmfi, or, if it is Wiimmfi, the game isn't MKWii - patch the old way
|
||||
gamepatches(videoChoice, videoPatchDolChoice, aspectChoice, languageChoice, countrystrings, viChoice, sneekChoice, Hooktype, returnToChoice, PrivServChoice);
|
||||
}
|
||||
else {
|
||||
//! Wiimmfi patch for Mario Kart Wii - patch with PRIVSERV_OFF and handle all the patching within do_new_wiimmfi()
|
||||
gamepatches(videoChoice, videoPatchDolChoice, aspectChoice, languageChoice, countrystrings, viChoice, sneekChoice, Hooktype, returnToChoice, PRIVSERV_OFF);
|
||||
}
|
||||
|
||||
|
||||
//! Load Code handler if needed
|
||||
load_handler(Hooktype, WiirdDebugger, Settings.WiirdDebuggerPause);
|
||||
|
||||
|
||||
//! Perform 480p fix if needed.
|
||||
//! Needs to be done after the call to gamepatches(), after loading any code handler.
|
||||
//! Can (and should) be done before Wiimmfi patching, can't be done in gamepatches() itself.
|
||||
if(patchFix480pChoice)
|
||||
PatchFix480p();
|
||||
|
||||
//! New Wiimmfi patch should be loaded last, after the codehandler, just before the call to the entry point
|
||||
if (PrivServChoice == PRIVSERV_WIIMMFI && memcmp(((void *)(0x80000000)), (char*)"RMC", 3) == 0 ) {
|
||||
// all the cool new Wiimmfi stuff:
|
||||
switch(do_new_wiimmfi()) {
|
||||
case 0:
|
||||
gprintf("Wiimmfi patch for Mario Kart Wii successful.\n");
|
||||
break;
|
||||
case -1:
|
||||
gprintf("Could not determine game region for Wiimmfi patch - make sure the fourth char of the ID is one of [PEJK].\n");
|
||||
break;
|
||||
case -2:
|
||||
gprintf("This image is already patched for Wiimmfi, no need to do so again.\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//! Jump to the entrypoint of the game - the last function of the USB Loader
|
||||
gprintf("Jumping to game entrypoint: 0x%08X.\n", AppEntrypoint);
|
||||
return Disc_JumpToEntrypoint(Hooktype, WDMMenu::GetDolParameter());
|
||||
@ -1424,9 +1470,9 @@ int GameBooter::BootNintendont(struct discHdr *gameHdr)
|
||||
if(ninArcadeModeChoice)
|
||||
nin_config->Config |= NIN_CFG_ARCADE_MODE; // v4.424+ Triforce Arcade Mode
|
||||
if (ninCCRumbleChoice)
|
||||
nin_config->Config |= NIN_CFG_CC_RUMBLE; // v4.424+ Classic Controller Rumble
|
||||
nin_config->Config |= NIN_CFG_CC_RUMBLE; // v4.431+ Classic Controller Rumble
|
||||
if (ninSkipIPLChoice)
|
||||
nin_config->Config |= NIN_CFG_SKIP_IPL; // v4.424+ Skip Gamecube BIOS
|
||||
nin_config->Config |= NIN_CFG_SKIP_IPL; // v4.435+ Skip Gamecube BIOS
|
||||
|
||||
// Max Pads
|
||||
nin_config->MaxPads = ninMaxPadsChoice; // NIN_CFG_VERSION 2 r42
|
||||
@ -1502,6 +1548,14 @@ int GameBooter::BootNintendont(struct discHdr *gameHdr)
|
||||
}
|
||||
gprintf("NIN: Language 0x%08x \n", nin_config->Language);
|
||||
|
||||
|
||||
// if WiiVC, force creation and use of nincfg.bin file to fix a nintendont bug if HID is connected before launching it.
|
||||
if(isWiiVC)
|
||||
{
|
||||
ninSettingsChoice = ON;
|
||||
NINArgsboot = OFF;
|
||||
}
|
||||
|
||||
// Delete existing nincfg.bin files
|
||||
if(ninSettingsChoice == OFF)
|
||||
{
|
||||
|
@ -18,7 +18,6 @@ void __Wpad_PowerCallback(s32 chan)
|
||||
|
||||
s32 Wpad_Init(void)
|
||||
{
|
||||
WUPC_Init();
|
||||
s32 ret;
|
||||
|
||||
/* Initialize Wiimote subsystem */
|
||||
@ -40,7 +39,6 @@ void Wpad_Disconnect(void)
|
||||
WPAD_Disconnect(cnt);
|
||||
|
||||
/* Shutdown Wiimote subsystem */
|
||||
WUPC_Shutdown();
|
||||
WPAD_Shutdown();
|
||||
}
|
||||
|
||||
@ -66,13 +64,11 @@ u32 ButtonsHold(void)
|
||||
|
||||
int i;
|
||||
u32 buttons = 0;
|
||||
WUPC_UpdateButtonStats();
|
||||
WPAD_ScanPads();
|
||||
PAD_ScanPads();
|
||||
|
||||
for (i = 3; i >= 0; i--)
|
||||
{
|
||||
buttons |= WUPC_ButtonsHeld(i);
|
||||
buttons |= PAD_ButtonsHeld(i);
|
||||
buttons |= WPAD_ButtonsHeld(i);
|
||||
}
|
||||
@ -83,13 +79,11 @@ u32 ButtonsPressed(void)
|
||||
{
|
||||
int i;
|
||||
u32 buttons = 0;
|
||||
WUPC_UpdateButtonStats();
|
||||
WPAD_ScanPads();
|
||||
PAD_ScanPads();
|
||||
|
||||
for (i = 3; i >= 0; i--)
|
||||
{
|
||||
buttons |= WUPC_ButtonsDown(i);
|
||||
buttons |= PAD_ButtonsDown(i);
|
||||
buttons |= WPAD_ButtonsDown(i);
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
#define _WPAD_H_
|
||||
|
||||
#include <wiiuse/wpad.h>
|
||||
#include <wupc/wupc.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
|
Loading…
Reference in New Issue
Block a user