@wasm-gaming/rsdkv3-wasm 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,30 @@
1
- import type { EngineConfig, EngineInstance, AssetData } from '@wasm-gaming/engine-specs';
2
- import { manifest } from './rsdkv3.manifest.js';
3
- export { manifest };
4
- /** RSDKv3-specific bridge for the launcher's debug/stage-select UI. */
1
+ /**
2
+ * The engine package's entry point: an `EngineSDK` for RSDKv3 (Sonic CD).
3
+ *
4
+ * ```js
5
+ * import Rsdkv3SDK from '@wasm-gaming/rsdkv3-wasm';
6
+ *
7
+ * const play = await new Rsdkv3SDK({ config: { soundtrack: 1 } })
8
+ * .assets({ data: () => readDataRsdk() }) // bytes, or a thunk
9
+ * .storage({ namespace: 'sonic-cd' }) // → OPFS rsdkv3/sonic-cd/
10
+ * .mount(document.querySelector('#stage'))
11
+ * .start();
12
+ *
13
+ * play.pause('menu'); play.resume('menu');
14
+ * play.devMenu.getStageList(); // the host draws its own stage select
15
+ * await play.destroy(); // save flushed, loop stopped, audio closed
16
+ * ```
17
+ *
18
+ * One game-agnostic `rsdkv3.wasm`: `Data.rsdk` is written into the filesystem at
19
+ * runtime, never baked in. The working dir `/data/rsdkv3/<namespace>` is in memory;
20
+ * the SDK seeds `SData.bin` from OPFS `rsdkv3/<namespace>/` before boot and mirrors it
21
+ * back when it changes (every 10 s, on pause, on page hide and on destroy).
22
+ */
23
+ import { EnginePlayBase, EngineSDKBase, EventEmitter, type EngineInit, type EngineSDKConstructor, type EventsOf, type PayloadKind } from '@wasm-gaming/engine-specs';
24
+ import { type Rsdkv3Config, type Rsdkv3Options, type Rsdkv3Payloads } from './rsdkv3.options.js';
25
+ export type { Rsdkv3Asset, Rsdkv3Assets, Rsdkv3Config, Rsdkv3Events, Rsdkv3Options, Rsdkv3Payloads, Rsdkv3Storage, } from './rsdkv3.options.js';
26
+ export { RSDKV3_SPEC, RSDKV3_VIDEO } from './rsdkv3.options.js';
27
+ /** The launcher's handle on RSDKv3's stage list, for drawing its own dev menu. */
5
28
  export interface RsdkDevMenuBridge {
6
29
  getStageList(): Array<{
7
30
  name: string;
@@ -9,37 +32,55 @@ export interface RsdkDevMenuBridge {
9
32
  name: string;
10
33
  }>;
11
34
  }>;
12
- loadStage(categoryIdx: number, stageIdx: number): void;
13
- setPaused(paused: boolean): void;
35
+ loadStage(category: number, stage: number): void;
14
36
  }
15
- export type Rsdkv3Instance = EngineInstance & {
16
- devMenu: RsdkDevMenuBridge;
17
- /** Always false in the current rsdkv3 build (in-memory FS backend). */
18
- persistent: boolean;
19
- /** Relative storage namespace used under /data (e.g. "sonic-cd"). */
20
- storageNamespace: string;
21
- /** Remove files for this namespace only. */
22
- purgeStorage(): {
23
- data: boolean;
24
- settings: boolean;
25
- };
26
- };
27
37
  /**
28
- * Extra (engine-specific) config on top of the contract's EngineConfig: lazy asset
29
- * providers, invoked only on a cache miss — e.g. to skip a large Data.rsdk fetch
30
- * when it's already persisted in OPFS.
38
+ * Where an engine keeps one namespace: `<engineId>/<namespace>`, relative to the OPFS
39
+ * root. Identical in every wasm-gaming engine, written to move verbatim into
40
+ * engine-specs: segments cleaned, `.` and `..` dropped, anything outside
41
+ * `[A-Za-z0-9._-]` → `_`, nothing usable → `default`; a leading `<engineId>/` is
42
+ * stripped once.
31
43
  */
