**The app is called WarpEngine Client.** "Store" named the thing it opens rather than the
thing you run, and the store is a catalog on a site, not a window on your machine. The
window title, the bundle, the packages and the menu entry follow; the repository already
did. The store being driven is named in the side menu, so the bar stopped repeating it as
a badge — the element stays in the page, hidden, because the window check reads it.
**Every title is listed, including the ones this machine cannot install.** They arrive
from the engine with `installable: false` and a reason, and they are drawn dimmed, with an
*unsupported platform* or *no build for this machine* badge, the engine's own sentence
underneath, and nothing to press: a disabled Install would invite a click that can never
work. They get a category of their own — *Not for this machine* — and they are kept out of
the native/hosted categories and counts, because a title with no build has no mode to be
counted under. An engine older than desktop 1.2.0 is unaffected: a missing `installable`
field reads as installable, which is what those engines mean.
**A build can be pointed at another site's registry:**
make dist STORES_API=https://games.example.org/api/stores
BuildConfiguration reads the packaged package.json, where electron-builder's
extraMetadata writes that address, so a client for somebody else's catalog needs no source
change and nothing set on the user's machine. Precedence is runtime environment, then
build, then ours — three audiences, most specific first.
Also: the scrollbars are the window's own, because the platform's light track down the
side menu of a dark window looked like a mistake.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
/** How a title runs: unpacked on this machine, or served as a web build. */
|
|
export type GameModeDto = 'app' | 'web'
|
|
|
|
/** Why a title cannot be installed on this machine. */
|
|
export type UnavailableReasonDto = 'platformOff' | 'hostAsset' | 'noAsset' | 'vetoed'
|
|
|
|
/**
|
|
* A catalog entry as the window needs it.
|
|
*
|
|
* Deliberately free of filesystem paths: what to launch is resolved in the main
|
|
* process from the store's own state, so the window never learns where anything
|
|
* lives and cannot be talked into opening it.
|
|
*/
|
|
export interface GameDto {
|
|
readonly name: string
|
|
readonly title: string
|
|
readonly platform: string
|
|
readonly version: string
|
|
readonly mode: GameModeDto
|
|
readonly kind: string
|
|
readonly description: string
|
|
readonly author: string
|
|
/** Absolute, already resolved against the catalog's base URL. */
|
|
readonly imageUrl: string | null
|
|
readonly installed: boolean
|
|
readonly updateAvailable: boolean
|
|
readonly installedVersion: string | null
|
|
readonly launchable: boolean
|
|
/** False for a title this machine cannot install; it is listed all the same. */
|
|
readonly installable: boolean
|
|
readonly unavailableReason: UnavailableReasonDto | null
|
|
readonly unavailableDetail: string | null
|
|
}
|