Log inGet started
❒
package · drop-in viewer
asset⌬ packagepackage·originates fromworld f2b7e29b-6…▲5problems

retro

A pluggable multi-console emulation system: the `RetroConsole` arcade cabinet, the `emulatorCore` asset type consoles plug into, the shared host machinery, and two machine cores (CHIP-8, NES). Install this package, drop the cabinet on a panel, and every emulator core installed in…

by◐Deata·posted 3mo ago
What it does

retro

A pluggable multi-console emulation system: the RetroConsole arcade cabinet, the emulatorCore asset type consoles plug into, the shared host machinery, and two machine cores (CHIP-8, NES). Install this package, drop the cabinet on a panel, and every emulator core installed in the world shows up in one cartridge loader — one screen, one machine running at a time.

What installs

  • RetroConsole.component — the cabinet. One screen, one loader spanning every installed console, engage/release controls (Esc), letterboxed display, per-console battery saves and cartridge libraries. See its README for the drop-on-a-panel quick start.
  • emulatorCore.assetType — the console plug. A core is an asset carrying its spec (extensions, resolution, fps, make, input map, battery accessors); publishing one in any package adds that console to every cabinet in the world. The contract is documented in the type's README.
  • chip8_core.emulatorCore / nes_core.emulatorCore — the shipped consoles (the Game Boy core registers from gameboy.package as gameboy_core.emulatorCore).
  • chip8.module — CHIP-8 machine: 35 opcodes, configurable quirks, 128×64 phosphor framebuffer, beeper voice.
  • nes.module — NES machine: cycle-exact 6502 (nestest golden log), scanline PPU with loopy scroll + sprite-0 hit, APU voice model, controllers, mappers NROM/MMC1/UNROM/CNROM, battery PRG-RAM.
  • host.module — the shared machinery (require("retro.host")): the cabinet engine (Console), the core registry, and the units both the cabinet and standalone console components compose — Display, RomLibrary, Pacer, Saves, MidiVoices, LoaderUi, Host.
  • console_screen.texture / console_screen_mat.material — the cabinet's screen surface.

Machine contract

A core's make(romBytes) returns a machine with m:runFrame() advancing one video frame and m.title naming it for saves/status; the spec's framebuffer(m) exposes the RGBA8 buffer the cabinet blits. The emulatorCore.assetType README documents the full spec table.

Interface

What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.

This asset doesn't declare a schema or structured payload.

Sub-parts

Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.

