Improve caching

Thanks to Oddx. I just tested his changes, fixed some issues and then refactored code.
This commit is contained in:
wiidev 2023-01-01 17:00:14 +00:00
parent 1d582f97c2
commit 8ab03c4bf9
56 changed files with 986 additions and 990 deletions

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Απεγκατάσταση"

View File

@ -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."

View File

@ -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."

View File

@ -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にしてください"

View File

@ -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로 설정해야 합니다."

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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 "Деинсталлировать"

View File

@ -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 "删除"

View File

@ -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"

View File

@ -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"

View File

@ -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 "移除"

View File

@ -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 "ถอนการติดตั้ง"

View File

@ -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"

View File

@ -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<struct discHdr>().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<struct discHdr> &Channels::GetNandHeaders(void)
std::vector<struct discHdr> &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;
}

View File

@ -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<struct discHdr> & GetNandHeaders(void);
std::vector<struct discHdr> & GetEmuHeaders(void);
private:

View File

@ -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);
}

View File

@ -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);

View File

@ -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));
}
}

View File

@ -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<std::string>().swap(PathList);
std::vector<struct discHdr>().swap(HeaderList);
std::vector<struct discHdr>().swap(sdGCList);
std::vector<std::string>().swap(sdGCPathList);
}
void GCGames::LoadGameList(const std::string &path, std::vector<struct discHdr> &headerList, std::vector<std::string> &pathList)
{
struct discHdr tmpHdr;
@ -65,7 +78,7 @@ void GCGames::LoadGameList(const std::string &path, std::vector<struct discHdr>
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<struct discHdr>
}
}
// 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<struct discHdr>
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<struct discHdr>
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();

View File

@ -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<struct discHdr> &headerList, std::vector<std::string> &pathList);
void clear();
bool RemoveGame(const char *gameID);
bool RemoveSDGame(const char *gameID);
@ -48,7 +49,8 @@ public:
std::vector<struct discHdr> & GetHeaders(void)
{
LoadAllGames();
if (HeaderList.empty())
LoadAllGames(true);
return HeaderList;
}

View File

@ -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");

447
source/cache/cache.cpp vendored
View File

@ -1,9 +1,9 @@
/*
Code by Oddx @ GBAtemp.net
Loosely based on emuNAND caching by geoGolem.
Code by Oddx @ GBAtemp.net
*/
#include <fstream>
#include <dirent.h>
#include <zlib.h>
#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<struct discHdr> &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<struct discHdr> &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<struct discHdr> &list, std::vector<int> &plist)
{
std::vector<struct wiiCache> 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(&gtmp, 0, sizeof(struct wiiCache));
gtmp.header = list[i];
gtmp.part = plist[i];
wiictmp.push_back(gtmp);
}
std::vector<struct wiiCache> wiictmp;
struct wiiCache gtmp;
std::string path = std::string(Settings.GameHeaderCachePath) + WII_HEADER_CACHE_FILE;
for (u32 i = 0; i < list.size(); ++i)
{
memset(&gtmp, 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<struct discHdr> &list, std::vector<int> &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<struct discHdr> &list, std::vector<std::string> &plist)
{
std::vector<struct gcCache> 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(&gtmp, 0, sizeof(gcCache));
gtmp.header = list[i];
std::vector<struct gcCache> gcctmp;
struct gcCache gtmp;
strcpy((char *)gtmp.path, plist[i].c_str());
for (u32 i = 0; i < list.size(); ++i)
{
memset(&gtmp, 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<struct discHdr> &list, std::vector<std::string> &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<struct discHdr *> &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<struct gameHdr> 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<struct discHdr *> &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<struct discHdr> &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<struct discHdr> &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<struct discHdr> &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<struct discHdr> &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());
}

View File

@ -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<struct discHdr> &list);
void LoadGameHeaderCache(std::vector<struct discHdr> &list);
@ -42,11 +47,4 @@ void LoadGameHeaderCache(std::vector<struct discHdr> &list, std::vector<int> &pl
void SaveGameHeaderCache(std::vector<struct discHdr> &list, std::vector<std::string> &plist);
void LoadGameHeaderCache(std::vector<struct discHdr> &list, std::vector<std::string> &plist);
void ResetGameHeaderCache();
void SaveFilteredListCache(std::vector<struct discHdr *> &list, const wchar_t *gameFilter);
void LoadFilteredListCache(std::vector<struct discHdr *> &list, const wchar_t *gameFilter);
std::string FilteredListCacheFileName(const wchar_t *gameFilter);
std::string FilteredListCacheFileName();
bool isCacheFile(std::string filename);

View File

@ -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();

View File

@ -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))
{

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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();
}

