From d13e7ac29479c1740ae9fb24e5b8ecf42fb29a8c Mon Sep 17 00:00:00 2001 From: Alexey Nurgaliev Date: Fri, 1 Sep 2023 00:59:49 +0300 Subject: [PATCH] update ROM file search order --- data/emulator.js | 103 ++++++++++++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 42 deletions(-) diff --git a/data/emulator.js b/data/emulator.js index 709bd1b..f176586 100644 --- a/data/emulator.js +++ b/data/emulator.js @@ -857,27 +857,37 @@ class EmulatorJS { }) } downloadRom() { - return new Promise((resolve, reject) => { - + const extractFileNameFromUrl = url => { + if (!url) return null; + return url.split('/').pop().split("#")[0].split("?")[0]; + }; + const supportsExt = (ext) => { + const core = this.getCore(); + if (!this.extensions[core]) return false; + return this.extensions[core].includes(ext); + }; + + return new Promise(resolve => { this.textElem.innerText = this.localization("Download Game Data"); + const gotGameData = (data) => { if (['arcade', 'mame2003'].includes(this.getCore(true))) { - this.fileName = this.config.gameUrl.split('/').pop().split("#")[0].split("?")[0]; + this.fileName = extractFileNameFromUrl(this.config.gameUrl); FS.writeFile(this.fileName, new Uint8Array(data)); resolve(); return; } - - let resData = {}; - const needsCue = (["mednafen_psx", "mednafen_psx_hw", "mednafen_pce"].includes(this.getCore())) && !this.config.disableCue; - const altName = this.config.gameUrl.startsWith("blob:") ? (this.config.gameName || "game") : this.config.gameUrl.split('/').pop().split("#")[0].split("?")[0]; + + const altName = this.config.gameUrl.startsWith("blob:") ? (this.config.gameName || "game") : extractFileNameFromUrl(this.config.gameUrl); + + let fileNames = []; this.checkCompression(new Uint8Array(data), this.localization("Decompress Game Data"), (fileName, fileData) => { if (fileName.includes("/")) { const paths = fileName.split("/"); let cp = ""; for (let i=0; i { - const fileNames = (() => { - let rv = []; - for (const k in resData) rv.push(k); - return rv; - })(); - if (fileNames.length === 1) fileNames[0] = altName; - let execFile = null; - if (needsCue) { - execFile = this.gameManager.createCueFile(fileNames); - } - - for (const k in resData) { - if (k === "!!notCompressedData") { - if (needsCue && execFile !== null) { - this.fileName = execFile; + let isoFile = null; + let supportedFile = null; + let cueFile = null; + let selectedCueExt = null; + fileNames.forEach(fileName => { + const ext = fileName.split('.').pop().toLowerCase(); + if (supportsExt(ext)) { + supportedFile = fileName; + } + if (['iso', 'cso', 'chd', 'elf'].includes(ext)) { + isoFile = fileName; + } + if (['cue', 'ccd', 'toc', 'm3u'].includes(ext)) { + if (this.getCore(true) === 'psx') { + //always prefer m3u files for psx cores + if (selectedCueExt !== 'm3u') { + if (ext === 'm3u' || cueFile === null) { + cueFile = fileName; + selectedCueExt = ext; + } + } } else { - this.fileName = altName; + //prefer cue or ccd files over toc or m3u + if (!['cue', 'ccd'].includes(selectedCueExt)) { + if (['cue', 'ccd'].includes(ext) || cueFile === null) { + cueFile = fileName; + selectedCueExt = ext; + } + } } - break; } - if (!this.fileName || ((this.extensions[this.getCore()] || []).includes(k.split(".").pop()) && - //always prefer m3u files for psx cores - !(this.getCore(true) === "psx" && ["m3u", "ccd"].includes(this.fileName.split(".").pop())))) { - this.fileName = k; + }); + if (isoFile !== null && (supportsExt('iso') || supportsExt('cso') || supportsExt('chd') || supportsExt('elf'))) { + this.fileName = isoFile; + } else if (!this.config.disableCue && (supportsExt('cue') || supportsExt('ccd') || supportsExt('toc') || supportsExt('m3u'))) { + if (cueFile !== null) { + this.fileName = cueFile; + } else { + this.fileName = this.gameManager.createCueFile(fileNames); } - if (needsCue && execFile === null && ["m3u", "cue"].includes(k.split(".").pop().toLowerCase())) { - FS.writeFile("/"+k, resData[k]); - } - } - if (needsCue && execFile !== null) { - this.fileName = execFile; + } else if (supportedFile !== null) { + this.fileName = supportedFile; + } else { + this.fileName = fileNames[0]; } resolve(); });