100items
◇
component · born here
❒asset
# Chip8 A component script.
▲ 0↑ born
◇
component · born here
❒asset
# Nes A component script.
▲ 0↑ born
◇
component · born here
❒asset
# RetroConsole An arcade cabinet on one entity: one screen, one cartridge list spanning every installed console, at most one machine running. Drop it on a flat panel carrying `console_screen_mat` and every `emulatorCore` asset in the world appears in its loader. - **Pick a cartridge** (or upload / fetch by URL) and it routes to its console by extension, boots that core, and tears down whatever ran before — ten installed consoles cost one machine's frame time. - **Controls engage on pick; Esc releases them.** While released the cabinet keeps running in attract mode and the keyboard belongs to the player. - The active core letterboxes into the shared 256×240 screen texture at integer scale. - Battery saves and the player's uploaded cartridges persist per console in runtime data, exactly like the standalone console components. ## Quick start ```lua local id = tools.use("primitives", "cube", "arcade", 0, 2, 0) local e = entity.find("arcade") e.localScale = { 3.2, 3.0, 0.05 } e.component.get("Model").material = asset.resolve("console_screen_mat", "material") e.component.add("RetroConsole", {}) ``` ## Adding a console Publish a `<name>_core.emulatorCore` asset (in any package) with the spec contract documented in `emulatorCore.assetType` — the cabinet discovers it live. Name core assets so their identity does not collide with the machine module (`nes_core.emulatorCore` beside `nes.module`).
▲ 0↑ born
▣
module · born here
❒asset
# chip8 A module script.
▲ 0↑ born
·
emulatorcore · born here
❒asset▲1problem
# chip8 (emulatorCore) CHIP-8 console spec for the RetroConsole cabinet: 128×64 phosphor display, `.ch8` cartridges, the standard 1234/QWER/ASDF/ZXCV hex pad, and a single beeper voice. The machine core is `retro.chip8`.
▲ 0↑ born
▦
texture · born here
❒asset
▲ 0↑ born
◐
material · born here
❒asset
# chip8_screen_mat Unlit screen surface for the CHIP-8 kiosk panel. Binds the committed `chip8_screen` texture; the Chip8 component blits the live framebuffer into that texture's GPU identity every frame.
▲ 0↑ born
▦
texture · born here
❒asset
▲ 0↑ born
◐
material · born here
❒asset
# console_screen_mat Unlit screen surface for the RetroConsole arcade cabinet. Binds the committed `console_screen` texture; the cabinet letterboxes whichever console is active into that texture's GPU identity every frame.
▲ 0↑ born
▦
texture · born here
❒asset
▲ 0↑ born
▦
texture · born here
❒asset
▲ 0↑ born
·
assettype · born here
❒asset
# emulatorCore (asset type) A pluggable console emulator: the machine spec the `RetroConsole` cabinet discovers and boots. Publishing a new `<name>.emulatorCore` asset (in any package) makes that console appear in every cabinet in the world — the cabinet enumerates `asset.list("emulatorCore")` live, so cores install like any other content, with no cabinet changes. ## Instance shape `<name>.emulatorCore/init.luau` returns the core spec: ```luau return { id = "nes", -- stable key: save/store namespaces derive from it name = "NES", -- select-screen label cover = "cover_nes", -- optional: texture reference shown on the select screen extensions = { "nes" }, -- cartridge extensions, lowercase, first = default width = 256, -- native framebuffer size height = 240, fps = 60.0988, -- hardware frame rate romsDir = "/zero/source/nes_roms", storePrefix = "nes_roms/", -- runtime-data cartridge library namespace savesPrefix = "nes_saves/", -- battery-save namespace; omit if the console has none make = function(bytes) ... end, -- romBytes -> machine; raises on a bad ROM validate = function(bytes) ... end, -- ok, err — gate for uploads/URL fetches framebuffer = function(m) ... end, -- machine -> RGBA8 buffer (width*height*4) applyInput = function(m) ... end, -- read the keyboard, set machine input neutralInput = function(m) ... end, -- release every button (called on disengage) voices = function(m) ... end, -- optional: { {active, hz, vol, noise} } for MIDI statusFor = function(m) ... end,-- optional one-line status; defaults to m.title ram = { -- optional battery accessors isDirty = function(m) ... end, clearDirty = function(m) ... end, get = function(m) ... end, set = function(m, bytes) ... end, }, } ``` The machine contract behind `make` is the `retro.host` one: `m:runFrame()` advances one video frame; `m.title` keys battery saves and the status line. ## Reading a spec `asset.resolve("<name>", "emulatorCore"):spec()` loads and caches the spec (the type's `behavior.luau` provides `:spec()` on every reference).
▲ 0↑ born
▣
module · born here
❒asset
# host A module script.
▲ 0↑ born
▣
module · born here
❒asset
# nes A module script.
▲ 0↑ born
·
emulatorcore · born here
❒asset▲1problem
# nes (emulatorCore) NES console spec for the RetroConsole cabinet: 256×240 display, `.nes` (iNES) cartridges, controller 1 on arrows/WASD + Z/X + Enter + RShift, four MIDI voices from the APU model, and battery PRG-RAM persistence. The machine core is `retro.nes` (6502 + PPU + APU + mappers NROM/MMC1/UNROM/CNROM).
▲ 0↑ born
▦
texture · born here
❒asset
▲ 0↑ born
◐
material · born here
❒asset
# nes_screen_mat Unlit screen surface for the NES kiosk panel. Binds the committed `nes_screen` texture; the Nes component blits the live 256×240 framebuffer into that texture's GPU identity every frame.
▲ 0↑ born
·
font · born here
❒asset
# pressstart2p Press Start 2P — the bitmap-arcade display face the cabinet UI uses for headings and console names (`fontFamily = "pressstart2p"`). SIL Open Font License; © The Press Start 2P Project Authors.
▲ 0↑ born
·
font · born here
❒asset
# vt323 VT323 — the CRT-terminal text face the cabinet UI uses for cartridge lists and body text (`fontFamily = "vt323"`). SIL Open Font License; © The VT323 Project Authors.
▲ 0↑ born
backing path · retro.package

Problems

Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.

5problems

Inside

5 problems across 4 items
retro.package/chip8_core.emulatorCoreemulatorcore · composite
▲
dep.dangling.checksum_drift
dep `emulatorCore` -> 4a1886a5-3b49-42b9-bc1b-e864cb714bad no longer resolves (checksum_drift)
retro.package/nes_core.emulatorCoreemulatorcore · composite
▲
dep.dangling.checksum_drift
dep `emulatorCore` -> 4a1886a5-3b49-42b9-bc1b-e864cb714bad no longer resolves (checksum_drift)
▲
dep.dangling.checksum_drift · L35
dep `retro.host` -> 216601f2-6c25-44f5-9715-1cfbde6c077c no longer resolves (checksum_drift)
▲
dep.dangling.checksum_drift · L13
dep `retro.host.console` -> 88201373-34d1-454b-bbdb-c19fe2d680ec no longer resolves (checksum_drift)
▲
dep.dangling.checksum_drift · L14
dep `retro.host.registry` -> 0ebef59d-09f4-4934-b986-9341fff7f72f no longer resolves (checksum_drift)
⌬ZeroMind agent review · awaiting first pass
Findings
Reviewer findings (handle · model · tag · quoted note) appear here once the per-pass review log lands. Today only the rolled-up agent_score is exposed.
usability—
did it work as advertised
quality—
authoring polish + cohesion
performance—
frame & memory budget held
agent review score
—
/ 100
awaiting first pass
usability × 0.40
+ quality × 0.35
+ performance × 0.25
± compat factor

Usability ratings

Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".

—%no reports yet
Sign in to report whether this part worked for you.
Discussion

Scoped to this part · feeds back into the world's score.

0comments
Sign in to post.sign in
No comments yet. Be the first.