View File

@ -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);

View File

@ -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;

View File

@ -1,27 +1,43 @@
#include <string.h>
#include <unistd.h>
#include <algorithm>
#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 &gt, 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 &gt, 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<GameTitle>().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<CacheTitle> 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<std::string> &MissingTitles, bool removeUnused)
int CGameTitles::GetMissingTitles(std::vector<std::string> &MissingTitles, std::vector<struct discHdr *> &headerlist)
{
std::vector<struct discHdr *> &FullList = gameList.GetFilteredList();
std::vector<bool> 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<struct discHdr *> &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<std::string> MissingTitles;
GetMissingTitles(MissingTitles, removeUnused);
if(MissingTitles.size() == 0)
std::vector<struct discHdr *> 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<std::string> 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();
}

View File

@ -5,6 +5,7 @@
#include <vector>
#include <gctypes.h>
#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<std::string> &MissingTitles, bool removeUnused);
int GetMissingTitles(std::vector<std::string> &MissingTitles, std::vector<struct discHdr *> &headerlist);
void CleanTitles(std::vector<struct discHdr *> &headerlist);
std::vector<GameTitle> TitleList;
};

View File

@ -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

View File

@ -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));
}

View File

@ -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();

View File

@ -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;
};

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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;
}

View File

@ -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)

View File

@ -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();

View File

@ -55,8 +55,10 @@ void GameList::clear()
FullGameList.clear();
GamePartitionList.clear();
FilteredList.clear();
EnabledGameList.clear();
//! Clear memory of the vector completely
std::vector<struct discHdr *>().swap(FilteredList);
std::vector<struct discHdr *>().swap(EnabledGameList);
std::vector<struct discHdr>().swap(FullGameList);
std::vector<int>().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<struct discHdr> &FullList)
void GameList::InternalFilterList(std::vector<struct discHdr *> &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<struct discHdr> &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<struct discHdr> &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<struct discHdr> &FullList)
void GameList::InternalLoadUnfiltered(std::vector<struct discHdr *> &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<struct discHdr> &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<struct discHdr *> &tmplist, std::vector<struct discHdr> &FullList)
{
for (u32 i = 0; i < FullList.size(); ++i)
{
struct discHdr *header = &FullList[i];
tmplist.push_back(header);
}
}
int GameList::GetGameListHeaders(std::vector<struct discHdr *> &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)

View File

@ -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<struct discHdr *> &GetFilteredList(void) { return FilteredList; }
std::vector<struct discHdr> &GetFullGameList(void) { return FullGameList; }
int GetGameListHeaders(std::vector<struct discHdr *> &tmplist, short LoaderMode);
protected:
int InternalReadList(int part);
void InternalFilterList(std::vector<struct discHdr> &FullList);
void InternalLoadUnfiltered(std::vector<struct discHdr> &FullList);
void InternalFilterList(std::vector<struct discHdr *> &FullList);
void InternalLoadUnfiltered(std::vector<struct discHdr *> &FullList);
void InternalGetGameListHeaders(std::vector<struct discHdr *> &tmplist, std::vector<struct discHdr> &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<struct discHdr *> FilteredList;
std::vector<struct discHdr *> EnabledGameList;
std::vector<struct discHdr> FullGameList;
std::vector<int> GamePartitionList;
};

View File

@ -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;
}

View File

@ -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;