Skip to content

Commit 8663ce5

Browse files
fix: better matching logic for arcade games
1 parent 952a06e commit 8663ce5

File tree

12 files changed

+438
-209
lines changed

12 files changed

+438
-209
lines changed

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"@hono/zod-validator": "0.4.3",
3434
"@radix-ui/themes": "3.2.1",
3535
"@react-hookz/web": "25.1.0",
36-
"@supabase/ssr": "0.5.2",
36+
"@supabase/ssr": "0.6.1",
3737
"@supabase/supabase-js": "2.49.1",
3838
"@tailwindcss/typography": "0.5.16",
3939
"browser-fs-access": "0.35.0",
@@ -81,13 +81,13 @@
8181
"libretrodb": "1.0.0",
8282
"lint-staged": "15.5.0",
8383
"miniflare": "4.20250310.0",
84-
"nanoid": "5.1.3",
84+
"nanoid": "5.1.4",
8585
"react-server-dom-webpack": "19.0.0",
8686
"sax": "1.4.1",
8787
"simple-git-hooks": "2.11.1",
8888
"tailwindcss": "4.0.14",
8989
"typescript": "5.8.2",
90-
"vite-plugin-cjs-interop": "2.1.6",
90+
"vite-plugin-cjs-interop": "2.2.0",
9191
"vite-tsconfig-paths": "5.1.4",
9292
"wrangler": "4.0.0",
9393
"zx": "8.4.1"

pnpm-lock.yaml

+380-150
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/constants/core.ts

+23
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { cdnHost } from '@/utils/cdn.ts'
2+
13
export type CoreName =
24
| 'a5200'
35
| 'fbalpha2012_cps1'
@@ -300,3 +302,24 @@ export const coreOptionsMap: Partial<Record<CoreName, { defaultOption?: string;
300302
],
301303
vba_next: [{ name: 'vbanext_bios', options: ['On', 'Off'] }],
302304
}
305+
306+
const vendorsVersionInfo = {
307+
name: 'retro-assembly-vendors',
308+
version: '1.17.0-20240225183742',
309+
}
310+
311+
function getCoreCDNUrl(core: string, ext: string) {
312+
const { name, version } = vendorsVersionInfo
313+
const url = new URL('', cdnHost)
314+
const urlPathSegments = ['npm', `${name}@${version}`, 'dist', 'cores', `${core}_libretro.${ext}`]
315+
const urlPath = urlPathSegments.join('/')
316+
url.pathname = urlPath
317+
return url.href
318+
}
319+
320+
export const coreUrlMap: Partial<Record<CoreName, { js: string; name: string; wasm: string }>> = {
321+
a5200: { js: getCoreCDNUrl('a5200', 'js'), name: 'a5200', wasm: getCoreCDNUrl('a5200', 'wasm') },
322+
fbneo: { js: getCoreCDNUrl('fbneo', 'js'), name: 'fbneo', wasm: getCoreCDNUrl('fbneo', 'wasm') },
323+
prosystem: { js: getCoreCDNUrl('prosystem', 'js'), name: 'prosystem', wasm: getCoreCDNUrl('prosystem', 'wasm') },
324+
stella2014: { js: getCoreCDNUrl('stella2014', 'js'), name: 'stella2014', wasm: getCoreCDNUrl('stella2014', 'wasm') },
325+
}

src/controllers/create-rom.ts

-41
This file was deleted.

src/controllers/create-roms.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ async function createRom(params: CreateRomParams) {
2020
eq(romTable.user_id, currentUser.id),
2121
eq(romTable.file_name, params.fileName),
2222
eq(romTable.platform, params.platform),
23+
eq(romTable.status, 1),
2324
)
2425
const [countResult] = await library.select({ count: count() }).from(romTable).where(where)
2526

src/controllers/guess-game-info.ts

+3
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ export async function guessGameInfo(fileName: string, platform: string) {
9696
if (launchbox && !libretro) {
9797
libretro = await guessLibretroGame(launchbox.name, platform)
9898
}
99+
if (libretro && !launchbox && libretro.name) {
100+
launchbox = await guessLaunchboxGame(libretro.goodcodes_base_compact_name, platform)
101+
}
99102

100103
return { launchbox, libretro }
101104
}

