diff --git a/README.md b/README.md index ff5d91c..8d40a34 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,11 @@ a WebAssembly build of the real [Visual Pinball](https://github.com/vpinball/vpi ## Features - **Play any self-contained `.vpx` table** — drag a file onto the landing page, or click to browse. +- **ROM support for real-hardware ("SS") tables** — attach the table's PinMAME ROM `.zip` alongside + the `.vpx` upload; most tables don't need this. +- **A local table library** — uploads are saved in the browser (IndexedDB) so you don't have to + re-upload the same table (and its ROM) on your next visit. Nothing leaves your browser; there's + no server-side storage. - **Demo mode** — a bundled table plays instantly with no upload required. - **Fullscreen**, a live **FPS/stats** readout, and a **game info** panel (table name, size, load time) in an in-game HUD styled after a pinball cabinet's coin door. @@ -88,10 +93,11 @@ pnpm run sw:bump | Key | Action | | -------------- | ------------- | +| 4 | Insert coin | +| 1 | Start game | +| Enter | Launch ball | | Left Shift | Left flipper | | Right Shift | Right flipper | -| Enter | Plunger | -| 1 | Start game | On touch devices, an on-screen control overlay appears automatically once a table is running. @@ -101,12 +107,19 @@ Inherited from the underlying engine: - Only self-contained `.vpx` tables are supported — tables that reference an external `.vbs` script override or a `Music/` folder won't load correctly. -- No PinMAME, DOF, or FlexDMD plugin support. +- PinMAME (`VPinMAME.Controller`) ROM-driven emulation runs, but on-screen DMD/backglass output + and hands-on switch/solenoid/scoring behavior aren't yet confirmed end-to-end — see the engine's + own README for the current state. No DOF, FlexDMD, or backglass (`.directb2s`) plugin support. + ROM files are copyrighted; only supply ones you're legally entitled to use. +- The ROM `gameName` PinMAME needs is derived from the uploaded zip's filename (e.g. + `hvymetal.zip` → `hvymetal`) — rename the zip to match if a table doesn't recognize its ROM. - Single-threaded (no `SharedArrayBuffer`) — performance depends on your device's single-core WebGL2 throughput. - Initial engine download is ~34 MB (cached after the first visit). - Gamepad input and DMD rendering are implemented but not yet confirmed on real hardware/tables. - Raw cabinet hardware input (real nudge/plunger boards) has no browser equivalent. +- The table library lives in the browser's IndexedDB storage — clearing site data removes it, and + it doesn't sync across browsers/devices. ## License diff --git a/app/globals.css b/app/globals.css index 9209844..352d695 100644 --- a/app/globals.css +++ b/app/globals.css @@ -9,7 +9,7 @@ --color-arc: #4ce0d2; /* fluorescent-tube cyan — focus rings, secondary */ --color-paper: #f3efe6; /* aged-backglass cream — high-contrast body text */ - --font-display: var(--font-big-shoulders), "Arial Narrow", sans-serif; + --font-display: var(--font-display-face), "Arial Narrow", sans-serif; --font-body: var(--font-space-grotesk), system-ui, sans-serif; --font-mono: var(--font-plex-mono), "IBM Plex Mono", ui-monospace, monospace; } diff --git a/app/layout.tsx b/app/layout.tsx index cbea4be..6521a7d 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,17 +1,12 @@ import type { Metadata, Viewport } from "next"; -import { Big_Shoulders, Space_Grotesk, IBM_Plex_Mono } from "next/font/google"; +import { Barlow_Condensed, Space_Grotesk, IBM_Plex_Mono } from "next/font/google"; import RegisterServiceWorker from "@/components/RegisterServiceWorker"; import "./globals.css"; -const bigShoulders = Big_Shoulders({ - variable: "--font-big-shoulders", +const displayFont = Barlow_Condensed({ + variable: "--font-display-face", weight: ["700", "900"], subsets: ["latin"], - // Next's fallback-metrics table has no entry for this (newer, merged - // variable-font) family name, so the automatic CLS-reducing fallback - // override it would otherwise generate always fails with a build - // warning — opt out instead of leaving that warning unresolved. - adjustFontFallback: false, }); const spaceGrotesk = Space_Grotesk({ @@ -39,7 +34,7 @@ export default function RootLayout({ children }: LayoutProps<"/">) { return ( {children} diff --git a/app/page.tsx b/app/page.tsx index c924d2d..bb46bcf 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,12 +1,11 @@ import AttractHero from "@/components/landing/AttractHero"; +import TableLibrary from "@/components/landing/TableLibrary"; export default function Home() { return (
-

- Pinball plays best in landscape or fullscreen — rotate your device once a table loads. -

+