32
- export type Rsdkv3LoadConfig = EngineConfig & {
33
- dataProvider?: () => Promise<AssetData> | AssetData;
34
- settingsProvider?: () => Promise<AssetData> | AssetData;
35
- /** Per-game storage folder under /data used for the in-memory filesystem. */
36
- storageNamespace?: string;
44
+ export declare function storagePath(engineId: string, namespace: unknown): {
45
+ namespace: string;
46
+ path: string;
47
+ prefixed: boolean;
37
48
  };
38
- /** Boot the RSDKv3 engine. */
39
- export declare function load(config: Rsdkv3LoadConfig): Promise<Rsdkv3Instance>;
40
- declare const _default: {
41
- manifest: import("@wasm-gaming/engine-specs").EngineManifest;
42
- load: typeof load;
43
- };
44
- export default _default;
49
+ /** Serialise the engine config into RSDKv3's settings.ini. */
50
+ export declare function buildSettingsIni(config: Rsdkv3Config): string;
51
+ /** The live engine: one booted RSDKv3 and its session. */
52
+ export declare class Rsdkv3Play extends EnginePlayBase<Rsdkv3Payloads> {
53
+ #private;
54
+ constructor(init?: EngineInit<Rsdkv3Payloads>, events?: EventEmitter<EventsOf<Rsdkv3Payloads>>);
55
+ get namespace(): string;
56
+ /** Where this session's files live, relative to the OPFS root: `rsdkv3/<namespace>`. */
57
+ get storagePath(): string;
58
+ get pausedBy(): string | null;
59
+ /** RSDKv3's stage list, for a host that draws its own stage select. */
60
+ get devMenu(): RsdkDevMenuBridge;
61
+ /**
62
+ * Freeze the game and its sound. The first caller owns the pause; only that
63
+ * owner's {@link resume} lifts it. The save is flushed.
64
+ */
65
+ pause(owner?: string): void;
66
+ resume(owner?: string): void;
67
+ /** Copy `SData.bin` to OPFS `rsdkv3/<namespace>/` if it changed; emits `saves`. */
68
+ flushSaves(): Promise<void>;
69
+ protected mounted(target: HTMLElement): void;
70
+ protected open(_options: Rsdkv3Options): Promise<void>;
71
+ protected patched(_kind: PayloadKind, _patch: object): void;
72
+ protected close(): Promise<void>;
73
+ }
74
+ /** The factory a host constructs: static identity, the configuration chain, `start()`. */
75
+ export declare class Rsdkv3SDK extends EngineSDKBase<Rsdkv3Payloads> {
76
+ static readonly id = "rsdkv3";
77
+ /** Kept in step with package.json by `node scripts/sync-version.mjs`. */
78
+ static readonly version = "0.2.0";
79
+ static readonly name = "Retro Software Development Kit v3";
80
+ static readonly description = "RSDKv3 (Sonic CD 2011 decompilation) compiled to WebAssembly. Ships none of the game: the player provides Data.rsdk, and it never leaves their browser.";
81
+ protected createPlay(init: EngineInit<Rsdkv3Payloads>, events: EventEmitter<EventsOf<Rsdkv3Payloads>>): Rsdkv3Play;
82
+ }
83
+ /** CI's conformance line: if this class stops satisfying the contract, `make test` fails. */
84
+ export declare const RSDKV3_ENGINE: EngineSDKConstructor<Rsdkv3Payloads>;
85
+ export default Rsdkv3SDK;
45
86
  //# sourceMappingURL=rsdkv3.sdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rsdkv3.sdk.d.ts","sourceRoot":"","sources":["../../src/rsdkv3.sdk.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,CAAC;AA0FpB,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,YAAY,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IACzE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACvD,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG;IAC5C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,uEAAuE;IACvE,UAAU,EAAE,OAAO,CAAC;IACpB,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,YAAY,IAAI;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CACtD,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG;IAC5C,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACpD,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACxD,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,8BAA8B;AAC9B,wBAAsB,IAAI,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CA2H5E;;;;;AAED,wBAAkC"}
1
+ {"version":3,"file":"rsdkv3.sdk.d.ts","sourceRoot":"","sources":["../../src/rsdkv3.sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA0BhE,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,YAAY,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IACzE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,OAAO,GACjB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAaxD;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA0B7D;AAyCD,0DAA0D;AAC1D,qBAAa,UAAW,SAAQ,cAAc,CAAC,cAAc,CAAC;;gBAqBhD,IAAI,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAI9F,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,wFAAwF;IACxF,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,uEAAuE;IACvE,IAAI,OAAO,IAAI,iBAAiB,CAc/B;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,SAAS,GAAG,IAAI;IAU3B,MAAM,CAAC,KAAK,SAAS,GAAG,IAAI;IAS5B,mFAAmF;IACnF,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;cASR,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;cAwB5B,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;cAQlD,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;cAI3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA+IhD;AAED,0FAA0F;AAC1F,qBAAa,SAAU,SAAQ,aAAa,CAAC,cAAc,CAAC;IAC1D,MAAM,CAAC,QAAQ,CAAC,EAAE,YAAa;IAC/B,yEAAyE;IACzE,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,uCAAuC;IAC3D,MAAM,CAAC,QAAQ,CAAC,WAAW,6JACiI;cAEzI,UAAU,CAC3B,IAAI,EAAE,UAAU,CAAC,cAAc,CAAC,EAChC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,GAC7C,UAAU;CAGd;AAED,6FAA6F;AAC7F,eAAO,MAAM,aAAa,EAAE,oBAAoB,CAAC,cAAc,CAAa,CAAC;AAE7E,eAAe,SAAS,CAAC"}