diff --git a/Languages/czech.lang b/Languages/czech.lang index 277b9464..fd429d95 100644 --- a/Languages/czech.lang +++ b/Languages/czech.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Adresár neexistuje!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "Vynutit PAL50" msgid "Force PAL60" msgstr "Vynutit PAL60" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID hry" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "Název hry [IdHry]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Hry" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Obnovit hudbu na pozadí" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Spouštec kanálu" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Odinstalace" diff --git a/Languages/danish.lang b/Languages/danish.lang index 893dde04..fc340f13 100644 --- a/Languages/danish.lang +++ b/Languages/danish.lang @@ -344,6 +344,9 @@ msgstr "Cache BNR Filer" msgid "Cache BNR Files Path" msgstr "Sti til Cache BNR Filer" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Cache titler" @@ -639,6 +642,9 @@ msgstr "Devolution's loader.bin filen kunne ikke loades." msgid "Directory does not exist!" msgstr "Mappen eksisterer ikke!" +msgid "Disc" +msgstr "Disk" + msgid "Disc 1" msgstr "Disk 1" @@ -1011,9 +1017,6 @@ msgstr "Tving PAL50" msgid "Force PAL60" msgstr "Tving PAL60" -msgid "Force Titles from Disc" -msgstr "Tving Titler fra Disk" - msgid "Force Widescreen" msgstr "Tving Widescreen" @@ -1104,9 +1107,6 @@ msgstr "GameCube Spil Slet" msgid "GameCube Install Menu" msgstr "GameCube Installations Menu" -msgid "Game Header Cache Files Path" -msgstr "Sti til Spil Header Cache filer" - msgid "Game ID" msgstr "Spil-ID" @@ -1167,6 +1167,9 @@ msgstr "GameCube Kilde" msgid "Gamename [GAMEID]" msgstr "Spilnavn [SPILID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Spil" @@ -1848,8 +1851,8 @@ msgstr "Nulstil Alle Spilindstillinger" msgid "Reset BG Music" msgstr "Nulstil BG-musik" -msgid "Reset Game Header Cache" -msgstr "Nulstil Spilheader Cache" +msgid "Reset Cached Titles" +msgstr "" msgid "Reset Playcounter" msgstr "Nulstil spiltæller" @@ -2185,8 +2188,8 @@ msgstr "Titel-starter" msgid "Titles Path" msgstr "Titler Sti" -msgid "Titles from GameTDB" -msgstr "Titler fra GameTDB" +msgid "Titles From" +msgstr "Titler Fra" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "For at køre GameCube spil fra Disken skal du sætte GameCube-tilstanden til MIOS i spilindstillingerne." @@ -2280,9 +2283,6 @@ msgstr "USBloaderGX kunne ikke skrive en Nintendont config fil. Vil du starte Ni msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "USBloaderGX r1218 kræves for Nintendont Alpha v0.1. Opdater venligst din Nintendont boot.dol version." -msgid "Use Game Header Cache" -msgstr "Brug Game Header Cache" - msgid "Uninstall" msgstr "Afinstallér" diff --git a/Languages/dutch.lang b/Languages/dutch.lang index 451847cb..be59f19a 100644 --- a/Languages/dutch.lang +++ b/Languages/dutch.lang @@ -344,6 +344,9 @@ msgstr "Cache BNR Bestanden" msgid "Cache BNR Files Path" msgstr "Cache BNR Bestandspad" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Titels cachen" @@ -639,11 +642,14 @@ msgstr "Devolution's loader.bin bestand kan niet worden geladen." msgid "Directory does not exist!" msgstr "Map bestaat niet!" +msgid "Disc" +msgstr "" + msgid "Disc 1" -msgstr "Disc 1" +msgstr "" msgid "Disc 2" -msgstr "Disc 2" +msgstr "" msgid "Disc Artwork Download" msgstr "Download disk labels" @@ -1011,9 +1017,6 @@ msgstr "Forceer PAL50" msgid "Force PAL60" msgstr "Forceer PAL60" -msgid "Force Titles from Disc" -msgstr "Forceer titels van Disk" - msgid "Force Widescreen" msgstr "Forceer Breedbeeld" @@ -1104,9 +1107,6 @@ msgstr "GameCube Spel Verwijderen" msgid "GameCube Install Menu" msgstr "GameCube Installatie Menu" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Spel ID" @@ -1167,6 +1167,9 @@ msgstr "GameCube Bron" msgid "Gamename [GAMEID]" msgstr "Spelnaam [SPELID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Spellen" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Reset achtergrond muziek" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Titel Launcher" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "Titels van GameTDB" +msgid "Titles From" +msgstr "Titels Van" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Om GameCube spellen vanaf disk te spelen moet je de GameCube modus op MIOS zetten in de spel instellingen." @@ -2280,9 +2283,6 @@ msgstr "USBLoaderGX kon Nintendont config bestand niet schrijven. Nintendont toc msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Verwijderen" diff --git a/Languages/english.lang b/Languages/english.lang index bb601b75..39ed0dea 100644 --- a/Languages/english.lang +++ b/Languages/english.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "" diff --git a/Languages/finnish.lang b/Languages/finnish.lang index 9246841a..e0af88c0 100644 --- a/Languages/finnish.lang +++ b/Languages/finnish.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Peli ID" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Pelejä" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Nimilaukaisin" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Poista" diff --git a/Languages/french.lang b/Languages/french.lang index 04ab90aa..4ad8e76d 100644 --- a/Languages/french.lang +++ b/Languages/french.lang @@ -344,6 +344,9 @@ msgstr "Fichiers BNR en cache" msgid "Cache BNR Files Path" msgstr "Dossier de cache BNR" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Titres en cache" @@ -639,6 +642,9 @@ msgstr "Le fichier loader.bin de Devolution n'a pu être chargé." msgid "Directory does not exist!" msgstr "Répertoire inexistant!" +msgid "Disc" +msgstr "Disque" + msgid "Disc 1" msgstr "Disque 1" @@ -1011,9 +1017,6 @@ msgstr "Forcer PAL50" msgid "Force PAL60" msgstr "Forcer PAL60" -msgid "Force Titles from Disc" -msgstr "Forcer charg. titres du disque" - msgid "Force Widescreen" msgstr "Forcer 16:9" @@ -1104,9 +1107,6 @@ msgstr "Menu de suppression GameCube" msgid "GameCube Install Menu" msgstr "Menu d'installation GameCube" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID du jeu" @@ -1167,6 +1167,9 @@ msgstr "Source GameCube" msgid "Gamename [GAMEID]" msgstr "NomJeu [IDJEU]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Jeux" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Fond sonore par defaut" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Menu Chaînes" msgid "Titles Path" msgstr "Dossier titres" -msgid "Titles from GameTDB" -msgstr "Titres de GameTDB" +msgid "Titles From" +msgstr "Titres de" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Pour lancer les jeux GameCube à partir du disque vous devez placer le Mode GameCube sur MIOS dans les paramètres du jeu." @@ -2280,9 +2283,6 @@ msgstr "USBLoaderGX n'a pas pu créer le fichier de configuration de Nintendont. msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "Nintendont Alpha v0.1 ne fonctionne qu'avec USBLoaderGX r1218. Veuillez mettre à jour votre version de Nintendont." -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Désinstaller" diff --git a/Languages/german.lang b/Languages/german.lang index 9839b715..7bbeb5d4 100644 --- a/Languages/german.lang +++ b/Languages/german.lang @@ -344,6 +344,9 @@ msgstr "BNR-Cache" msgid "Cache BNR Files Path" msgstr "Cache BNR Dateien" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Titel cachen" @@ -639,6 +642,9 @@ msgstr "Devolution's loader.bin Datei kann nicht geladen werden." msgid "Directory does not exist!" msgstr "Verzeichnis existiert nicht!" +msgid "Disc" +msgstr "Disk" + msgid "Disc 1" msgstr "Disk 1" @@ -1011,9 +1017,6 @@ msgstr "PAL50 erzw." msgid "Force PAL60" msgstr "PAL60 erzw." -msgid "Force Titles from Disc" -msgstr "Erzwinge DVD-Titel" - msgid "Force Widescreen" msgstr "Erzwinge Widescreen" @@ -1104,9 +1107,6 @@ msgstr "GameCube Spiele Löschen" msgid "GameCube Install Menu" msgstr "GameCube Installationsmenü" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Spiel ID" @@ -1167,6 +1167,9 @@ msgstr "GameCube Quelle" msgid "Gamename [GAMEID]" msgstr "Spielname [SPIELID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Spiele" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Musik zurücksetzen" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Channel Launcher" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "Namen aus der WiiTDB" +msgid "Titles From" +msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Um GameCube Spiele von DVD zu starten, muss der GameCube Modus in den Spieleinstellungen auf MIOS gesetzt werden." @@ -2280,9 +2283,6 @@ msgstr "USBLoaderGX konnte die Nintendont config Dateien nicht ändern. Nintendo msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "USBLoaderGX r1218 wird benötigt um Nintendont Alpha v0.1 starten zu können. Bitte aktualisiere deine Nintendont Version." -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Deinstallieren" diff --git a/Languages/greek.lang b/Languages/greek.lang index 449cee4e..b47b2948 100644 --- a/Languages/greek.lang +++ b/Languages/greek.lang @@ -344,6 +344,9 @@ msgstr "αποθήκευση αρχείων BNR" msgid "Cache BNR Files Path" msgstr "αποθήκευση τοποθεσίας αρχείων BNR" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Αποθήκευση τίτλων" @@ -639,6 +642,9 @@ msgstr "Το αρχείο loader.bin του devolution δεν φορτώθηκε msgid "Directory does not exist!" msgstr "Ο φάκελος δεν υπάρχει!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "Επιβολή PAL50" msgid "Force PAL60" msgstr "Επιβολή PAL60" -msgid "Force Titles from Disc" -msgstr "Επιβολή ονόματος από το ίδιο το παιχνίδι" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "Διαγραφή παιχνιδιών GameCube" msgid "GameCube Install Menu" msgstr "menu εγκατάστασης παιχνιδιών GameCube" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID παιχνιδιού" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "όνομα παιχνιδιού [κωδικόςπαιχνιδιού]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Παιχνίδια" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Επαναφορά μουσικής υπόκρουσης." -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Εκκινητής τίτλων" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "Τίτλοι από το GameTDB" +msgid "Titles From" +msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Για αναπαραγωγή τίτλων Gamecube από τους αυθεντικούς δίσκους τους, πρέπει να ορίσετε την επιλογή GameCube σε ΜΙΟS, στις ρυθμίσεις κάθε τίτλου." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Απεγκατάσταση" diff --git a/Languages/hungarian.lang b/Languages/hungarian.lang index b6a55111..912551dc 100644 --- a/Languages/hungarian.lang +++ b/Languages/hungarian.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "A könyvtár nem létezik!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Játék ID" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Játékok" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Programindító" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." diff --git a/Languages/italian.lang b/Languages/italian.lang index c568e05b..88d09989 100644 --- a/Languages/italian.lang +++ b/Languages/italian.lang @@ -344,6 +344,9 @@ msgstr "Cache file BNR" msgid "Cache BNR Files Path" msgstr "Percorso cache file BNR" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Cache titoli" @@ -639,6 +642,9 @@ msgstr "Impossibile caricare il file loader.bin di Devolution." msgid "Directory does not exist!" msgstr "Il percorso non esiste!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "Disco 1" @@ -1011,9 +1017,6 @@ msgstr "Forza PAL50" msgid "Force PAL60" msgstr "Forza PAL60" -msgid "Force Titles from Disc" -msgstr "Forza titolo da disco" - msgid "Force Widescreen" msgstr "Forza Widescreen" @@ -1104,9 +1107,6 @@ msgstr "Menu disinstallazioni GC" msgid "GameCube Install Menu" msgstr "Menu installazioni GC" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID gioco" @@ -1167,6 +1167,9 @@ msgstr "Sorgente GameCube" msgid "Gamename [GAMEID]" msgstr "Nomegioco [IDGIOCO]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Giochi" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Ripristina musica sottofondo" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Avvia titoli" msgid "Titles Path" msgstr "Percorso titoli" -msgid "Titles from GameTDB" -msgstr "Titoli da GameTDB" +msgid "Titles From" +msgstr "Titoli da" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Per avviare i giochi GameCube da disco devi impostare la modalità Gamecube su MIOS nelle impostazioni del gioco." diff --git a/Languages/japanese.lang b/Languages/japanese.lang index 7cf351ca..d0e00f51 100644 --- a/Languages/japanese.lang +++ b/Languages/japanese.lang @@ -344,6 +344,9 @@ msgstr "BNRファイルをキャッシュ" msgid "Cache BNR Files Path" msgstr "BNRファイルキャッシュ" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "ゲーム名のキャッシュ" @@ -639,6 +642,9 @@ msgstr "Devolutionのloader.binが読み込めません" msgid "Directory does not exist!" msgstr "フォルダがありません" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "PAL50に強制" msgid "Force PAL60" msgstr "PAL60に強制" -msgid "Force Titles from Disc" -msgstr "ディスク内のゲーム名に強制" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "GCゲームの削除" msgid "GameCube Install Menu" msgstr "GCインストールメニュー" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "IDのみ" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "ゲーム名 [ゲームID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "ゲーム" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "BGMをリセット" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "ランチャー" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "ゲーム名の日本語化" +msgid "Titles From" +msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "GCゲームをディスク起動するには設定でGCモードをMIOSにしてください" diff --git a/Languages/korean.lang b/Languages/korean.lang index c5bb19c0..231cf778 100644 --- a/Languages/korean.lang +++ b/Languages/korean.lang @@ -344,6 +344,9 @@ msgstr "BNR 파일 캐쉬" msgid "Cache BNR Files Path" msgstr "BNR 파일 경로 캐쉬" +msgid "Cache Path" +msgstr "캐시 경로" + msgid "Cache Titles" msgstr "타이틀 캐쉬" @@ -639,6 +642,9 @@ msgstr "데볼루션의 loader.bin 파일을 로드 할 수 없습니다." msgid "Directory does not exist!" msgstr "디렉토리가 존재하지 않습니다!" +msgid "Disc" +msgstr "디스크" + msgid "Disc 1" msgstr "디스크 1" @@ -1011,9 +1017,6 @@ msgstr "강제 PAL50" msgid "Force PAL60" msgstr "강제 PAL60" -msgid "Force Titles from Disc" -msgstr "디스크에서 강제 타이틀" - msgid "Force Widescreen" msgstr "강제 와이드스크린" @@ -1104,9 +1107,6 @@ msgstr "게임큐브 게임 삭제" msgid "GameCube Install Menu" msgstr "게임큐브 설치 메뉴" -msgid "Game Header Cache Files Path" -msgstr "게임 헤더 캐시 파일 경로" - msgid "Game ID" msgstr "게임 ID" @@ -1167,6 +1167,9 @@ msgstr "게임큐브 소스" msgid "Gamename [GAMEID]" msgstr "게임이름 [게임ID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "게임" @@ -1848,8 +1851,8 @@ msgstr "모든 게임 설정 재설정" msgid "Reset BG Music" msgstr "배경 음악 리셋" -msgid "Reset Game Header Cache" -msgstr "게임 헤더 캐시 리셋" +msgid "Reset Cached Titles" +msgstr "캐시된 타이틀 재설정" msgid "Reset Playcounter" msgstr "실행 횟수 리셋" @@ -2185,8 +2188,8 @@ msgstr "타이틀 실행기" msgid "Titles Path" msgstr "타이틀 경로" -msgid "Titles from GameTDB" -msgstr "GameTDB의 타이틀" +msgid "Titles From" +msgstr "제목 출처" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "디스크에서 게임큐브 게임을 실행하려면 게임 설정에서 게임큐브 모드를 MIOS로 설정해야 합니다." diff --git a/Languages/norwegian.lang b/Languages/norwegian.lang index 502641e7..9466ab0e 100644 --- a/Languages/norwegian.lang +++ b/Languages/norwegian.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Cache titler" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Mappe finnes ikke!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "Tving PAL50" msgid "Force PAL60" msgstr "Tving PAL60" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Spill ID" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "Spillnavn [SPILLID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Spill" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Tilbakestill BG musikk" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Tittel Laster" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "" diff --git a/Languages/polish.lang b/Languages/polish.lang index a935a2fd..d6bdc957 100644 --- a/Languages/polish.lang +++ b/Languages/polish.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Katalog nie istnieje!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID gry" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Liczba gier" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Uruchom tytul" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Odinstaluj" diff --git a/Languages/portuguese_br.lang b/Languages/portuguese_br.lang index c03b9a55..b329971d 100644 --- a/Languages/portuguese_br.lang +++ b/Languages/portuguese_br.lang @@ -344,6 +344,9 @@ msgstr "Cache de Banners" msgid "Cache BNR Files Path" msgstr "Caminho Cache" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Títulos em Cache" @@ -639,6 +642,9 @@ msgstr "O arquivo loader.bin do Devolution não pode ser lido" msgid "Directory does not exist!" msgstr "Pasta não existe!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "Disco 1" @@ -1011,9 +1017,6 @@ msgstr "Forçar PAL50" msgid "Force PAL60" msgstr "Forçar PAL60" -msgid "Force Titles from Disc" -msgstr "Carregar Nome de Disco" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "Desinstalar Jogos GameCube" msgid "GameCube Install Menu" msgstr "Instalar Jogos GameCube" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID do Jogo" @@ -1167,6 +1167,9 @@ msgstr "Pasta de Jogos" msgid "Gamename [GAMEID]" msgstr "Nome Jogo [IDJOGO]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Jogos" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Música padrão" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Gestor de Títulos" msgid "Titles Path" msgstr "Pasta Títulos" -msgid "Titles from GameTDB" -msgstr "Títulos do GameTDB" +msgid "Titles From" +msgstr "Títulos do" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Para rodar jogos de GameCube em disco, você precisa definir o modo de GameCube para MIOS nas configurações do jogo" @@ -2280,9 +2283,6 @@ msgstr "USB Loader GX não conseguiu gravar configurações do Nintendont. Rodar msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "USB Loader GX r1218 é exigido para usar o Nintendont Alpha v0.1. Atualize sua versão do Nintendont" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Desinstalar" diff --git a/Languages/portuguese_pt.lang b/Languages/portuguese_pt.lang index a0b362a8..2553bef1 100644 --- a/Languages/portuguese_pt.lang +++ b/Languages/portuguese_pt.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Títulos em Cache" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Pasta não existe!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "Forçar PAL50" msgid "Force PAL60" msgstr "Forçar PAL60" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID do Jogo" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "Nome Jogo [IDJOGO]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Jogos" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "Reinicializar Música de Fundo" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "Gestor de Títulos" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "Títulos do GameTDB" +msgid "Titles From" +msgstr "Títulos do" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "" @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "" diff --git a/Languages/russian.lang b/Languages/russian.lang index d039bb31..a6c839c0 100644 --- a/Languages/russian.lang +++ b/Languages/russian.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Каталог не существует!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "ID игры" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Игры" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Загрузчик тайтла" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Деинсталлировать" diff --git a/Languages/schinese.lang b/Languages/schinese.lang index cd4bf7e5..6d227758 100644 --- a/Languages/schinese.lang +++ b/Languages/schinese.lang @@ -344,6 +344,9 @@ msgstr "缓存 BNR 文件" msgid "Cache BNR Files Path" msgstr "缓存 BNR 文件路径" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "缓存游戏标题" @@ -639,6 +642,9 @@ msgstr "无法加载 Devolution 的 loader.bin。" msgid "Directory does not exist!" msgstr "目录不存在!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "光盘 1" @@ -1011,9 +1017,6 @@ msgstr "强制 PAL50" msgid "Force PAL60" msgstr "强制 PAL60" -msgid "Force Titles from Disc" -msgstr "强制从光盘读取标题" - msgid "Force Widescreen" msgstr "强制宽屏" @@ -1104,9 +1107,6 @@ msgstr "GameCube 游戏删除" msgid "GameCube Install Menu" msgstr "GameCube 安装菜单" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "游戏 ID" @@ -1167,6 +1167,9 @@ msgstr "GameCube 来源" msgid "Gamename [GAMEID]" msgstr "游戏名 [GAMEID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "游戏" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "重置背景音乐" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "系统频道" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "从 GameTDB 读取标题" +msgid "Titles From" +msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "想要加载光盘上的 GameCube 游戏,请将游戏设置中的 GameCube 模式设置为 MIOS。" @@ -2280,9 +2283,6 @@ msgstr "USBloaderGX不能写Nintendont设置文件,是否运行Nintendont?" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "USBloaderGX r1218之针对nintendont Alpha v0.1,请更新你的Nintendont boot。dol版本。" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "删除" diff --git a/Languages/spanish.lang b/Languages/spanish.lang index 13dff28e..6e2744c4 100644 --- a/Languages/spanish.lang +++ b/Languages/spanish.lang @@ -344,6 +344,9 @@ msgstr "Caché de archivos BNR" msgid "Cache BNR Files Path" msgstr "Caché de archivos BNR" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "Caché de Títulos" @@ -639,6 +642,9 @@ msgstr "No se pudo cargar el loader.bin de Devolution." msgid "Directory does not exist!" msgstr "¡La carpeta no existe!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "Disco 1" @@ -1011,9 +1017,6 @@ msgstr "Forzar PAL50" msgid "Force PAL60" msgstr "Forzar PAL60" -msgid "Force Titles from Disc" -msgstr "Forzar títulos del disco" - msgid "Force Widescreen" msgstr "Forzar 16:9" @@ -1104,9 +1107,6 @@ msgstr "Borrar juego de GameCube" msgid "GameCube Install Menu" msgstr "Menú de instalación GameCube" -msgid "Game Header Cache Files Path" -msgstr "Ruta del caché de Headers" - msgid "Game ID" msgstr "ID de Juego" @@ -1167,6 +1167,9 @@ msgstr "Origen GameCube" msgid "Gamename [GAMEID]" msgstr "NombreJuego [IDJUEGO]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Juegos" @@ -1848,8 +1851,8 @@ msgstr "Reiniciar configuración de juegos" msgid "Reset BG Music" msgstr "Reiniciar Música de Fondo" -msgid "Reset Game Header Cache" -msgstr "Reiniciar caché de Headers" +msgid "Reset Cached Titles" +msgstr "" msgid "Reset Playcounter" msgstr "Reiniciar Partidas" @@ -2185,8 +2188,8 @@ msgstr "Lanzador de Canales" msgid "Titles Path" msgstr "Ruta de títulos" -msgid "Titles from GameTDB" -msgstr "Títulos GameTDB" +msgid "Titles From" +msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "Para cargar juegos de GameCube desde Disco debes configurar el modo GameCube a MIOS." @@ -2280,9 +2283,6 @@ msgstr "No se pudo escribir la configuración de Nintendont, ¿continuar de toda msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "Se necesita la versión r1218 para Nintendont Alpha 0.1. Por favor, actualiza el boot.dol de Nintendont." -msgid "Use Game Header Cache" -msgstr "Usar caché de encabezado de juego" - msgid "Uninstall" msgstr "Desinstalar" diff --git a/Languages/swedish.lang b/Languages/swedish.lang index 67b81690..691c9da3 100644 --- a/Languages/swedish.lang +++ b/Languages/swedish.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Katalog existerar inte!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Spel-ID" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Spel" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "återställ BG musik" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Titel startare" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Avinstallera" diff --git a/Languages/tchinese.lang b/Languages/tchinese.lang index f5e3152b..605c1ba6 100644 --- a/Languages/tchinese.lang +++ b/Languages/tchinese.lang @@ -344,6 +344,9 @@ msgstr "緩衝頻道動畫檔案" msgid "Cache BNR Files Path" msgstr "緩衝頻道動畫檔案路徑" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "遊戲標題緩衝" @@ -639,6 +642,9 @@ msgstr "Devolution的loader.bin檔無法載入。" msgid "Directory does not exist!" msgstr "目錄不存在" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "光碟 1" @@ -1011,9 +1017,6 @@ msgstr "強制 PAL50" msgid "Force PAL60" msgstr "強制 PAL60" -msgid "Force Titles from Disc" -msgstr "強制從光碟顯示標題" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "GameCube 遊戲刪除" msgid "GameCube Install Menu" msgstr "GameCube 安裝畫面" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "遊戲 ID" @@ -1167,6 +1167,9 @@ msgstr "GameCube 來源" msgid "Gamename [GAMEID]" msgstr "遊戲名稱 [GAMEID]" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "遊戲數量" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "重設背景音樂" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,8 +2188,8 @@ msgstr "系統頻道" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" -msgstr "從GameTDB顯示遊戲名稱" +msgid "Titles From" +msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." msgstr "用光碟執行GameCube遊戲,你需在遊戲設定中設定GameCube 模式為MIOS。" @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "移除" diff --git a/Languages/thai.lang b/Languages/thai.lang index 65eeefda..3fd01bc6 100644 --- a/Languages/thai.lang +++ b/Languages/thai.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "ไม่พบไดเรคทอรี่นี้ !" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "เกมส์ ID" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "เกมส์" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Title Launcher" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "ถอนการติดตั้ง" diff --git a/Languages/turkish.lang b/Languages/turkish.lang index 308d7cc9..f0867e82 100644 --- a/Languages/turkish.lang +++ b/Languages/turkish.lang @@ -344,6 +344,9 @@ msgstr "" msgid "Cache BNR Files Path" msgstr "" +msgid "Cache Path" +msgstr "" + msgid "Cache Titles" msgstr "" @@ -639,6 +642,9 @@ msgstr "" msgid "Directory does not exist!" msgstr "Klasör bulunamadı!" +msgid "Disc" +msgstr "" + msgid "Disc 1" msgstr "" @@ -1011,9 +1017,6 @@ msgstr "" msgid "Force PAL60" msgstr "" -msgid "Force Titles from Disc" -msgstr "" - msgid "Force Widescreen" msgstr "" @@ -1104,9 +1107,6 @@ msgstr "" msgid "GameCube Install Menu" msgstr "" -msgid "Game Header Cache Files Path" -msgstr "" - msgid "Game ID" msgstr "Oyun ID" @@ -1167,6 +1167,9 @@ msgstr "" msgid "Gamename [GAMEID]" msgstr "" +msgid "GameTDB" +msgstr "" + msgid "Games" msgstr "Oyunlar" @@ -1848,7 +1851,7 @@ msgstr "" msgid "Reset BG Music" msgstr "" -msgid "Reset Game Header Cache" +msgid "Reset Cached Titles" msgstr "" msgid "Reset Playcounter" @@ -2185,7 +2188,7 @@ msgstr "Başlık Başlatıcı" msgid "Titles Path" msgstr "" -msgid "Titles from GameTDB" +msgid "Titles From" msgstr "" msgid "To run GameCube games from Disc you need to set the GameCube mode to MIOS in the game settings." @@ -2280,9 +2283,6 @@ msgstr "" msgid "USBloaderGX r1218 is required for Nintendont Alpha v0.1. Please update your Nintendont boot.dol version." msgstr "" -msgid "Use Game Header Cache" -msgstr "" - msgid "Uninstall" msgstr "Kaldır" diff --git a/source/Channels/channels.cpp b/source/Channels/channels.cpp index 3cf7e4b2..3798278b 100755 --- a/source/Channels/channels.cpp +++ b/source/Channels/channels.cpp @@ -58,8 +58,23 @@ typedef struct _dolheader Channels *Channels::instance = NULL; -void Channels::GetEmuChannelList() +void Channels::clear() { + EmuChannels.clear(); + //! Clear memory of the vector completely + std::vector().swap(EmuChannels); +} + +void Channels::GetEmuChannelList(bool use_cache) +{ + if (use_cache && Settings.CacheTitles && isCacheFile(EMUNAND_HEADER_CACHE_FILE)) + { + if (EmuChannels.empty()) + LoadGameHeaderCache(EmuChannels); + if (!EmuChannels.empty()) + return; + } + EmuChannels.clear(); char filepath[1024]; @@ -73,6 +88,9 @@ void Channels::GetEmuChannelList() snprintf(filepath, sizeof(filepath), "%s/title/00010002", Settings.NandEmuChanPath); ParseTitleDir(filepath, language); + + if (Settings.CacheTitles) + SaveGameHeaderCache(EmuChannels); } void Channels::GetChannelList() @@ -111,16 +129,8 @@ void Channels::InternalGetNandChannelList(u32 type) if (tid == 0x000100014c554c5aLL || tid == 0x00010001AF1BF516LL || tid == 0x0001000148415858LL) strcpy(id, "JODI"); - const char *name = GameTitles.GetTitle(id); - std::string TitleName; - - if (!name || *name == '\0') - { - name = NandTitles.NameOf(tid); - // Set title for caching - if (name) - GameTitles.SetGameTitle(id, name); - } + std::string TitleName(NandTitles.NameOf(tid)); + TitleName.erase(0, TitleName.find_first_not_of(' ')); int s = NandChannels.size(); NandChannels.resize(s + 1); @@ -128,7 +138,7 @@ void Channels::InternalGetNandChannelList(u32 type) memcpy(NandChannels[s].id, id, 4); NandChannels[s].tid = tid; NandChannels[s].type = TYPE_GAME_NANDCHAN; - strncpy(NandChannels[s].title, name ? name : "", sizeof(NandChannels[s].title) - 1); + strncpy(NandChannels[s].title, TitleName.c_str(), sizeof(NandChannels[s].title) - 1); } } @@ -142,19 +152,8 @@ std::vector &Channels::GetNandHeaders(void) std::vector &Channels::GetEmuHeaders(void) { - if (Settings.UseGameHeaderCache && isCacheFile(EMUNAND_HEADER_CACHE_FILE)) - { - if (EmuChannels.empty()) - LoadGameHeaderCache(EmuChannels); - if (!EmuChannels.empty()) - return EmuChannels; - } - if (EmuChannels.empty()) - this->GetEmuChannelList(); - - if (Settings.UseGameHeaderCache && !EmuChannels.empty()) - SaveGameHeaderCache(EmuChannels); + this->GetEmuChannelList(true); return EmuChannels; } diff --git a/source/Channels/channels.h b/source/Channels/channels.h index 328dd79b..0ddc538b 100755 --- a/source/Channels/channels.h +++ b/source/Channels/channels.h @@ -43,7 +43,8 @@ public: static u8 *GetOpeningBnr(const u64 &title, u32 *outsize, const char *pathPrefix); void GetChannelList(); - void GetEmuChannelList(); + void GetEmuChannelList(bool use_cache = false); + void clear(); std::vector & GetNandHeaders(void); std::vector & GetEmuHeaders(void); private: diff --git a/source/FileOperations/DirList.cpp b/source/FileOperations/DirList.cpp index d11fde5c..8e411b2b 100644 --- a/source/FileOperations/DirList.cpp +++ b/source/FileOperations/DirList.cpp @@ -37,9 +37,9 @@ #include "utils/StringTools.h" #include "DirList.h" -DirList::DirList(const char * path, const char *filter, u32 flags) +DirList::DirList(const char * path, const char *filter, u32 flags, s32 max_depth) { - this->LoadPath(path, filter, flags); + this->LoadPath(path, filter, flags, max_depth); this->SortList(); } @@ -48,16 +48,16 @@ DirList::~DirList() ClearList(); } -bool DirList::LoadPath(const char * folder, const char *filter, u32 flags) +bool DirList::LoadPath(const char * folder, const char *filter, u32 flags, s32 max_depth) { if(!folder) return false; std::string folderpath(folder); - return LoadPath(folderpath, filter, flags); + return LoadPath(folderpath, filter, flags, max_depth); } -bool DirList::LoadPath(std::string &folderpath, const char *filter, u32 flags) +bool DirList::LoadPath(std::string &folderpath, const char *filter, u32 flags, s32 max_depth) { if(folderpath.size() < 3) return false; @@ -103,12 +103,12 @@ bool DirList::LoadPath(std::string &folderpath, const char *filter, u32 flags) if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0) continue; - if(flags & CheckSubfolders) + if((flags & CheckSubfolders) && (max_depth != 0)) { int length = folderpath.size(); if(!isRoot) folderpath += '/'; folderpath += filename; - LoadPath(folderpath, filter, flags); + LoadPath(folderpath, filter, flags, max_depth - 1); folderpath.erase(length); } diff --git a/source/FileOperations/DirList.h b/source/FileOperations/DirList.h index a1ee6dab..d0b17394 100644 --- a/source/FileOperations/DirList.h +++ b/source/FileOperations/DirList.h @@ -47,12 +47,12 @@ class DirList //!\param path Path from where to load the filelist of all files //!\param filter A fileext that needs to be filtered //!\param flags search/filter flags from the enum - DirList(const char * path, const char *filter = NULL, u32 flags = Files | Dirs); + DirList(const char * path, const char *filter = NULL, u32 flags = Files | Dirs, s32 max_depth = -1); //!Destructor ~DirList(); //! Load all the files from a directory - bool LoadPath(const char * path, const char *filter = NULL, u32 flags = Files | Dirs); - bool LoadPath(std::string &path, const char *filter = NULL, u32 flags = Files | Dirs); + bool LoadPath(const char * path, const char *filter = NULL, u32 flags = Files | Dirs, s32 max_depth = -1); + bool LoadPath(std::string &path, const char *filter = NULL, u32 flags = Files | Dirs, s32 max_depth = -1); //! Get a filename of the list //!\param list index const char * GetFilename(int index); diff --git a/source/FileOperations/fileops.cpp b/source/FileOperations/fileops.cpp index 5893d57f..05f7ba8e 100644 --- a/source/FileOperations/fileops.cpp +++ b/source/FileOperations/fileops.cpp @@ -40,7 +40,6 @@ #include "language/gettext.h" #include "DirList.h" #include "fileops.h" -#include "gecko.h" #define BLOCKSIZE 70*1024 //70KB #define VectorResize(List) if(List.capacity()-List.size() == 0) List.reserve(List.size()+100) @@ -453,7 +452,6 @@ extern "C" bool RemoveDirectory(const char *path) ShowProgress(tr("Deleting directories..."), dir.GetFilename(i), 0, done, fileCount, false, false); rmdir(dir.GetFilepath(i)); done++; - gprintf("%s\n", dir.GetFilepath(i)); } } diff --git a/source/GameCube/GCGames.cpp b/source/GameCube/GCGames.cpp index fcbcd065..a8e772b2 100644 --- a/source/GameCube/GCGames.cpp +++ b/source/GameCube/GCGames.cpp @@ -58,6 +58,19 @@ const char *GCGames::GetPath(const char *gameID) const return ""; } +void GCGames::clear() +{ + PathList.clear(); + HeaderList.clear(); + sdGCList.clear(); + sdGCPathList.clear(); + //! Clear memory of the vector completely + std::vector().swap(PathList); + std::vector().swap(HeaderList); + std::vector().swap(sdGCList); + std::vector().swap(sdGCPathList); +} + void GCGames::LoadGameList(const std::string &path, std::vector &headerList, std::vector &pathList) { struct discHdr tmpHdr; @@ -65,7 +78,7 @@ void GCGames::LoadGameList(const std::string &path, std::vector u8 id[8]; u8 disc_number = 0; char fpath[1024]; - char fname_title[64]; + char fname_title[130]; DIR *dir_iter; struct dirent *dirent; @@ -174,19 +187,21 @@ void GCGames::LoadGameList(const std::string &path, std::vector } } - // if we have titles.txt entry use that - const char *title = GameTitles.GetTitle(id); + std::string title = ""; + if (Settings.TitlesType == TITLETYPE_FORCED_DISC && GameTitles.GetTitleType((const char *)id) == TITLETYPE_FORCED_DISC) + title.assign(GameTitles.GetTitle((const char *)id)); - // if no titles.txt get title from dir or file name - if (strlen(title) == 0 && !Settings.ForceDiscTitles && strlen(fname_title) > 0) - title = fname_title; + if (title.length() == 0 && Settings.TitlesType != TITLETYPE_FORCED_DISC && strlen(fname_title) > 0) + title.assign(fname_title); - if (*id != 0 && strlen(title) > 0) + title.erase(0, title.find_first_not_of(' ')); + + if (*id != 0 && title.length() > 0 && title.length() < 64) { std::string gamePath = std::string(path) + dirname + (extracted ? "/" : strrchr(fpath, '/')); memset(&tmpHdr, 0, sizeof(tmpHdr)); memcpy(tmpHdr.id, id, sizeof(tmpHdr.id)); - snprintf(tmpHdr.title, sizeof(tmpHdr.title), "%s", title); + snprintf(tmpHdr.title, sizeof(tmpHdr.title), "%s", title.c_str()); tmpHdr.magic = GCGames::MAGIC; tmpHdr.type = extracted ? TYPE_GAME_GC_EXTRACTED : TYPE_GAME_GC_IMG; tmpHdr.disc_no = disc_number; @@ -209,11 +224,14 @@ void GCGames::LoadGameList(const std::string &path, std::vector std::string gamePath = std::string(path) + dirname + (extracted ? "/" : strrchr(fpath, '/')); tmpHdr.magic = tmpHdr.gc_magic; tmpHdr.type = extracted ? TYPE_GAME_GC_EXTRACTED : TYPE_GAME_GC_IMG; + title.assign(tmpHdr.title); + title.erase(0, title.find_first_not_of(' ')); + snprintf(tmpHdr.title, sizeof(tmpHdr.title), "%s", title.c_str()); headerList.push_back(tmpHdr); pathList.push_back(gamePath); - // Save title for next start - GameTitles.SetGameTitle(tmpHdr.id, tmpHdr.title); + if (Settings.TitlesType == TITLETYPE_FORCED_DISC && GameTitles.GetTitleType((const char *)tmpHdr.id) != TITLETYPE_MANUAL_OVERRIDE) + GameTitles.SetGameTitle((const char *)tmpHdr.id, tmpHdr.title, TITLETYPE_FORCED_DISC); } } } @@ -221,14 +239,14 @@ void GCGames::LoadGameList(const std::string &path, std::vector closedir(dir_iter); } -u32 GCGames::LoadAllGames(void) +u32 GCGames::LoadAllGames(bool use_cache) { - if (Settings.UseGameHeaderCache && isCacheFile(GAMECUBE_HEADER_CACHE_FILE)) + if (use_cache && Settings.CacheTitles && isCacheFile(GAMECUBE_HEADER_CACHE_FILE)) { if (HeaderList.empty() && PathList.empty()) LoadGameHeaderCache(HeaderList, PathList); if (!HeaderList.empty()) - return (int)HeaderList.size(); + return HeaderList.size(); } PathList.clear(); @@ -282,7 +300,10 @@ u32 GCGames::LoadAllGames(void) } } - if (Settings.UseGameHeaderCache && !HeaderList.empty() && !PathList.empty()) + if (HeaderList.size() > 0 || sdGCList.size() > 0) + GameTitles.SortTitleList(); + + if (Settings.CacheTitles) SaveGameHeaderCache(HeaderList, PathList); return HeaderList.size(); diff --git a/source/GameCube/GCGames.h b/source/GameCube/GCGames.h index f3ce4404..395f274d 100644 --- a/source/GameCube/GCGames.h +++ b/source/GameCube/GCGames.h @@ -36,9 +36,10 @@ public: static u8 *GetOpeningBnr(const char *gameID); - u32 LoadAllGames(void); + u32 LoadAllGames(bool use_cache = false); void LoadGameList(const std::string &path, std::vector &headerList, std::vector &pathList); + void clear(); bool RemoveGame(const char *gameID); bool RemoveSDGame(const char *gameID); @@ -48,7 +49,8 @@ public: std::vector & GetHeaders(void) { - LoadAllGames(); + if (HeaderList.empty()) + LoadAllGames(true); return HeaderList; } diff --git a/source/StartUpProcess.cpp b/source/StartUpProcess.cpp index ee72a0c9..9e1edb22 100644 --- a/source/StartUpProcess.cpp +++ b/source/StartUpProcess.cpp @@ -270,8 +270,7 @@ int StartUpProcess::Execute(bool quickGameBoot) gprintf("\tLoading game settings...%s\n", GameSettings.Load(Settings.ConfigPath) ? "done" : "failed"); gprintf("\tLoading game statistics...%s\n", GameStatistics.Load(Settings.ConfigPath) ? "done" : "failed"); 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)"); + gprintf("\tLoading cached titles...%s\n", GameTitles.ReadCachedTitles(Settings.titlestxt_path) ? "done" : "failed (using default)"); // Some settings need to be enabled to boot directly into games gprintf("Quick game boot: %s\n", quickGameBoot ? "yes" : "no"); diff --git a/source/cache/cache.cpp b/source/cache/cache.cpp index 7670258f..9392c1fe 100644 --- a/source/cache/cache.cpp +++ b/source/cache/cache.cpp @@ -1,9 +1,9 @@ /* - Code by Oddx @ GBAtemp.net - Loosely based on emuNAND caching by geoGolem. + Code by Oddx @ GBAtemp.net */ #include #include +#include #include "cache.hpp" #include "usbloader/disc.h" @@ -13,326 +13,253 @@ #include "Channels/channels.h" #include "usbloader/GameList.h" #include "GameCube/GCGames.h" +#include "FileOperations/DirList.h" +#include "wad/nandtitle.h" +#include "Controls/DeviceHandler.hpp" +#include "gecko.h" void ResetGameHeaderCache() { - RemoveDirectory(Settings.GameHeaderCachePath); - return; + RemoveDirectory(Settings.GameHeaderCachePath); } -// emuNAND +void GetDirectoryList(const char *path, std::string &list) +{ + DirList dir(path, 0, DirList::Files | DirList::Dirs); + for (int i = 0; i < dir.GetFilecount(); ++i) + list.append(dir.GetFilepath(i)); +} + + +void GetListWBFS(std::string &list) +{ + char drive[11]; + int portPart; + u16 partitions = DeviceHandler::GetUSBPartitionCount(); + for (u16 i = 0; i < partitions; ++i) + { + PartitionHandle *usb = DeviceHandler::Instance()->GetUSBHandleFromPartition(i); + if (!usb) + continue; + portPart = DeviceHandler::PartitionToPortPartition(i); + snprintf(drive, sizeof(drive), "%s:/wbfs", usb->MountName(portPart)); + gprintf("Partition: %d - %s\n", i, drive); + GetDirectoryList(drive, list); + } +} + +bool isCacheCurrent() +{ + if (!Settings.CacheTitles) + return true; + + char filepath[256] = {}; + std::string list; + + // GameCube + snprintf(filepath, sizeof(filepath), "%s", Settings.GameCubePath); + GetDirectoryList(filepath, list); + snprintf(filepath, sizeof(filepath), "%s", Settings.GameCubeSDPath); + GetDirectoryList(filepath, list); + + // Wii + GetListWBFS(list); + + // EmuNAND + snprintf(filepath, sizeof(filepath), "%s/title/00010001", Settings.NandEmuChanPath); + GetDirectoryList(filepath, list); + snprintf(filepath, sizeof(filepath), "%s/title/00010002", Settings.NandEmuChanPath); + GetDirectoryList(filepath, list); + snprintf(filepath, sizeof(filepath), "%s/title/00010004", Settings.NandEmuChanPath); + GetDirectoryList(filepath, list); + + // NAND + u32 types[3] = {0x00010001, 0x00010002, 0x00010004}; + for (u32 i = 0; i < 3; ++i) + { + u32 num_titles = NandTitles.SetType(types[i]); + for (u32 x = 0; x < num_titles; ++x) + { + u64 tid = NandTitles.Next(); + if (!tid) + break; + snprintf(filepath, sizeof(filepath), "%016llx", tid); + list.append(filepath); + } + } + + // Generate a CRC-32 hash + u32 crc = crc32(0L, Z_NULL, 0); + crc = crc32(crc, (u8 *)list.c_str(), list.length()); + + if (Settings.CacheCheckCRC == crc) + return true; + gprintf("Resetting cache\n"); + Settings.CacheCheckCRC = crc; + return false; +} + +// EmuNAND void SaveGameHeaderCache(std::vector &list) { - std::string path = std::string(Settings.GameHeaderCachePath) + EMUNAND_HEADER_CACHE_FILE; + std::string path = std::string(Settings.GameHeaderCachePath) + EMUNAND_HEADER_CACHE_FILE; + if (list.empty()) + RemoveFile(path.c_str()); - if (!CheckFile(Settings.GameHeaderCachePath)) - CreateSubfolder(Settings.GameHeaderCachePath); + CreateSubfolder(Settings.GameHeaderCachePath); - FILE *cache = fopen(path.c_str(), "wb"); + FILE *cache = fopen(path.c_str(), "wb"); + if (!cache) + return; - if (!cache) - return; - - fwrite((void *)&list[0], 1, list.size() * sizeof(struct discHdr), cache); - - fclose(cache); + fwrite((void *)&list[0], 1, list.size() * sizeof(struct discHdr), cache); + fclose(cache); } void LoadGameHeaderCache(std::vector &list) { - std::string path = std::string(Settings.GameHeaderCachePath) + EMUNAND_HEADER_CACHE_FILE; + std::string path = std::string(Settings.GameHeaderCachePath) + EMUNAND_HEADER_CACHE_FILE; - FILE *cache = fopen(path.c_str(), "rb"); + FILE *cache = fopen(path.c_str(), "rb"); + if (!cache) + return; - if (!cache) - return; + struct discHdr tmp; + fseek(cache, 0, SEEK_END); + u64 fileSize = ftell(cache); + fseek(cache, 0, SEEK_SET); - struct discHdr tmp; - fseek(cache, 0, SEEK_END); - u64 fileSize = ftell(cache); - fseek(cache, 0, SEEK_SET); + u32 count = (u32)(fileSize / sizeof(struct discHdr)); - u32 count = (u32)(fileSize / sizeof(struct discHdr)); + list.reserve(count + list.size()); + for (u32 i = 0; i < count; ++i) + { + fseek(cache, i * sizeof(struct discHdr), SEEK_SET); + fread((void *)&tmp, 1, sizeof(struct discHdr), cache); + list.push_back(tmp); + } - list.reserve(count + list.size()); - for (u32 i = 0; i < count; i++) - { - fseek(cache, i * sizeof(struct discHdr), SEEK_SET); - fread((void *)&tmp, 1, sizeof(struct discHdr), cache); - list.push_back(tmp); - } - - fclose(cache); + fclose(cache); } // Wii void SaveGameHeaderCache(std::vector &list, std::vector &plist) { - std::vector wiictmp; - struct wiiCache gtmp; + std::string path = std::string(Settings.GameHeaderCachePath) + WII_HEADER_CACHE_FILE; + if (list.empty() || plist.empty()) + RemoveFile(path.c_str()); - for (u32 i = 0; i < list.size(); ++i) - { - memset(>mp, 0, sizeof(struct wiiCache)); - gtmp.header = list[i]; - gtmp.part = plist[i]; - wiictmp.push_back(gtmp); - } + std::vector wiictmp; + struct wiiCache gtmp; - std::string path = std::string(Settings.GameHeaderCachePath) + WII_HEADER_CACHE_FILE; + for (u32 i = 0; i < list.size(); ++i) + { + memset(>mp, 0, sizeof(struct wiiCache)); + gtmp.header = list[i]; + gtmp.part = plist[i]; + wiictmp.push_back(gtmp); + } - if (!CheckFile(Settings.GameHeaderCachePath)) - CreateSubfolder(Settings.GameHeaderCachePath); + CreateSubfolder(Settings.GameHeaderCachePath); - FILE *cache = fopen(path.c_str(), "wb"); + FILE *cache = fopen(path.c_str(), "wb"); + if (!cache) + return; - if (!cache) - return; - - fwrite((void *)&wiictmp[0], 1, wiictmp.size() * sizeof(struct wiiCache), cache); - - fclose(cache); + fwrite((void *)&wiictmp[0], 1, wiictmp.size() * sizeof(struct wiiCache), cache); + fclose(cache); } void LoadGameHeaderCache(std::vector &list, std::vector &plist) { - std::string path = std::string(Settings.GameHeaderCachePath) + WII_HEADER_CACHE_FILE; + std::string path = std::string(Settings.GameHeaderCachePath) + WII_HEADER_CACHE_FILE; - FILE *cache = fopen(path.c_str(), "rb"); + FILE *cache = fopen(path.c_str(), "rb"); + if (!cache) + return; - if (!cache) - return; + struct wiiCache wiictmp; + fseek(cache, 0, SEEK_END); + u64 fileSize = ftell(cache); + fseek(cache, 0, SEEK_SET); - struct wiiCache wiictmp; - fseek(cache, 0, SEEK_END); - u64 fileSize = ftell(cache); - fseek(cache, 0, SEEK_SET); + u32 count = (u32)(fileSize / sizeof(struct wiiCache)); - u32 count = (u32)(fileSize / sizeof(struct wiiCache)); + list.reserve(count + list.size()); + plist.reserve(count + plist.size()); + for (u32 i = 0; i < count; ++i) + { + fseek(cache, i * sizeof(struct wiiCache), SEEK_SET); + fread((void *)&wiictmp, 1, sizeof(struct wiiCache), cache); + list.push_back(wiictmp.header); + plist.push_back(wiictmp.part); + } - list.reserve(count + list.size()); - plist.reserve(count + plist.size()); - for (u32 i = 0; i < count; i++) - { - fseek(cache, i * sizeof(struct wiiCache), SEEK_SET); - fread((void *)&wiictmp, 1, sizeof(struct wiiCache), cache); - list.push_back(wiictmp.header); - plist.push_back(wiictmp.part); - } - - fclose(cache); + fclose(cache); } // GameCube void SaveGameHeaderCache(std::vector &list, std::vector &plist) { - std::vector gcctmp; - struct gcCache gtmp; + std::string path = std::string(Settings.GameHeaderCachePath) + GAMECUBE_HEADER_CACHE_FILE; + if (list.empty() || plist.empty()) + RemoveFile(path.c_str()); - for (u32 i = 0; i < list.size(); ++i) - { - memset(>mp, 0, sizeof(gcCache)); - gtmp.header = list[i]; + std::vector gcctmp; + struct gcCache gtmp; - strcpy((char *)gtmp.path, plist[i].c_str()); + for (u32 i = 0; i < list.size(); ++i) + { + memset(>mp, 0, sizeof(gcCache)); + gtmp.header = list[i]; - gcctmp.push_back(gtmp); - } + strcpy((char *)gtmp.path, plist[i].c_str()); - std::string path = std::string(Settings.GameHeaderCachePath) + GAMECUBE_HEADER_CACHE_FILE; + gcctmp.push_back(gtmp); + } - if (!CheckFile(Settings.GameHeaderCachePath)) - CreateSubfolder(Settings.GameHeaderCachePath); + CreateSubfolder(Settings.GameHeaderCachePath); - FILE *cache = fopen(path.c_str(), "wb"); + FILE *cache = fopen(path.c_str(), "wb"); + if (!cache) + return; - if (!cache) - return; - - fwrite((void *)&gcctmp[0], 1, gcctmp.size() * sizeof(struct gcCache), cache); - - fclose(cache); + fwrite((void *)&gcctmp[0], 1, gcctmp.size() * sizeof(struct gcCache), cache); + fclose(cache); } void LoadGameHeaderCache(std::vector &list, std::vector &plist) { - std::string path = std::string(Settings.GameHeaderCachePath) + GAMECUBE_HEADER_CACHE_FILE; + std::string path = std::string(Settings.GameHeaderCachePath) + GAMECUBE_HEADER_CACHE_FILE; - FILE *cache = fopen(path.c_str(), "rb"); + FILE *cache = fopen(path.c_str(), "rb"); + if (!cache) + return; - if (!cache) - return; + struct gcCache gcctmp; + fseek(cache, 0, SEEK_END); + u64 fileSize = ftell(cache); + fseek(cache, 0, SEEK_SET); - struct gcCache gcctmp; - fseek(cache, 0, SEEK_END); - u64 fileSize = ftell(cache); - fseek(cache, 0, SEEK_SET); + u32 count = (u32)(fileSize / sizeof(struct gcCache)); - u32 count = (u32)(fileSize / sizeof(struct gcCache)); + list.reserve(count + list.size()); + plist.reserve(count + plist.size()); + for (u32 i = 0; i < count; ++i) + { + fseek(cache, i * sizeof(struct gcCache), SEEK_SET); + fread((void *)&gcctmp, 1, sizeof(struct gcCache), cache); + list.push_back(gcctmp.header); - list.reserve(count + list.size()); - plist.reserve(count + plist.size()); - for (u32 i = 0; i < count; i++) - { - fseek(cache, i * sizeof(struct gcCache), SEEK_SET); - fread((void *)&gcctmp, 1, sizeof(struct gcCache), cache); - list.push_back(gcctmp.header); + std::string tmp((char *)gcctmp.path); + plist.push_back(tmp); + } - std::string tmp((char *)gcctmp.path); - plist.push_back(tmp); - } - fclose(cache); -} - -void SaveFilteredListCache(std::vector &list, const wchar_t *gameFilter) -{ - std::string path = std::string(Settings.GameHeaderCachePath) + FilteredListCacheFileName(gameFilter); - - if (!CheckFile(Settings.GameHeaderCachePath)) - CreateSubfolder(Settings.GameHeaderCachePath); - - FILE *cache = fopen(path.c_str(), "wb"); - - if (!cache) - return; - - std::vector tmplist; - struct gameHdr tmp; - - for (u32 i = 0; i < list.size(); ++i) - { - memcpy(tmp.id, list[i]->id, 6); - tmplist.push_back(tmp); - } - - fwrite((void *)&tmplist[0], 1, tmplist.size() * sizeof(struct gameHdr), cache); - fclose(cache); -} - -void LoadFilteredListCache(std::vector &list, const wchar_t *gameFilter) -{ - std::string path = std::string(Settings.GameHeaderCachePath) + FilteredListCacheFileName(gameFilter); - - if (!CheckFile(Settings.GameHeaderCachePath)) - CreateSubfolder(Settings.GameHeaderCachePath); - - FILE *cache = fopen(path.c_str(), "rb"); - - if (!cache) - return; - - struct gameHdr tmp; - - fseek(cache, 0, SEEK_END); - u64 fileSize = ftell(cache); - fseek(cache, 0, SEEK_SET); - - u32 count = (u32)(fileSize / sizeof(struct gameHdr)); - - list.reserve(count + list.size()); - for (u32 i = 0; i < count; i++) - { - bool found = false; - fseek(cache, i * sizeof(struct gameHdr), SEEK_SET); - fread((void *)&tmp, 1, sizeof(struct gameHdr), cache); - - if (!found) - { - std::vector &tmplist = gameList.GetFullGameList(); - for (u32 c = 0; c < tmplist.size(); ++c) - { - struct discHdr *header = &tmplist[c]; - if (strncasecmp((const char *)tmp.id, (const char *)header->id, 6) == 0) - { - list.push_back(header); - found = true; - break; - } - } - } - - if (!found) - { - std::vector &tmplist = GCGames::Instance()->GetHeaders(); - for (u32 c = 0; c < tmplist.size(); ++c) - { - struct discHdr *header = &tmplist[c]; - if (strncasecmp((const char *)tmp.id, (const char *)header->id, 6) == 0) - { - list.push_back(header); - found = true; - break; - } - } - } - - if (!found) - { - std::vector &tmplist = Channels::Instance()->GetNandHeaders(); - for (u32 c = 0; c < tmplist.size(); ++c) - { - struct discHdr *header = &tmplist[c]; - if (strncasecmp((const char *)tmp.id, (const char *)header->id, 6) == 0) - { - list.push_back(header); - found = true; - break; - } - } - } - - if (!found) - { - std::vector &tmplist = Channels::Instance()->GetEmuHeaders(); - for (u32 c = 0; c < tmplist.size(); ++c) - { - struct discHdr *header = &tmplist[c]; - if (strncasecmp((const char *)tmp.id, (const char *)header->id, 6) == 0) - { - list.push_back(header); - found = true; - break; - } - } - } - } - - fclose(cache); -} - -std::string FilteredListCacheFileName(const wchar_t *gameFilter) -{ - std::string tmp; - tmp = "FL"; - tmp += "_" + std::to_string(Settings.LoaderMode); - tmp += "_" + std::to_string(Settings.GameSort); - if (gameFilter) - { - std::wstring ws(gameFilter); - std::string gf(ws.begin(), ws.end()); - if ((gf.length()) > 0) - tmp += "_" + gf; - } - tmp += ".cache"; - return tmp; -} - -std::string FilteredListCacheFileName() -{ - std::string tmp; - tmp = "FL"; - tmp += "_" + std::to_string(Settings.LoaderMode); - tmp += "_" + std::to_string(Settings.GameSort); - tmp += ".cache"; - return tmp; + fclose(cache); } bool isCacheFile(std::string filename) { - std::string path = std::string(Settings.GameHeaderCachePath) + filename; - - if (CheckFile(path.c_str())) - return true; - - return false; + std::string path = std::string(Settings.GameHeaderCachePath) + filename; + return CheckFile(path.c_str()); } diff --git a/source/cache/cache.hpp b/source/cache/cache.hpp index 308ae937..7534b0c0 100644 --- a/source/cache/cache.hpp +++ b/source/cache/cache.hpp @@ -1,6 +1,5 @@ /* - Code by Oddx @ GBAtemp.net - Loosely based on emuNAND caching by geoGolem. + Code by Oddx @ GBAtemp.net */ #include "usbloader/disc.h" #include "settings/CSettings.h" @@ -11,26 +10,32 @@ struct gameHdr { - /* Game ID */ - u8 id[6]; + /* Game ID */ + u8 id[6]; - /* Padding */ - u8 unused3[2]; + /* Padding */ + u8 unused3[2]; }; struct wiiCache { - struct discHdr header; - int part; + struct discHdr header; + int part; }; struct gcCache { - struct discHdr header; - u8 path[200]; + struct discHdr header; + u8 path[200]; }; -// emuNAND +void ResetGameHeaderCache(); +void GetDirectoryList(const char *path, std::string &list); +void GetListWBFS(std::string &list); +bool isCacheCurrent(); +bool isCacheFile(std::string filename); + +// EmuNAND void SaveGameHeaderCache(std::vector &list); void LoadGameHeaderCache(std::vector &list); @@ -42,11 +47,4 @@ void LoadGameHeaderCache(std::vector &list, std::vector &pl void SaveGameHeaderCache(std::vector &list, std::vector &plist); void LoadGameHeaderCache(std::vector &list, std::vector &plist); -void ResetGameHeaderCache(); - -void SaveFilteredListCache(std::vector &list, const wchar_t *gameFilter); -void LoadFilteredListCache(std::vector &list, const wchar_t *gameFilter); - -std::string FilteredListCacheFileName(const wchar_t *gameFilter); -std::string FilteredListCacheFileName(); bool isCacheFile(std::string filename); diff --git a/source/homebrewboot/HomebrewBrowser.cpp b/source/homebrewboot/HomebrewBrowser.cpp index a0257c2e..38d7491e 100644 --- a/source/homebrewboot/HomebrewBrowser.cpp +++ b/source/homebrewboot/HomebrewBrowser.cpp @@ -44,7 +44,7 @@ extern int connection; HomebrewBrowser::HomebrewBrowser() : FlyingButtonsMenu(tr( "Homebrew Launcher" )) { - HomebrewList = new DirList(Settings.homebrewapps_path, ".dol,.elf", DirList::Files | DirList::Dirs | DirList::CheckSubfolders | DirList::MainDOL); + HomebrewList = new DirList(Settings.homebrewapps_path, ".dol,.elf", DirList::Files | DirList::Dirs | DirList::CheckSubfolders | DirList::MainDOL, 1); if (IsNetworkInit()) ResumeNetworkWait(); diff --git a/source/menu/GameBrowseMenu.cpp b/source/menu/GameBrowseMenu.cpp index 2600bc10..823060c6 100644 --- a/source/menu/GameBrowseMenu.cpp +++ b/source/menu/GameBrowseMenu.cpp @@ -329,17 +329,6 @@ GameBrowseMenu::GameBrowseMenu() gameCoverImg->SetPosition(thInt("26 - cover/download btn pos x"), thInt("58 - cover/download btn pos y")); gameCoverImg->SetWidescreen(Settings.widescreen); - IDBtnTT = new GuiTooltip(tr( "Click to change game ID" )); - if (Settings.wsprompt) IDBtnTT->SetWidescreen(Settings.widescreen); - IDBtnTT->SetAlpha(thInt("255 - tooltip alpha")); - idBtn = new GuiButton(60, 23); - idBtn->SetPosition(thInt("68 - gameID btn pos x"), thInt("305 - gameID btn pos y")); - idBtn->SetAlignment(ALIGN_LEFT, ALIGN_TOP); - idBtn->SetSoundOver(btnSoundOver); - idBtn->SetTrigger(0, trigA); - idBtn->SetToolTip(IDBtnTT, 205, -30); - idBtn->SetSelectable(false); - GXColor clockColor = thColor("r=138 g=138 b=138 a=240 - clock color"); float clockFontScaleFactor = thFloat("1.0 - Overrided clock scale factor. 1.0=allow user setting") != 1.0f ? thFloat("1.0 - Overrided clock scale factor. 1.0=allow user setting") : Settings.ClockFontScaleFactor; clockTimeBack = new GuiText("88:88", 40 / Settings.FontScaleFactor * clockFontScaleFactor, (GXColor) {clockColor.r, clockColor.g, clockColor.b, (u8)(clockColor.a / 6)}); @@ -495,7 +484,6 @@ GameBrowseMenu::~GameBrowseMenu() delete loaderModeBtn; delete homebrewBtn; delete DownloadBtn; - delete idBtn; delete installBtnTT; delete settingsBtnTT; @@ -515,7 +503,6 @@ GameBrowseMenu::~GameBrowseMenu() delete loaderModeBtnTT; delete homebrewBtnTT; delete DownloadBtnTT; - delete IDBtnTT; delete gameBrowser; mainWindow->Remove(searchBar); @@ -863,9 +850,6 @@ void GameBrowseMenu::ReloadBrowser() if (Settings.godmode || !(Settings.ParentalBlocks & BLOCK_COVER_DOWNLOADS)) Append(DownloadBtn); - if ((Settings.gameDisplay == LIST_MODE) && (Settings.godmode || !(Settings.ParentalBlocks & BLOCK_GAMEID_CHANGE))) - Append(idBtn); - Append(favoriteBtn); Append(searchBtn); Append(sortBtn); @@ -961,7 +945,7 @@ int GameBrowseMenu::MainLoop() else { gameList.ReadGameList(); - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path, false); + GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); if(Settings.ShowFreeSpace) { ThreadedTask::Instance()->AddCallback(&HDDSizeCallback); @@ -1317,7 +1301,7 @@ int GameBrowseMenu::MainLoop() { WBFS_ReInit(WBFS_DEVICE_USB); } - gameList.ReadGameList(); + gameList.ReadGameList(true); if(Settings.ShowFreeSpace) { @@ -1327,32 +1311,12 @@ int GameBrowseMenu::MainLoop() } wString oldFilter(gameList.GetCurrentFilter()); - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path, false); + GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); gameList.FilterList(oldFilter.c_str()); ReloadBrowser(); } loaderModeBtn->ResetState(); } - - else if (Settings.gameDisplay == LIST_MODE && idBtn->GetState() == STATE_CLICKED) - { - gprintf("\tidBtn Clicked\n"); - struct discHdr * header = gameList[GetSelectedGame()]; - //enter new game ID - char entered[7]; - snprintf(entered, sizeof(entered), "%s", (char *) header->id); - int result = OnScreenKeyboard(entered, sizeof(entered), 0); - if (result == 1) - { - WBFS_ReIDGame(header->id, entered); - wString oldFilter(gameList.GetCurrentFilter()); - gameList.ReadGameList(); - gameList.FilterList(oldFilter.c_str()); - ReloadBrowser(); - } - idBtn->ResetState(); - } - else if (Settings.gameDisplay == LIST_MODE && GetSelectedGame() != gameSelectedOld) { gameSelectedOld = GetSelectedGame(); @@ -1389,7 +1353,7 @@ void GameBrowseMenu::CheckDiscSlotUpdate() delayCounter = 0; u32 DiscDriveCover = 0; - WDVD_GetCoverStatus(&DiscDriveCover);//for detecting if i disc has been inserted + WDVD_GetCoverStatus(&DiscDriveCover);//for detecting if a disc has been inserted if ((DiscDriveCover & 0x02) && (DiscDriveCover != DiscDriveCoverOld)) { diff --git a/source/menu/GameBrowseMenu.hpp b/source/menu/GameBrowseMenu.hpp index 4809b295..3a212cd9 100644 --- a/source/menu/GameBrowseMenu.hpp +++ b/source/menu/GameBrowseMenu.hpp @@ -148,7 +148,6 @@ class GameBrowseMenu : public GuiWindow GuiButton * loaderModeBtn; GuiButton * homebrewBtn; GuiButton * DownloadBtn; - GuiButton * idBtn; GuiTooltip * installBtnTT; GuiTooltip * settingsBtnTT; @@ -168,7 +167,6 @@ class GameBrowseMenu : public GuiWindow GuiTooltip * loaderModeBtnTT; GuiTooltip * homebrewBtnTT; GuiTooltip * DownloadBtnTT; - GuiTooltip * IDBtnTT; }; #endif diff --git a/source/menu/menu_install.cpp b/source/menu/menu_install.cpp index aa9aa7ac..498f38e2 100644 --- a/source/menu/menu_install.cpp +++ b/source/menu/menu_install.cpp @@ -12,6 +12,7 @@ #include "utils/tools.h" #include "system/IosLoader.h" #include "cache/cache.hpp" +#include "settings/GameTitles.h" #define WII_MAGIC 0x5D1C9EA3 @@ -148,7 +149,6 @@ int MenuGCInstall() if(ret >= 0) { //! success installed_games++; - ResetGameHeaderCache(); } else if(ret == PROGRESS_CANCELED) { @@ -184,6 +184,7 @@ int MenuGCInstall() return result; gameList.FilterList(); + isCacheCurrent(); bgMusic->Pause(); GuiSound instsuccess(Resources::GetFile("success.ogg"), Resources::GetFileSize("success.ogg"), Settings.sfxvolume); instsuccess.SetVolume(Settings.sfxvolume); @@ -289,9 +290,9 @@ int MenuInstall() else { ShowProgress(tr("Install finished"), headerdisc.title, tr("Reloading game list now, please wait..."), gamesize, gamesize, true, true); - ResetGameHeaderCache(); gameList.ReadGameList(); //get the entries again gameList.FilterList(); + isCacheCurrent(); bgMusic->Pause(); GuiSound instsuccess(Resources::GetFile("success.ogg"), Resources::GetFileSize("success.ogg"), Settings.sfxvolume); instsuccess.SetVolume(Settings.sfxvolume); diff --git a/source/network/update.cpp b/source/network/update.cpp index b8b657e7..b05c8044 100644 --- a/source/network/update.cpp +++ b/source/network/update.cpp @@ -137,9 +137,8 @@ int UpdateGameTDB() remove(ZipPath.c_str()); //! Reload all titles and reload cached titles because the file changed now. - GameTitles.SetDefault(); + GameTitles.Reset(); GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); - return (result ? filesize : -1); } diff --git a/source/prompts/GameWindow.cpp b/source/prompts/GameWindow.cpp index e276d646..965c94ac 100644 --- a/source/prompts/GameWindow.cpp +++ b/source/prompts/GameWindow.cpp @@ -22,6 +22,7 @@ #include "banner/OpeningBNR.hpp" #include "utils/ShowError.h" #include "utils/tools.h" +#include "cache/cache.hpp" #define NONE 0 #define LEFT 1 @@ -601,26 +602,37 @@ int GameWindow::MainLoop() { // Hide the window Hide(); - // This button can only be clicked when this is not a dvd header struct discHdr *header = gameList[gameSelected]; - - //enter new game title - char entered[60]; + // Enter the new game title + char entered[130]; snprintf(entered, sizeof(entered), "%s", GameTitles.GetTitle(header)); - int result = OnScreenKeyboard(entered, 60, 0); + int result = OnScreenKeyboard(entered, 129, 0); if (result == 1) { - WBFS_RenameGame(header->id, entered); - GameTitles.SetGameTitle(header->id, entered); + if (strlen(entered) > 0) + GameTitles.SetGameTitle(header->id, entered, TITLETYPE_MANUAL_OVERRIDE); + else + GameTitles.SetGameTitle(header->id, header->title, TITLETYPE_DEFAULT); + // Refresh and set the title for the window wString oldFilter(gameList.GetCurrentFilter()); - gameList.ReadGameList(); gameList.FilterList(oldFilter.c_str()); - if(browserMenu) browserMenu->ReloadBrowser(); + nameTxt->SetText(GameTitles.GetTitle(header)); + // Remember the games new position + for (int i = 0; i < gameList.size(); ++i) + { + if (strncasecmp((const char *)gameList[i]->id, (const char *)header->id, 6) == 0) + { + Settings.SelectedGame = 0; + Settings.GameListOffset = i; + gameSelected = i; + } + } + if (browserMenu) + browserMenu->ReloadBrowser(); } // Show the window again Show(); - nameBtn->ResetState(); } diff --git a/source/settings/CSettings.cpp b/source/settings/CSettings.cpp index e98cf439..53056cdd 100644 --- a/source/settings/CSettings.cpp +++ b/source/settings/CSettings.cpp @@ -133,13 +133,14 @@ void CSettings::SetDefault() wiilight = WIILIGHT_ON; autonetwork = OFF; patchcountrystrings = OFF; - titlesOverride = ON; - ForceDiscTitles = OFF; + TitlesType = TITLETYPE_FROMWIITDB; + CacheCheck = ON; + CacheCheckCRC = 0; + CacheTitles = ON; screensaver = SCREENSAVER_10_MIN; musicloopmode = ON; marknewtitles = ON; ShowFreeSpace = ON; - UseGameHeaderCache = OFF; PlaylogUpdate = OFF; ParentalBlocks = BLOCK_ALL; InstallToDir = INSTALL_TO_NAME_GAMEID; @@ -150,7 +151,6 @@ void CSettings::SetDefault() BlockIOSReload = AUTO; USBPort = 0; USBAutoMount = ON; - CacheTitles = ON; WSFactor = 0.8f; //actually should be 0.75 for real widescreen FontScaleFactor = 0.8f; //it's a work around to not have to change ALL fonts now ClockFontScaleFactor = 1.0f; // Scale of 1 to prevent misaligned clock. @@ -314,7 +314,7 @@ bool CSettings::Save() char filedest[300]; snprintf(filedest, sizeof(filedest), "%sGXGlobal.cfg", ConfigPath); - if(!CreateSubfolder(ConfigPath)) return false; + if(!CreateSubfolder(ConfigPath)) return false; FILE * file = fopen(filedest, "w"); if (!file) return false; @@ -372,8 +372,10 @@ bool CSettings::Save() fprintf(file, "BcaCodepath = %s\n", BcaCodepath); fprintf(file, "WipCodepath = %s\n", WipCodepath); fprintf(file, "WDMpath = %s\n", WDMpath); - fprintf(file, "titlesOverride = %d\n", titlesOverride); - fprintf(file, "ForceDiscTitles = %d\n", ForceDiscTitles); + fprintf(file, "TitlesType = %d\n", TitlesType); + fprintf(file, "CacheCheck = %d\n", CacheCheck); + fprintf(file, "CacheCheckCRC = %08X\n", CacheCheckCRC); + fprintf(file, "CacheTitles = %d\n", CacheTitles); fprintf(file, "patchcountrystrings = %d\n", patchcountrystrings); fprintf(file, "screensaver = %d\n", screensaver); fprintf(file, "musicloopmode = %d\n", musicloopmode); @@ -383,7 +385,6 @@ bool CSettings::Save() fprintf(file, "partition = %d\n", partition); fprintf(file, "marknewtitles = %d\n", marknewtitles); fprintf(file, "ShowFreeSpace = %d\n", ShowFreeSpace); - fprintf(file, "UseGameHeaderCache = %d\n", UseGameHeaderCache); fprintf(file, "InstallToDir = %d\n", InstallToDir); fprintf(file, "GameSplit = %d\n", GameSplit); fprintf(file, "InstallPartitions = %08X\n", (unsigned int)InstallPartitions); @@ -394,7 +395,6 @@ bool CSettings::Save() fprintf(file, "MultiplePartitions = %d\n", MultiplePartitions); fprintf(file, "USBPort = %d\n", USBPort); fprintf(file, "USBAutoMount = %d\n", USBAutoMount); - fprintf(file, "CacheTitles = %d\n", CacheTitles); fprintf(file, "BlockIOSReload = %d\n", BlockIOSReload); fprintf(file, "WSFactor = %0.3f\n", WSFactor); fprintf(file, "FontScaleFactor = %0.3f\n", FontScaleFactor); @@ -702,14 +702,24 @@ bool CSettings::SetSetting(char *name, char *value) screensaver = atoi(value); return true; } - else if (strcmp(name, "titlesOverride") == 0) + else if (strcmp(name, "TitlesType") == 0) { - titlesOverride = atoi(value); + TitlesType = atoi(value); return true; } - else if (strcmp(name, "ForceDiscTitles") == 0) + else if (strcmp(name, "CacheCheck") == 0) { - ForceDiscTitles = atoi(value); + CacheCheck = atoi(value); + return true; + } + else if (strcmp(name, "CacheCheckCRC") == 0) + { + CacheCheckCRC = strtoul(value, 0, 16); + return true; + } + else if (strcmp(name, "CacheTitles") == 0) + { + CacheTitles = atoi(value); return true; } else if (strcmp(name, "musicloopmode") == 0) @@ -747,11 +757,6 @@ bool CSettings::SetSetting(char *name, char *value) ShowFreeSpace = atoi(value); return true; } - else if (strcmp(name, "UseGameHeaderCache") == 0) - { - UseGameHeaderCache = atoi(value); - return true; - } else if (strcmp(name, "HomeMenu") == 0) { HomeMenu = atoi(value); @@ -777,11 +782,6 @@ bool CSettings::SetSetting(char *name, char *value) USBAutoMount = atoi(value); return true; } - else if (strcmp(name, "CacheTitles") == 0) - { - CacheTitles = atoi(value); - return true; - } else if (strcmp(name, "patchcountrystrings") == 0) { patchcountrystrings = atoi(value); diff --git a/source/settings/CSettings.h b/source/settings/CSettings.h index cee75416..b0f1b6eb 100644 --- a/source/settings/CSettings.h +++ b/source/settings/CSettings.h @@ -84,8 +84,8 @@ class CSettings char WiinnertagPath[100]; char NandEmuPath[50]; char NandEmuChanPath[50]; - char BNRCachePath[50]; - char GameHeaderCachePath[50]; + char BNRCachePath[100]; + char GameHeaderCachePath[100]; char GameCubePath[100]; char GameCubeSDPath[100]; char DEVOLoaderPath[100]; @@ -135,7 +135,10 @@ class CSettings short partition; short musicloopmode; short godmode; - short titlesOverride; // db_titles + short TitlesType; + short CacheCheck; + u32 CacheCheckCRC; + short CacheTitles; short gridRows; short autonetwork; short discart; @@ -146,12 +149,10 @@ class CSettings short GameSplit; short PlaylogUpdate; short ShowFreeSpace; - short UseGameHeaderCache; short HomeMenu; short MultiplePartitions; short USBPort; short USBAutoMount; - short CacheTitles; short BlockIOSReload; u32 InstallPartitions; u32 ParentalBlocks; @@ -183,7 +184,6 @@ class CSettings short UseChanLauncher; int AdjustOverscanX; int AdjustOverscanY; - short ForceDiscTitles; short TooltipDelay; short GameWindowMode; short CacheBNRFiles; diff --git a/source/settings/GameTitles.cpp b/source/settings/GameTitles.cpp index 47f35b90..25470347 100644 --- a/source/settings/GameTitles.cpp +++ b/source/settings/GameTitles.cpp @@ -1,27 +1,43 @@ #include +#include +#include + #include "GameTitles.h" #include "CSettings.h" #include "usbloader/GameList.h" #include "Channels/channels.h" #include "xml/GameTDB.hpp" #include "svnrev.h" -#include "gecko.h" +#include "FileOperations/fileops.h" -#define VALID_CACHE_REVISION 1280 +#define VALID_CACHE_REVISION 1280 CGameTitles GameTitles; -void CGameTitles::SetGameTitle(const char * id, const char * title, const std::string region) +bool dbExists = false; + +void CGameTitles::SortTitleList() { - if(!id || !title) + std::sort(TitleList.begin(), TitleList.end(), [](const GameTitle &x, const GameTitle &y) + { return (strncasecmp(x.GameID, y.GameID, 6) < 0); }); +} + +void CGameTitles::SetGameTitle(const char *id, const char *title, char TitleType, const std::string region, int ParentalRating, int PlayersCount) +{ + if (!id || !title) return; - for(u32 i = 0; i < TitleList.size(); ++i) + for (u32 i = 0; i < TitleList.size(); ++i) { - if(strncasecmp(id, TitleList[i].GameID, 6) == 0) + if (strncasecmp(TitleList[i].GameID, id, 6) == 0) { TitleList[i].Title = title; TitleList[i].Region = region; + if (ParentalRating != -1) + TitleList[i].ParentalRating = ParentalRating; + if (PlayersCount != 1) + TitleList[i].PlayersCount = PlayersCount; + TitleList[i].TitleType = TitleType; return; } } @@ -30,85 +46,107 @@ void CGameTitles::SetGameTitle(const char * id, const char * title, const std::s snprintf(newTitle.GameID, sizeof(newTitle.GameID), id); newTitle.Title = title; newTitle.Region = region; - newTitle.ParentalRating = -1; - newTitle.PlayersCount = 1; - newTitle.FromWiiTDB = 0; + newTitle.ParentalRating = ParentalRating; + newTitle.PlayersCount = PlayersCount; + newTitle.TitleType = TitleType; TitleList.push_back(newTitle); } -const char * CGameTitles::GetTitle(const char * id) const +const char *CGameTitles::GetTitle(const char *id, bool allow_access) const { - if(!id) + if (!id) return ""; - for(u32 i = 0; i < TitleList.size(); ++i) + auto game = std::lower_bound(TitleList.begin(), TitleList.end(), id, [](const GameTitle >, const char *gameid) + { return (strncasecmp(gt.GameID, gameid, 6) < 0); }); + if (game != TitleList.end()) { - if(strncasecmp(id, TitleList[i].GameID, 6) == 0) - return TitleList[i].Title.c_str(); + if (strncasecmp((const char *)game->GameID, (const char *)id, 6) == 0) + { + if ((dbExists && Settings.TitlesType == TITLETYPE_FROMWIITDB) || game->TitleType == TITLETYPE_MANUAL_OVERRIDE || (Settings.TitlesType == TITLETYPE_FORCED_DISC && game->TitleType == TITLETYPE_FORCED_DISC) || allow_access) + return game->Title.c_str(); + } } - for(int i = 0; i < gameList.size(); ++i) + for (int i = 0; i < gameList.size(); ++i) { - if(strncasecmp(id, (char *) gameList[i]->id, 6) == 0) + if (strncasecmp((const char *)gameList[i]->id, id, 6) == 0) return gameList[i]->title; - } return ""; } -const char * CGameTitles::GetTitle(const struct discHdr *header) const +const char *CGameTitles::GetTitle(const struct discHdr *header) const { - if(!header) + if (!header) return ""; - for(u32 i = 0; i < TitleList.size(); ++i) + auto game = std::lower_bound(TitleList.begin(), TitleList.end(), (const char *)header->id, [](const GameTitle >, const char *gameid) + { return (strncasecmp(gt.GameID, gameid, 6) < 0); }); + if (game != TitleList.end()) { - if(strncasecmp((const char *) header->id, TitleList[i].GameID, 6) == 0) - return TitleList[i].Title.c_str(); + if (strncasecmp(game->GameID, (const char *)header->id, 6) == 0) + { + if ((dbExists && Settings.TitlesType == TITLETYPE_FROMWIITDB) || game->TitleType == TITLETYPE_MANUAL_OVERRIDE || (Settings.TitlesType == TITLETYPE_FORCED_DISC && game->TitleType == TITLETYPE_FORCED_DISC)) + return game->Title.c_str(); + } } return header->title; } -const char * CGameTitles::GetRegion(const char * id) const +char CGameTitles::GetTitleType(const char *id) const { - if(!id || !Settings.titlesOverride) + if (!id) + return 0; + + for (u32 i = 0; i < TitleList.size(); ++i) + { + if (strncasecmp(TitleList[i].GameID, id, 6) == 0) + return TitleList[i].TitleType; + } + + return 0; +} + +const char *CGameTitles::GetRegion(const char *id) const +{ + if (!id || Settings.TitlesType != TITLETYPE_FROMWIITDB) return "NULL"; - for(u32 i = 0; i < TitleList.size(); ++i) + for (u32 i = 0; i < TitleList.size(); ++i) { - if(strncasecmp(id, TitleList[i].GameID, 6) == 0) + if (strncasecmp(TitleList[i].GameID, id, 6) == 0) return TitleList[i].Region.c_str(); } return "NULL"; } -int CGameTitles::GetParentalRating(const char * id) const +int CGameTitles::GetParentalRating(const char *id) const { - if(!id) + if (!id) return -1; - for(u32 i = 0; i < TitleList.size(); ++i) + for (u32 i = 0; i < TitleList.size(); ++i) { - if(strncasecmp(id, TitleList[i].GameID, 6) == 0) + if (strncasecmp(TitleList[i].GameID, id, 6) == 0) return TitleList[i].ParentalRating; } return -1; } - -int CGameTitles::GetPlayersCount(const char * id) const +int CGameTitles::GetPlayersCount(const char *id) const { - if(!id) + if (!id) return 1; - for(u32 i = 0; i < TitleList.size(); ++i) + for (u32 i = 0; i < TitleList.size(); ++i) { - if(strncasecmp(id, TitleList[i].GameID, 6) == 0) + if (strncasecmp(TitleList[i].GameID, id, 6) == 0) return TitleList[i].PlayersCount; } @@ -122,33 +160,41 @@ void CGameTitles::SetDefault() std::vector().swap(TitleList); } -typedef struct _CacheTitle +void CGameTitles::Reset() { - char GameID[7]; - char Title[130]; // long titles e.g. RGOJJ9 & DLSP64 - char Region[7]; - char FromWiiTDB; - int ParentalRating; - int PlayersCount; + if (TitleList.empty()) + return; -} ATTRIBUTE_PACKED CacheTitle; + for (u32 i = 0; i < TitleList.size(); ++i) + { + if (TitleList[i].TitleType < TITLETYPE_MANUAL_OVERRIDE) + TitleList[i].TitleType = TITLETYPE_DEFAULT; + } +} -u32 CGameTitles::ReadCachedTitles(const char * path) +u32 CGameTitles::ReadCachedTitles(const char *path) { - std::string Cachepath = path; - if(path[strlen(path)-1] != '/') + std::string dbpath(Settings.titlestxt_path); + if (dbpath.back() != '/') + dbpath += '/'; + dbpath += "wiitdb.xml"; + dbExists = CheckFile(dbpath.c_str()); + + std::string Cachepath(path); + if (Cachepath.back() != '/') Cachepath += '/'; Cachepath += "TitlesCache.bin"; //! Load cached last so that the titles are preloaded before reading list - FILE * f = fopen(Cachepath.c_str(), "rb"); - if(!f) return 0; + FILE *f = fopen(Cachepath.c_str(), "rb"); + if (!f) + return 0; u32 revision = 0; fread(&revision, 1, 4, f); - if(revision < VALID_CACHE_REVISION) + if (revision < VALID_CACHE_REVISION) { fclose(f); return 0; @@ -160,7 +206,7 @@ u32 CGameTitles::ReadCachedTitles(const char * path) fread(LangCode, 1, 10, f); //! Check if cache has correct language code - if(strcmp(LangCode, Settings.db_language) != 0) + if (strcmp(LangCode, Settings.db_language) != 0) { fclose(f); return 0; @@ -172,31 +218,31 @@ u32 CGameTitles::ReadCachedTitles(const char * path) std::vector CachedList(count); TitleList.resize(count); - fread(&CachedList[0], 1, count*sizeof(CacheTitle), f); + fread(&CachedList[0], 1, count * sizeof(CacheTitle), f); fclose(f); - for(u32 i = 0; i < count; ++i) + for (u32 i = 0; i < count; ++i) { strcpy(TitleList[i].GameID, CachedList[i].GameID); TitleList[i].Title = CachedList[i].Title; TitleList[i].Region = CachedList[i].Region; TitleList[i].ParentalRating = CachedList[i].ParentalRating; TitleList[i].PlayersCount = CachedList[i].PlayersCount; - TitleList[i].FromWiiTDB = CachedList[i].FromWiiTDB; + TitleList[i].TitleType = CachedList[i].TitleType; } return count; } -void CGameTitles::WriteCachedTitles(const char * path) +void CGameTitles::WriteCachedTitles(const char *path) { - std::string Cachepath = path; - if(path[strlen(path)-1] != '/') + std::string Cachepath(path); + if (Cachepath.back() != '/') Cachepath += '/'; Cachepath += "TitlesCache.bin"; FILE *f = fopen(Cachepath.c_str(), "wb"); - if(!f) + if (!f) return; CacheTitle Cache; @@ -205,8 +251,9 @@ void CGameTitles::WriteCachedTitles(const char * path) fwrite(&revision, 1, 4, f); fwrite(Settings.db_language, 1, 10, f); fwrite(&count, 1, 4, f); + SortTitleList(); - for(u32 i = 0; i < count; ++i) + for (u32 i = 0; i < count; ++i) { memset(&Cache, 0, sizeof(CacheTitle)); snprintf(Cache.GameID, sizeof(Cache.GameID), "%s", TitleList[i].GameID); @@ -214,7 +261,7 @@ void CGameTitles::WriteCachedTitles(const char * path) snprintf(Cache.Region, sizeof(Cache.Region), "%s", TitleList[i].Region.c_str()); Cache.ParentalRating = TitleList[i].ParentalRating; Cache.PlayersCount = TitleList[i].PlayersCount; - Cache.FromWiiTDB = TitleList[i].FromWiiTDB; + Cache.TitleType = TitleList[i].TitleType; fwrite(&Cache, 1, sizeof(CacheTitle), f); } @@ -222,99 +269,109 @@ void CGameTitles::WriteCachedTitles(const char * path) fclose(f); } -void CGameTitles::GetMissingTitles(std::vector &MissingTitles, bool removeUnused) +int CGameTitles::GetMissingTitles(std::vector &MissingTitles, std::vector &headerlist) { - std::vector &FullList = gameList.GetFilteredList(); - std::vector UsedCachedList(TitleList.size(), false); - - for(u32 i = 0; i < FullList.size(); ++i) + for (u32 i = 0; i < headerlist.size(); ++i) { - bool isCached = false; - - for(u32 n = 0; n < TitleList.size(); ++n) + bool found = false; + for (u32 n = 0; n < TitleList.size(); ++n) { - if(strncasecmp(TitleList[n].GameID, (const char *) FullList[i]->id, 6) == 0) + if (strncasecmp(TitleList[n].GameID, (const char *)headerlist[i]->id, 6) == 0) { - UsedCachedList[n] = true; - //! If the title is not from WiiTDB, try to reload it - isCached = TitleList[n].FromWiiTDB; + if (TitleList[n].TitleType >= TITLETYPE_FROMWIITDB) + found = true; break; } } - - if(!isCached) - { - char gameID[7]; - snprintf(gameID, sizeof(gameID), (const char *) FullList[i]->id); - MissingTitles.push_back(std::string(gameID)); - } + if (!found /*&& !headerlist[i]->tid*/) + MissingTitles.push_back((std::string)(const char *)headerlist[i]->id); } + return MissingTitles.size(); +} - if(!removeUnused) +void CGameTitles::CleanTitles(std::vector &headerlist) +{ + if (TitleList.empty()) return; - for(u32 n = 0; n < TitleList.size(); ++n) + for (u32 n = 0; n < TitleList.size(); ++n) { - if(!UsedCachedList[n]) + bool isCached = false; + for (u32 i = 0; i < headerlist.size(); ++i) { - TitleList.erase(TitleList.begin()+n); + if (strncasecmp(TitleList[n].GameID, (const char *)headerlist[i]->id, 6) == 0) + { + isCached = true; + break; + } + } + if (!isCached) + { + TitleList.erase(TitleList.begin() + n); n--; } } + return; } -void CGameTitles::LoadTitlesFromGameTDB(const char * path, bool removeUnused) +void CGameTitles::LoadTitlesFromGameTDB(const char *path) { - if(!path || !Settings.titlesOverride) + if (!path || Settings.TitlesType != TITLETYPE_FROMWIITDB) return; - std::string Filepath = path; - if(path[strlen(path)-1] != '/') + std::string Filepath(path); + if (Filepath.back() != '/') Filepath += '/'; - Filepath += "wiitdb.xml"; - //! Read game list - gameList.LoadUnfiltered(); - - //! Removed unused cache titles and get the still missing ones - std::vector MissingTitles; - GetMissingTitles(MissingTitles, removeUnused); - - if(MissingTitles.size() == 0) + std::vector headerlist; + if (!gameList.GetGameListHeaders(headerlist, MODE_ALL)) return; - std::string Title; + //! Removed unused cache titles and get the still missing ones + CleanTitles(headerlist); + std::vector MissingTitles; + if (!GetMissingTitles(MissingTitles, headerlist)) + return; + + GameTDB XML_DB; + if (!XML_DB.OpenFile(Filepath.c_str())) + return; + dbExists = true; - GameTDB XML_DB(Filepath.c_str()); XML_DB.SetLanguageCode(Settings.db_language); - int Rating; - std::string RatValTxt; - std::string Region; - for(u32 i = 0; i < MissingTitles.size(); ++i) + for (u32 i = 0; i < MissingTitles.size(); ++i) { - if(!XML_DB.GetTitle(MissingTitles[i].c_str(), Title)) + std::string Title; + std::string Region; + std::string RatValTxt; + int ParentalRating = -1; + int PlayersCount = 1; + + if (!XML_DB.GetTitle(MissingTitles[i].c_str(), Title)) continue; - if(XML_DB.GetRegion(MissingTitles[i].c_str(), Region)) - this->SetGameTitle(MissingTitles[i].c_str(), Title.c_str(), Region); + // This change allows the game to be sorted correctly + if (Title.compare("Ōkami") == 0) + Title.assign("Okami"); + + int Rating = XML_DB.GetRating(MissingTitles[i].c_str()); + if (Rating >= 0) + { + if (XML_DB.GetRatingValue(MissingTitles[i].c_str(), RatValTxt)) + ParentalRating = GameTDB::ConvertRating(RatValTxt.c_str(), GameTDB::RatingToString(Rating), "PEGI"); + } + + int pc = XML_DB.GetPlayers(MissingTitles[i].c_str()); + if (pc > 0) + PlayersCount = pc; + + if (XML_DB.GetRegion(MissingTitles[i].c_str(), Region)) + SetGameTitle(MissingTitles[i].c_str(), Title.c_str(), TITLETYPE_FROMWIITDB, Region, ParentalRating, PlayersCount); else - this->SetGameTitle(MissingTitles[i].c_str(), Title.c_str()); - //! Title is loaded from WiiTDB, remember that it's good - TitleList[TitleList.size()-1].FromWiiTDB = 1; - - Rating = XML_DB.GetRating(MissingTitles[i].c_str()); - if(Rating < 0) - continue; - - if(!XML_DB.GetRatingValue(MissingTitles[i].c_str(), RatValTxt)) - continue; - - TitleList[TitleList.size()-1].ParentalRating = GameTDB::ConvertRating(RatValTxt.c_str(), GameTDB::RatingToString(Rating), "PEGI"); - int ret = XML_DB.GetPlayers(MissingTitles[i].c_str()); - if(ret > 0) - TitleList[TitleList.size()-1].PlayersCount = ret; + SetGameTitle(MissingTitles[i].c_str(), Title.c_str(), TITLETYPE_FROMWIITDB, "NULL", ParentalRating, PlayersCount); } XML_DB.CloseFile(); + SortTitleList(); } diff --git a/source/settings/GameTitles.h b/source/settings/GameTitles.h index ff125255..d92ba620 100644 --- a/source/settings/GameTitles.h +++ b/source/settings/GameTitles.h @@ -5,6 +5,7 @@ #include #include #include "usbloader/disc.h" +#include "SettingsEnums.h" typedef struct _GameTitle { @@ -13,25 +14,39 @@ typedef struct _GameTitle std::string Region; int ParentalRating; int PlayersCount; - char FromWiiTDB; + char TitleType; } GameTitle; +typedef struct _CacheTitle +{ + char GameID[7]; + char Title[130]; // long titles e.g. RGOJJ9 & DLSP64 + char Region[7]; + int ParentalRating; + int PlayersCount; + char TitleType; + +} ATTRIBUTE_PACKED CacheTitle; + class CGameTitles { public: + //! Sort the title list + void SortTitleList(); //! Set a game title from GameTDB - void SetGameTitle(const char * id, const char * title, const std::string region = "NULL"); + void SetGameTitle(const char * id, const char * title, char TitleType = TITLETYPE_DEFAULT, std::string region = "NULL", int ParentalRating = -1, int PlayersCount = 1); //! Overload - void SetGameTitle(const u8 * id, const char * title) { SetGameTitle((const char *) id, title, "NULL"); }; + void SetGameTitle(const u8 * id, const char * title, char TitleType = TITLETYPE_DEFAULT) { SetGameTitle((const char *) id, title, TitleType); }; //! Get a game title - const char * GetTitle(const char * id) const; + const char * GetTitle(const char * id, bool allow_access = false) const; //! Overload - const char * GetTitle(const u8 * id) const { return GetTitle((const char *) id); }; + const char * GetTitle(const u8 * id, bool allow_access = false) const { return GetTitle((const char *) id, allow_access); }; //! Overload const char * GetTitle(const struct discHdr *header) const; - + //! Get title type + char GetTitleType(const char * id) const; //! Get game region const char * GetRegion(const char * id) const; //! Get game parental rating @@ -39,16 +54,18 @@ class CGameTitles //! Get possible number of players for this game int GetPlayersCount(const char * id) const; //! Load Game Titles from GameTDB - void LoadTitlesFromGameTDB(const char * path, bool removeUnused = true); + void LoadTitlesFromGameTDB(const char * path); //! Set default game titles void SetDefault(); + void Reset(); //! Free memory and remove all titles - Same as SetDefault() void Clear() { SetDefault(); } //! Cache titles functions u32 ReadCachedTitles(const char * path); void WriteCachedTitles(const char * path); protected: - void GetMissingTitles(std::vector &MissingTitles, bool removeUnused); + int GetMissingTitles(std::vector &MissingTitles, std::vector &headerlist); + void CleanTitles(std::vector &headerlist); std::vector TitleList; }; diff --git a/source/settings/SettingsEnums.h b/source/settings/SettingsEnums.h index b60143a9..11569e2c 100644 --- a/source/settings/SettingsEnums.h +++ b/source/settings/SettingsEnums.h @@ -385,7 +385,14 @@ enum PRIVSERV_ALTWFC, PRIVSERV_CUSTOM, PRIVSERV_MAX_CHOICE - +}; + +enum TITLETYPE +{ + TITLETYPE_DEFAULT, + TITLETYPE_FORCED_DISC, + TITLETYPE_FROMWIITDB, + TITLETYPE_MANUAL_OVERRIDE = 7 }; #endif diff --git a/source/settings/menus/CustomPathsSM.cpp b/source/settings/menus/CustomPathsSM.cpp index d62a3f07..b4619ffc 100644 --- a/source/settings/menus/CustomPathsSM.cpp +++ b/source/settings/menus/CustomPathsSM.cpp @@ -37,6 +37,8 @@ #include "themes/CTheme.h" #include "FileOperations/fileops.h" #include "gecko.h" +#include "cache/cache.hpp" +#include "usbloader/GameList.h" CustomPathsSM::CustomPathsSM() : SettingsMenu(tr("Custom Paths"), &GuiOptions, MENU_NONE) @@ -65,7 +67,7 @@ CustomPathsSM::CustomPathsSM() Options->SetName(Idx++, tr("Devolution Loader Path")); Options->SetName(Idx++, tr("Nintendont Loader Path")); Options->SetName(Idx++, tr("Cache BNR Files Path")); - Options->SetName(Idx++, tr("Game Header Cache Files Path")); + Options->SetName(Idx++, tr("Cache Path")); SetOptionValues(); } @@ -143,7 +145,7 @@ void CustomPathsSM::SetOptionValues() //! Settings: Cache BNR Files Path Options->SetValue(Idx++, Settings.BNRCachePath); - //! Settings: Game Header Cache Files Path + //! Settings: Cache Path Options->SetValue(Idx++, Settings.GameHeaderCachePath); } @@ -316,7 +318,7 @@ int CustomPathsSM::GetMenuInternal() else if(result == 1) { Channels::Instance()->GetEmuChannelList(); - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path, false); + GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); } } @@ -372,10 +374,10 @@ int CustomPathsSM::GetMenuInternal() ChangePath(Settings.BNRCachePath, sizeof(Settings.BNRCachePath)); } - //! Settings: Game Header Cache Files Path + //! Settings: Cache Path else if (ret == ++Idx) { - titleTxt->SetText(tr( "Game Header Cache Files Path" )); + titleTxt->SetText(tr( "Cache Path" )); ChangePath(Settings.GameHeaderCachePath, sizeof(Settings.GameHeaderCachePath)); } diff --git a/source/settings/menus/FeatureSettingsMenu.cpp b/source/settings/menus/FeatureSettingsMenu.cpp index 7f530992..5bdc036d 100644 --- a/source/settings/menus/FeatureSettingsMenu.cpp +++ b/source/settings/menus/FeatureSettingsMenu.cpp @@ -27,6 +27,7 @@ #include "FeatureSettingsMenu.hpp" #include "Channels/channels.h" +#include "GameCube/GCGames.h" #include "settings/CGameCategories.hpp" #include "settings/CGameSettings.h" #include "settings/GameTitles.h" @@ -62,14 +63,47 @@ static const char * WiilightText[WIILIGHT_MAX] = trNOOP( "Only for Install" ) }; +static const char * TitleTypeText[] = +{ + trNOOP( "Folder" ), + trNOOP( "Disc" ), + trNOOP( "GameTDB" ) +}; + FeatureSettingsMenu::FeatureSettingsMenu() : SettingsMenu(tr("Features Settings"), &GuiOptions, MENU_NONE) +{ + SetOptionNames(); + SetOptionValues(); + OldTitlesType = Settings.TitlesType; + OldCacheTitles = Settings.CacheTitles; +} + +FeatureSettingsMenu::~FeatureSettingsMenu() +{ + if (Settings.TitlesType != OldTitlesType || Settings.CacheTitles != OldCacheTitles) + { + //! Remove cached titles and reload new titles + GameTitles.Reset(); + gameList.clear(); + GCGames::Instance()->clear(); + Channels::Instance()->clear(); + + if ((Settings.CacheTitles && (Settings.TitlesType == TITLETYPE_FORCED_DISC || OldTitlesType == TITLETYPE_FORCED_DISC)) || (!Settings.CacheTitles && OldCacheTitles)) + ResetGameHeaderCache(); + + gameList.LoadUnfiltered(); + } + //! EmuNAND contents might of changed + isCacheCurrent(); +} + +void FeatureSettingsMenu::SetOptionNames() { int Idx = 0; - Options->SetName(Idx++, "%s", tr( "Titles from GameTDB" )); + + Options->SetName(Idx++, "%s", tr( "Titles From" )); Options->SetName(Idx++, "%s", tr( "Cache Titles" )); - Options->SetName(Idx++, "%s", tr( "Use Game Header Cache" )); - Options->SetName(Idx++, "%s", tr( "Force Titles from Disc" )); Options->SetName(Idx++, "%s", tr( "Wiilight" )); Options->SetName(Idx++, "%s", tr( "Rumble" )); Options->SetName(Idx++, "%s", tr( "AutoInit Network" )); @@ -86,54 +120,20 @@ FeatureSettingsMenu::FeatureSettingsMenu() Options->SetName(Idx++, "%s", tr( "WiiU Widescreen" )); Options->SetName(Idx++, "%s", tr( "Boot Neek System Menu" )); Options->SetName(Idx++, "%s", tr( "Reset All Game Settings" )); - Options->SetName(Idx++, "%s", tr( "Reset Game Header Cache" )); - - OldTitlesOverride = Settings.titlesOverride; - OldCacheTitles = Settings.CacheTitles; - OldForceDiscTitles = Settings.ForceDiscTitles; - - SetOptionValues(); -} - -FeatureSettingsMenu::~FeatureSettingsMenu() -{ - if ( Settings.titlesOverride != OldTitlesOverride - || Settings.CacheTitles != OldCacheTitles - || Settings.ForceDiscTitles != OldForceDiscTitles) - { - if(Settings.ForceDiscTitles) - Settings.titlesOverride = OFF; - - //! Remove cached titles and reload new titles - GameTitles.SetDefault(); - if(Settings.titlesOverride) { - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); - } - else - { - //! Don't override titles, in other words read them from disc header or directory names - gameList.ReadGameList(); - gameList.LoadUnfiltered(); - } - } + if (Settings.CacheTitles) + Options->SetName(Idx++, "%s", tr( "Reset Cached Titles" )); } void FeatureSettingsMenu::SetOptionValues() { int Idx = 0; - //! Settings: Titles from GameTDB - Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.titlesOverride] )); + //! Settings: Titles From + Options->SetValue(Idx++, "%s", tr( TitleTypeText[Settings.TitlesType] )); //! Settings: Cache Titles Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.CacheTitles] )); - //! Settings: Use Game Header Cache - Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.UseGameHeaderCache] )); - - //! Settings: Force Titles from Disc - Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.ForceDiscTitles] )); - //! Settings: Wiilight Options->SetValue(Idx++, "%s", tr( WiilightText[Settings.wiilight] )); @@ -191,28 +191,19 @@ int FeatureSettingsMenu::GetMenuInternal() int Idx = -1; - //! Settings: Titles from GameTDB + //! Settings: Titles From if (ret == ++Idx) { - if (++Settings.titlesOverride >= MAX_ON_OFF) Settings.titlesOverride = 0; + if (++Settings.TitlesType >= 3) Settings.TitlesType = 0; } //! Settings: Cache Titles else if (ret == ++Idx) { if (++Settings.CacheTitles >= MAX_ON_OFF) Settings.CacheTitles = 0; - } - - //! Settings: Use Game Header Cache - else if (ret == ++Idx) - { - if (++Settings.UseGameHeaderCache >= MAX_ON_OFF) Settings.UseGameHeaderCache = 0; - } - - //! Settings: Force Titles from Disc - else if (ret == ++Idx) - { - if (++Settings.ForceDiscTitles >= MAX_ON_OFF) Settings.ForceDiscTitles = 0; + Options->ClearList(); + SetOptionNames(); + SetOptionValues(); } //! Settings: Wiilight @@ -332,8 +323,7 @@ int FeatureSettingsMenu::GetMenuInternal() for(int i = 0; i < gameList.size(); ++i) { - if( gameList[i]->type != TYPE_GAME_WII_IMG - && gameList[i]->type != TYPE_GAME_NANDCHAN) + if(gameList[i]->type != TYPE_GAME_WII_IMG && gameList[i]->type != TYPE_GAME_NANDCHAN) continue; if(gameList[i]->tid != 0) //! Channels @@ -548,7 +538,6 @@ int FeatureSettingsMenu::GetMenuInternal() } // Refresh new EmuNAND content - ResetGameHeaderCache(); Channels::Instance()->GetEmuChannelList(); GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); } @@ -639,7 +628,6 @@ int FeatureSettingsMenu::GetMenuInternal() } // Refresh new EmuNAND content - ResetGameHeaderCache(); Channels::Instance()->GetEmuChannelList(); GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); } @@ -749,14 +737,17 @@ int FeatureSettingsMenu::GetMenuInternal() GameSettings.RemoveAll(); } - //! Reset Game Header Cache - else if(ret == ++Idx) + //! Reset Cached Titles + else if(Settings.CacheTitles && ret == ++Idx) { int choice = WindowPrompt(tr( "Are you sure you want to reset?" ), 0, tr( "Yes" ), tr( "Cancel" )); if (choice == 1) { + gameList.clear(); + GCGames::Instance()->clear(); + Channels::Instance()->clear(); ResetGameHeaderCache(); - gameList.ReadGameList(); + gameList.LoadUnfiltered(); } } SetOptionValues(); diff --git a/source/settings/menus/FeatureSettingsMenu.hpp b/source/settings/menus/FeatureSettingsMenu.hpp index 19b70c81..b1883041 100644 --- a/source/settings/menus/FeatureSettingsMenu.hpp +++ b/source/settings/menus/FeatureSettingsMenu.hpp @@ -32,12 +32,12 @@ class FeatureSettingsMenu : public SettingsMenu FeatureSettingsMenu(); virtual ~FeatureSettingsMenu(); protected: + void SetOptionNames(); void SetOptionValues(); int GetMenuInternal(); - int OldTitlesOverride; + int OldTitlesType; int OldCacheTitles; - int OldForceDiscTitles; OptionList GuiOptions; }; diff --git a/source/settings/menus/GUISettingsMenu.cpp b/source/settings/menus/GUISettingsMenu.cpp index 07c4bd6f..b728bd2f 100644 --- a/source/settings/menus/GUISettingsMenu.cpp +++ b/source/settings/menus/GUISettingsMenu.cpp @@ -280,7 +280,7 @@ int GuiSettingsMenu::GetMenuInternal() if (returnhere == 2) { //! Language changed. Reload game titles with new lang code. - GameTitles.SetDefault(); + GameTitles.Reset(); GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); return MENU_SETTINGS; } diff --git a/source/settings/menus/HardDriveSM.cpp b/source/settings/menus/HardDriveSM.cpp index ccea76ad..18af0f84 100644 --- a/source/settings/menus/HardDriveSM.cpp +++ b/source/settings/menus/HardDriveSM.cpp @@ -124,7 +124,6 @@ HardDriveSM::~HardDriveSM() //! Reload the new game titles gameList.ReadGameList(); gameList.LoadUnfiltered(); - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path, false); if(oldSettingsUSBAutoMount != Settings.USBAutoMount || NewSettingsUSBPort == -1) { diff --git a/source/settings/menus/LoaderSettings.cpp b/source/settings/menus/LoaderSettings.cpp index edda41b2..5a106d08 100644 --- a/source/settings/menus/LoaderSettings.cpp +++ b/source/settings/menus/LoaderSettings.cpp @@ -226,7 +226,6 @@ LoaderSettings::~LoaderSettings() } gameList.LoadUnfiltered(); - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path, false); } if(oldGameCubeSource != Settings.GameCubeSource) @@ -1067,4 +1066,3 @@ int LoaderSettings::GetMenuInternal() return MENU_NONE; } - diff --git a/source/settings/menus/UninstallSM.cpp b/source/settings/menus/UninstallSM.cpp index 5bb43161..c9027106 100644 --- a/source/settings/menus/UninstallSM.cpp +++ b/source/settings/menus/UninstallSM.cpp @@ -129,17 +129,17 @@ int UninstallSM::GetMenuInternal() if(ret >= 0) { wString oldFilter(gameList.GetCurrentFilter()); - ResetGameHeaderCache(); gameList.ReadGameList(); gameList.FilterList(oldFilter.c_str()); + isCacheCurrent(); } } else if(DiscHeader->type == TYPE_GAME_GC_IMG) { GCGames::Instance()->RemoveGame(GameID); - ResetGameHeaderCache(); // Reload list GCGames::Instance()->LoadAllGames(); + isCacheCurrent(); } else if(DiscHeader->type == TYPE_GAME_EMUNANDCHAN && DiscHeader->tid != 0) { @@ -151,8 +151,8 @@ int UninstallSM::GetMenuInternal() snprintf(filepath, sizeof(filepath), "%s/title/%08x/%08x/", Settings.NandEmuChanPath, (unsigned int) (DiscHeader->tid >> 32), (unsigned int) DiscHeader->tid); RemoveDirectory(filepath); - ResetGameHeaderCache(); Channels::Instance()->GetEmuChannelList(); + isCacheCurrent(); } if(choice == 2) diff --git a/source/sys.cpp b/source/sys.cpp index 9e67ad47..c64f0d42 100644 --- a/source/sys.cpp +++ b/source/sys.cpp @@ -91,8 +91,7 @@ void AppCleanUp(void) BannerAsync::ThreadExit(); - if(Settings.CacheTitles) - GameTitles.WriteCachedTitles(Settings.titlestxt_path); + GameTitles.WriteCachedTitles(Settings.titlestxt_path); Settings.Save(); ExitGUIThreads(); diff --git a/source/usbloader/GameList.cpp b/source/usbloader/GameList.cpp index d3a8c2d4..2071bc7c 100644 --- a/source/usbloader/GameList.cpp +++ b/source/usbloader/GameList.cpp @@ -55,8 +55,10 @@ void GameList::clear() FullGameList.clear(); GamePartitionList.clear(); FilteredList.clear(); + EnabledGameList.clear(); //! Clear memory of the vector completely std::vector().swap(FilteredList); + std::vector().swap(EnabledGameList); std::vector().swap(FullGameList); std::vector().swap(GamePartitionList); } @@ -118,6 +120,9 @@ int GameList::InternalReadList(int part) if (cnt == 0) return 0; + // Sort the titles by game ID for faster searching + GameTitles.SortTitleList(); + /* Buffer length */ u32 len = sizeof(struct discHdr) * cnt; @@ -165,14 +170,14 @@ int GameList::InternalReadList(int part) return PartGameList.size(); } -int GameList::ReadGameList() +int GameList::ReadGameList(bool use_cache) { - if (Settings.UseGameHeaderCache && isCacheFile(WII_HEADER_CACHE_FILE)) + if (use_cache && Settings.CacheTitles && isCacheFile(WII_HEADER_CACHE_FILE)) { if (FullGameList.empty() && GamePartitionList.empty()) LoadGameHeaderCache(FullGameList, GamePartitionList); if (!FullGameList.empty()) - return (int)FullGameList.size(); + return FullGameList.size(); } // Clear list FullGameList.clear(); @@ -199,17 +204,16 @@ int GameList::ReadGameList() } } - if (Settings.UseGameHeaderCache && !FullGameList.empty() && !GamePartitionList.empty()) + if (Settings.CacheTitles) SaveGameHeaderCache(FullGameList, GamePartitionList); - return cnt; } -void GameList::InternalFilterList(std::vector &FullList) +void GameList::InternalFilterList(std::vector &FullList) { for (u32 i = 0; i < FullList.size(); ++i) { - struct discHdr *header = &FullList[i]; + struct discHdr *header = FullList[i]; /* Register game */ NewTitles::Instance()->CheckGame(header->id); @@ -231,7 +235,7 @@ void GameList::InternalFilterList(std::vector &FullList) } } - //ignore uLoader cfg "iso". i was told it is "__CFG_" but not confirmed + // Ignore uLoader cfg "iso". i was told it is "__CFG_" but not confirmed if (strncasecmp((char *)header->id, "__CFG_", 6) == 0) continue; @@ -326,65 +330,27 @@ void GameList::InternalFilterList(std::vector &FullList) int GameList::FilterList(const wchar_t *gameFilter) { - if ((Settings.LoaderMode & MODE_WIIGAMES) && (FullGameList.size() == 0)) - ReadGameList(); - if (gameFilter) GameFilter.assign(gameFilter); FilteredList.clear(); - int allType = DISABLED; - // Verify the display mode for category "All" - for (u32 n = 0; n < Settings.EnabledCategories.size(); ++n) - { - if (Settings.EnabledCategories[n] == 0) - { - allType = ENABLED; - break; - } - } - - if (Settings.UseGameHeaderCache && allType == ENABLED && Settings.godmode && isCacheFile(FilteredListCacheFileName(gameFilter))) - { - LoadFilteredListCache(FilteredList, GameFilter.c_str()); - GuiSearchBar::FilterList(FilteredList, GameFilter); - if (!FilteredList.empty()) - return FilteredList.size(); - } - - // Filter current game list if selected - if (Settings.LoaderMode & MODE_WIIGAMES) - InternalFilterList(FullGameList); - - // Filter gc game list if selected - if (Settings.LoaderMode & MODE_GCGAMES) - InternalFilterList(GCGames::Instance()->GetHeaders()); - - // Filter nand channel list if selected - if (Settings.LoaderMode & MODE_NANDCHANNELS) - InternalFilterList(Channels::Instance()->GetNandHeaders()); - - // Filter emu nand channel list if selected - if (Settings.LoaderMode & MODE_EMUCHANNELS) - InternalFilterList(Channels::Instance()->GetEmuHeaders()); + EnabledList(); + InternalFilterList(EnabledGameList); NewTitles::Instance()->Save(); GuiSearchBar::FilterList(FilteredList, GameFilter); SortList(); - if (Settings.UseGameHeaderCache && allType == ENABLED && Settings.godmode && !FilteredList.empty() && (Settings.GameSort & SORT_RANKING) == 0 && (Settings.GameSort & SORT_PLAYCOUNT) == 0 && (Settings.GameSort & SORT_FAVORITE) == 0) - SaveFilteredListCache(FilteredList, GameFilter.c_str()); - return FilteredList.size(); } -void GameList::InternalLoadUnfiltered(std::vector &FullList) +void GameList::InternalLoadUnfiltered(std::vector &FullList) { for (u32 i = 0; i < FullList.size(); ++i) { - struct discHdr *header = &FullList[i]; + struct discHdr *header = FullList[i]; /* Register game */ NewTitles::Instance()->CheckGame(header->id); @@ -395,47 +361,66 @@ void GameList::InternalLoadUnfiltered(std::vector &FullList) int GameList::LoadUnfiltered() { - if ((Settings.LoaderMode & MODE_WIIGAMES) && (FullGameList.size() == 0)) - ReadGameList(); - GameFilter.clear(); FilteredList.clear(); - if (Settings.UseGameHeaderCache && isCacheFile(FilteredListCacheFileName())) - { - LoadFilteredListCache(FilteredList, GameFilter.c_str()); - GuiSearchBar::FilterList(FilteredList, GameFilter); - if (!FilteredList.empty()) - return FilteredList.size(); - } - - // Filter current game list if selected - if (Settings.LoaderMode & MODE_WIIGAMES) - InternalLoadUnfiltered(FullGameList); - - // Filter gc game list if selected - if (Settings.LoaderMode & MODE_GCGAMES) - InternalLoadUnfiltered(GCGames::Instance()->GetHeaders()); - - // Filter nand channel list if selected - if (Settings.LoaderMode & MODE_NANDCHANNELS) - InternalLoadUnfiltered(Channels::Instance()->GetNandHeaders()); - - // Filter emu nand channel list if selected - if (Settings.LoaderMode & MODE_EMUCHANNELS) - InternalLoadUnfiltered(Channels::Instance()->GetEmuHeaders()); + EnabledList(); + InternalLoadUnfiltered(EnabledGameList); NewTitles::Instance()->Save(); GuiSearchBar::FilterList(FilteredList, GameFilter); SortList(); - if (Settings.UseGameHeaderCache && !FilteredList.empty() && (Settings.GameSort & SORT_RANKING) == 0 && (Settings.GameSort & SORT_PLAYCOUNT) == 0 && (Settings.GameSort & SORT_FAVORITE) == 0) - SaveFilteredListCache(FilteredList, GameFilter.c_str()); - return FilteredList.size(); } +int GameList::EnabledList() +{ + EnabledGameList.clear(); + + if (Settings.TitlesType == TITLETYPE_FROMWIITDB) + GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); + + GetGameListHeaders(EnabledGameList, Settings.LoaderMode); + + return EnabledGameList.size(); +} + +void GameList::InternalGetGameListHeaders(std::vector &tmplist, std::vector &FullList) +{ + for (u32 i = 0; i < FullList.size(); ++i) + { + struct discHdr *header = &FullList[i]; + tmplist.push_back(header); + } +} + +int GameList::GetGameListHeaders(std::vector &tmplist, short LoaderMode) +{ + // Filter current game list if selected + if (LoaderMode & MODE_WIIGAMES) + { + if (FullGameList.size() == 0) + ReadGameList(true); + InternalGetGameListHeaders(tmplist, FullGameList); + } + + // Filter GC game list if selected + if (LoaderMode & MODE_GCGAMES) + InternalGetGameListHeaders(tmplist, GCGames::Instance()->GetHeaders()); + + // Filter NAND channel list if selected + if (LoaderMode & MODE_NANDCHANNELS) + InternalGetGameListHeaders(tmplist, Channels::Instance()->GetNandHeaders()); + + // Filter EmuNAND channel list if selected + if (LoaderMode & MODE_EMUCHANNELS) + InternalGetGameListHeaders(tmplist, Channels::Instance()->GetEmuHeaders()); + + return tmplist.size(); +} + void GameList::SortList() { if (FilteredList.size() < 2) diff --git a/source/usbloader/GameList.h b/source/usbloader/GameList.h index 293c9a6b..55a12218 100644 --- a/source/usbloader/GameList.h +++ b/source/usbloader/GameList.h @@ -10,11 +10,12 @@ class GameList { public: GameList() : selectedGame(0) { }; - int ReadGameList(); + int ReadGameList(bool use_cache = false); int size() const { return FilteredList.size(); } int GameCount() const { return FullGameList.size(); } int FilterList(const wchar_t * gameFilter = NULL); int LoadUnfiltered(); + int EnabledList(); struct discHdr * at(int i) const { return operator[](i); } struct discHdr * operator[](int i) const { if (i < 0 || i >= (int) FilteredList.size()) return NULL; return FilteredList[i]; } struct discHdr * GetDiscHeader(const char * gameID) const; @@ -35,10 +36,12 @@ class GameList void RemovePartition(int part_num); std::vector &GetFilteredList(void) { return FilteredList; } std::vector &GetFullGameList(void) { return FullGameList; } + int GetGameListHeaders(std::vector &tmplist, short LoaderMode); protected: int InternalReadList(int part); - void InternalFilterList(std::vector &FullList); - void InternalLoadUnfiltered(std::vector &FullList); + void InternalFilterList(std::vector &FullList); + void InternalLoadUnfiltered(std::vector &FullList); + void InternalGetGameListHeaders(std::vector &tmplist, std::vector &FullList); static bool NameSortCallback(const struct discHdr *a, const struct discHdr *b); static bool PlaycountSortCallback(const struct discHdr *a, const struct discHdr *b); static bool RankingSortCallback(const struct discHdr *a, const struct discHdr *b); @@ -47,6 +50,7 @@ class GameList wString GameFilter; int selectedGame; std::vector FilteredList; + std::vector EnabledGameList; std::vector FullGameList; std::vector GamePartitionList; }; diff --git a/source/usbloader/MountGamePartition.cpp b/source/usbloader/MountGamePartition.cpp index e9523f9c..f42db9b5 100644 --- a/source/usbloader/MountGamePartition.cpp +++ b/source/usbloader/MountGamePartition.cpp @@ -12,6 +12,7 @@ #include "settings/GameTitles.h" #include "xml/GameTDB.hpp" #include "utils/ShowError.h" +#include "cache/cache.hpp" static int FindGamePartition() { @@ -25,6 +26,7 @@ static int FindGamePartition() if (WBFS_OpenPart(i) == 0) { + GameTitles.SortTitleList(); Settings.partition = i; return 0; } @@ -54,6 +56,7 @@ static int FindGamePartition() if (count > 0) { + GameTitles.SortTitleList(); Settings.partition = i; return 0; } @@ -66,6 +69,7 @@ static int FindGamePartition() if(firstValidPartition >= 0) { + GameTitles.SortTitleList(); Settings.partition = firstValidPartition; return 0; } @@ -167,13 +171,10 @@ int MountGamePartition(bool ShowGUI) Sys_LoadMenu(); } - gprintf("LoadTitlesFromGameTDB\n"); - //! gameList is loaded in GameTitles.LoadTitlesFromGameTDB after cache file load - //! for speed up purpose. If titles override active, load game list here. - if(Settings.titlesOverride) - GameTitles.LoadTitlesFromGameTDB(Settings.titlestxt_path); - else - gameList.LoadUnfiltered(); + if(ShowGUI && Settings.CacheCheck && !isCacheCurrent()) + ResetGameHeaderCache(); + + gameList.LoadUnfiltered(); return ret; } diff --git a/source/usbloader/wbfs/wbfs_fat.cpp b/source/usbloader/wbfs/wbfs_fat.cpp index 3cf45e75..c89641d2 100644 --- a/source/usbloader/wbfs/wbfs_fat.cpp +++ b/source/usbloader/wbfs/wbfs_fat.cpp @@ -31,7 +31,7 @@ #include "gecko.h" #define MAX_FAT_PATH 1024 -#define TITLE_LEN 64 +#define TITLE_LEN 130 using namespace std; @@ -367,19 +367,24 @@ bool Wbfs_Fat::CheckLayoutB(char *fname, int len, u8* id, char *fname_title) void Wbfs_Fat::AddHeader(struct discHdr *discHeader) { //! First allocate before reallocating - if(!fat_hdr_list) - fat_hdr_list = (struct discHdr *) malloc(sizeof(struct discHdr)); + if (!fat_hdr_list) + fat_hdr_list = (struct discHdr *)malloc(sizeof(struct discHdr)); - struct discHdr *tmpList = (struct discHdr *) realloc(fat_hdr_list, (fat_hdr_count+1) * sizeof(struct discHdr)); - if(!tmpList) - return; //out of memory, keep the list until now and stop + struct discHdr *tmpList = (struct discHdr *)realloc(fat_hdr_list, (fat_hdr_count + 1) * sizeof(struct discHdr)); + if (!tmpList) + return; // out of memory, keep the list until now and stop - for(int j = 0; j < 6; ++j) - discHeader->id[j] = toupper((int) discHeader->id[j]); + for (int j = 0; j < 6; ++j) + discHeader->id[j] = toupper((int)discHeader->id[j]); + + std::string title(discHeader->title); + title.erase(0, title.find_first_not_of(' ')); + snprintf(discHeader->title, sizeof(discHeader->title), "%s", title.c_str()); fat_hdr_list = tmpList; memcpy(&fat_hdr_list[fat_hdr_count], discHeader, sizeof(struct discHdr)); - GameTitles.SetGameTitle(discHeader->id, discHeader->title); + if ((Settings.TitlesType == TITLETYPE_FORCED_DISC && GameTitles.GetTitleType((const char *)discHeader->id) != TITLETYPE_MANUAL_OVERRIDE)) + GameTitles.SetGameTitle((const char *)discHeader->id, discHeader->title, TITLETYPE_FORCED_DISC); fat_hdr_count++; } @@ -395,7 +400,6 @@ s32 Wbfs_Fat::GetHeadersCount() int len; u8 id[8]; memset(id, 0, sizeof(id)); - const char *title; DIR *dir_iter; struct dirent *dirent; @@ -491,17 +495,18 @@ s32 Wbfs_Fat::GetHeadersCount() snprintf(fpath, sizeof(fpath), "%s/%s/%.6s.wbfs", path, dirent->d_name, (char *) id); } - // if we have titles.txt entry use that - title = GameTitles.GetTitle(id); - // if no titles.txt get title from dir or file name - if (strlen(title) == 0 && !Settings.ForceDiscTitles && strlen(fname_title) > 0) - title = fname_title; + std::string title = ""; + if (Settings.TitlesType == TITLETYPE_FORCED_DISC && GameTitles.GetTitleType((const char *)id) == TITLETYPE_FORCED_DISC) + title.assign(GameTitles.GetTitle((const char *)id)); - if (strlen(title) > 0) + if (title.length() == 0 && Settings.TitlesType != TITLETYPE_FORCED_DISC && strlen(fname_title) > 0) + title.assign(fname_title); + + if (*id != 0 && title.length() > 0 && title.length() < 64) { memset(&tmpHdr, 0, sizeof(tmpHdr)); memcpy(tmpHdr.id, id, sizeof(tmpHdr.id)); - snprintf(tmpHdr.title, sizeof(tmpHdr.title), "%s", title); + snprintf(tmpHdr.title, sizeof(tmpHdr.title), "%s", title.c_str()); tmpHdr.magic = 0x5D1C9EA3; AddHeader(&tmpHdr); continue;