src/pages/library/components/game-title.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ export function GameTitle({ rom }) {
1212
.filter((text) => text !== 'stable')
1313
.join(' ')
1414

15+
if (rom.platform === 'arcade') {
16+
return <div className='mt-2 text-center text-sm font-semibold'>{goodcodes.file.slice(4)}</div>
17+
}
18+
1519
return (
1620
<div className='mt-2 text-center text-sm font-semibold'>
1721
{[...districts].map((district) => (

src/pages/library/platform/rom/components/game-info.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ export function GameInfo({ gameInfo, rom }) {
1818
Released
1919
</div>
2020
<div className='pl-6'>
21-
{gameInfo?.release_date?.toLocaleDateString() || <span className='opacity-40'>Unknown</span>}
21+
{gameInfo?.release_date?.toLocaleDateString() || gameInfo?.release_year || (
22+
<span className='opacity-40'>Unknown</span>
23+
)}
2224
</div>
2325
</div>
2426

src/pages/library/platform/rom/hooks/use-emulator.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useAtom } from 'jotai'
22
import ky from 'ky'
33
import { Nostalgist } from 'nostalgist'
44
import useSWRImmutable from 'swr/immutable'
5+
import { coreUrlMap } from '@/constants/core.ts'
56
import { usePreference } from '../../../hooks/use-preference.ts'
67
import { emulatorLaunchedAtom } from '../atoms.ts'
78
import { useRom } from './use-rom.ts'
@@ -17,14 +18,15 @@ export function useEmulator() {
1718
const { core, shader } = preference.emulator.platform[rom?.platform] || {}
1819
const {
1920
data: emulator,
21+
error,
2022
isLoading: isPreparing,
2123
mutate: prepare,
2224
} = useSWRImmutable(romUrl || false, (romUrl: string) => {
2325
return Nostalgist.prepare({
2426
cache: true,
25-
core,
27+
core: coreUrlMap[core] || core,
2628
retroarchCoreConfig: preference.emulator.core[core],
27-
rom: romUrl,
29+
rom: { fileContent: romUrl, fileName: rom.file_name },
2830
shader,
2931
style: {
3032
opacity: '0',
@@ -50,5 +52,9 @@ export function useEmulator() {
5052
prepare()
5153
}
5254

55+
if (error) {
56+
console.error(error)
57+
}
58+
5359
return { core, emulator, exit, isPreparing, launch, launched, prepare, rom, setLaunched }
5460
}

src/pages/library/platform/rom/page.tsx

+1-7
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { getRom } from '@/controllers/get-rom.ts'
22
import { Portal, Theme } from '@/pages/components/radix-themes.ts'
33
import { getRomGoodcodes } from '@/utils/rom.ts'
44
import AppLayout from '../../components/app-layout.tsx'
5-
import { SidebarLinks } from '../../components/sidebar-links.tsx'
65
import { GameBackground } from './components/game-background.tsx'
76
import { GameCover } from './components/game-cover.tsx'
87
import { GameInfo } from './components/game-info.tsx'
@@ -21,12 +20,7 @@ export async function RomPage({ fileName, id, platform }) {
2120
const { launchboxGame } = rom
2221

2322
return (
24-
<AppLayout
25-
append={<GameBackground rom={rom} />}
26-
MainScrollArea={MainScrollArea}
27-
serverData={{ rom }}
28-
sidebar={<SidebarLinks platform={rom.platform} />}
29-
>
23+
<AppLayout append={<GameBackground rom={rom} />} MainScrollArea={MainScrollArea} serverData={{ rom }}>
3024
<title>{`${goodcodes.rom} - RetroAssembly`}</title>
3125
<div className='flex gap-4'>
3226
<div>

src/utils/cdn.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@ const repositoryVersions = {
3030
'RetroPie/es-theme-carbon': 'b09973e',
3131
} as const
3232

33+
export const cdnHost = 'https://cdn.jsdelivr.net'
34+
3335
export function getCDNUrl(repo: keyof typeof repositoryVersions, filePpath: string) {
3436
const [ghUser, ghRepoName] = repo.split('/')
3537
const version = repositoryVersions[repo]
36-
const url = new URL('', 'https://cdn.jsdelivr.net')
38+
const url = new URL('', cdnHost)
3739
const encode = encodeRFC3986URIComponent
38-
const urlPathSecments = ['gh', encode(ghUser), `${encode(ghRepoName)}@${encode(version)}`, filePpath]
39-
const urlPath = urlPathSecments.join('/')
40+
const urlPathSegments = ['gh', encode(ghUser), `${encode(ghRepoName)}@${encode(version)}`, filePpath]
41+
const urlPath = urlPathSegments.join('/')
4042
url.pathname = urlPath
4143
return url.href
4244
}

src/utils/rom.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,17 @@ export function getPlatformGameIcon(platform: string, type = 'game') {
4747
// todo: move to constants
4848
const repo = 'batocera-linux/batocera-themes'
4949
const platformAlias =
50-
{ atarilynx: 'lynx', 'sg-1000': 'sg1000', sms: 'mastersystem', vb: 'virtualboy' }[platform] || platform
50+
{ arcade: 'fba', atarilynx: 'lynx', 'sg-1000': 'sg1000', sms: 'mastersystem', vb: 'virtualboy' }[platform] ||
51+
platform
5152
return getCDNUrl(repo, `themes/batocera/${platformAlias}/_data/svg/${type}.svg`)
5253
}
5354

5455
export function getRomGoodcodes(rom) {
55-
return parse(`0 - ${path.parse(rom.file_name).name}`)
56+
let { name } = path.parse(rom.file_name)
57+
if (rom.platform === 'arcade' && rom.libretroGame?.name) {
58+
name = rom.libretroGame.name
59+
}
60+
return parse(`0 - ${name}`)
5661
}
5762

5863
export function getCompactName(name: string) {

0 commit comments

Comments
 (0)