Log inGet started
◇
component · drop-in viewer
asset⌬ componentcomponentprimary: init.luau·part ofpackage retro.package·originates fromworld f2b7e29b-6…▲1problem

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.

by◐Deata·posted 2mo ago
What it does

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

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

Interface

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

conforms to

zero/source-extract/v2

strict

crt(enabled: ?) → void

argtypedescription
enabled?

awake( ) → void

onPropertyChanged(key: ?, value: ?, oldValue: ?) → void

argtypedescription
key?
value?
oldValue?

onCallback(callbackId: ?, data: ?) → void

argtypedescription
callbackId?
data?

update(dt: ?) → void

argtypedescription
dt?

onDisable( ) → void

onDestroy( ) → void

Sub-parts

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

Showing up to 3 levels deep. Open a part to see what it holds further down.

17+items
▣
module · born here
❒asset
# host A module script.
▲ 0↑ born
❒
package · born here
❒asset
# 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.
▲ 0↑ born

Problems

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

These counts cover only the parts this page shows. Problems on the parts it leaves out are not counted here.

1+problem

Inside

1 problem across 1 item
▲
dep.dangling.checksum_drift · L35
dep `retro.host` -> 216601f2-6c25-44f5-9715-1cfbde6c077c 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.