@wasm-gaming/rsdkv4-wasm 0.1.4 → 0.1.5
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.
- package/README.md +188 -35
- package/dist/manifest.json +24 -5
- package/dist/rsdkv4/rsdkv4.manifest.d.ts.map +1 -1
- package/dist/rsdkv4/rsdkv4.manifest.js +14 -2
- package/dist/rsdkv4/rsdkv4.manifest.js.map +1 -1
- package/dist/rsdkv4/rsdkv4.options.d.ts +12 -0
- package/dist/rsdkv4/rsdkv4.options.d.ts.map +1 -1
- package/dist/rsdkv4/rsdkv4.options.js +33 -6
- package/dist/rsdkv4/rsdkv4.options.js.map +1 -1
- package/dist/rsdkv4/rsdkv4.sdk.d.ts +60 -1
- package/dist/rsdkv4/rsdkv4.sdk.d.ts.map +1 -1
- package/dist/rsdkv4/rsdkv4.sdk.js +359 -32
- package/dist/rsdkv4/rsdkv4.sdk.js.map +1 -1
- package/package.json +3 -3
- package/src/rsdkv4.manifest.ts +15 -2
- package/src/rsdkv4.options.ts +41 -6
- package/src/rsdkv4.sdk.ts +466 -32
- package/dist/rsdkv4/rsdkv4.js +0 -9268
- package/dist/rsdkv4/rsdkv4.wasm +0 -0
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
//
|
|
10
10
|
// Filesystem: built with -sWASMFS (the modern Emscripten filesystem, not MEMFS).
|
|
11
11
|
// The game working dir `/data` is mounted on **OPFS** for persistence when the
|
|
12
|
-
// page is cross-origin isolated
|
|
13
|
-
//
|
|
12
|
+
// page is cross-origin isolated *and* the wasm build can create the OPFS backend
|
|
13
|
+
// from the main thread (an Asyncify/JSPI build — today's is not, see WebFS.cpp);
|
|
14
|
+
// otherwise it falls back to the WASMFS in-memory backend (transient, but the
|
|
15
|
+
// engine still boots). The backend is selectable via
|
|
14
16
|
// `config.persist` (see mountWorkingDir), and when the dir is OPFS-backed the SDK
|
|
15
17
|
// reuses an already-persisted Data.rsdk/settings.ini instead of re-fetching.
|
|
16
18
|
import { manifest } from './rsdkv4.manifest.js';
|
|
@@ -18,7 +20,18 @@ import { DEFAULT_RSDKV4_OPTIONS } from './rsdkv4.options.js';
|
|
|
18
20
|
export { manifest };
|
|
19
21
|
const WORK_ROOT = '/data';
|
|
20
22
|
const DEFAULT_STORAGE_NAMESPACE = 'default';
|
|
21
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Emscripten's SDL2 port locates the canvas via `document.querySelector('#canvas')`,
|
|
25
|
+
* so the element the game draws into has to carry this id.
|
|
26
|
+
*/
|
|
27
|
+
const CANVAS_ID = 'canvas';
|
|
28
|
+
/**
|
|
29
|
+
* Serialize engine options into RSDKv4's settings.ini format.
|
|
30
|
+
*
|
|
31
|
+
* Note the Starting* trio defaults to 255 ("unset") — writing 0 is not neutral,
|
|
32
|
+
* it tells the engine to skip its start-menu flow and force that stage. See
|
|
33
|
+
* DEFAULT_RSDKV4_OPTIONS.
|
|
34
|
+
*/
|
|
22
35
|
function buildSettingsIni(options = {}) {
|
|
23
36
|
const o = { ...DEFAULT_RSDKV4_OPTIONS, ...options };
|
|
24
37
|
return [
|
|
@@ -29,6 +42,9 @@ function buildSettingsIni(options = {}) {
|
|
|
29
42
|
`StartingScene=${o.startingScene | 0}`,
|
|
30
43
|
`StartingPlayer=${o.startingPlayer | 0}`,
|
|
31
44
|
'',
|
|
45
|
+
'[Game]',
|
|
46
|
+
`SkipStartMenu=${o.skipStartMenu ? 'true' : 'false'}`,
|
|
47
|
+
'',
|
|
32
48
|
'[Window]',
|
|
33
49
|
`VSync=${o.vsync ? 'true' : 'false'}`,
|
|
34
50
|
'',
|
|
@@ -74,6 +90,27 @@ function ensureDir(Module, path) {
|
|
|
74
90
|
}
|
|
75
91
|
}
|
|
76
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Whether this build can mount OPFS at all, asked of the wasm itself.
|
|
95
|
+
*
|
|
96
|
+
* WASMFS's `wasmfs_create_opfs_backend()` spawns a proxy worker synchronously,
|
|
97
|
+
* which it refuses to do on the main browser thread without Asyncify/JSPI — it
|
|
98
|
+
* *asserts*, and a failed assert calls `abort()`, which tears the module down for
|
|
99
|
+
* good. That is past the point where a try/catch around the call can save us, so
|
|
100
|
+
* we have to know before calling. `web_opfs_supported` (WebFS.cpp) mirrors the
|
|
101
|
+
* same condition; builds predating that helper simply answer "no".
|
|
102
|
+
*/
|
|
103
|
+
function opfsMountSupported(Module) {
|
|
104
|
+
const probe = Module._web_opfs_supported;
|
|
105
|
+
if (typeof probe !== 'function')
|
|
106
|
+
return false;
|
|
107
|
+
try {
|
|
108
|
+
return probe() !== 0;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
77
114
|
/**
|
|
78
115
|
* Mount the game working dir, honoring `persist`:
|
|
79
116
|
* 'opfs' → force an OPFS (persistent) mount; warn + fall back if unavailable.
|
|
@@ -81,14 +118,15 @@ function ensureDir(Module, path) {
|
|
|
81
118
|
* undefined → auto: OPFS when the page is cross-origin isolated, else in-memory.
|
|
82
119
|
* ('idbfs' isn't supported under WASMFS and is treated as in-memory.)
|
|
83
120
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
121
|
+
* Cross-origin isolation is necessary but not sufficient: the mount also needs a
|
|
122
|
+
* build whose OPFS backend can run from where we call it (see opfsMountSupported),
|
|
123
|
+
* so both gates apply before we touch `web_mount_opfs`.
|
|
86
124
|
* Returns whether the resulting mount is persistent.
|
|
87
125
|
*/
|
|
88
126
|
function mountWorkingDir(Module, persist) {
|
|
89
127
|
const isolated = typeof crossOriginIsolated !== 'undefined' && crossOriginIsolated;
|
|
90
|
-
const
|
|
91
|
-
if (
|
|
128
|
+
const wantsOpfs = persist === 'opfs' || (persist === undefined && isolated);
|
|
129
|
+
if (wantsOpfs && typeof Module.ccall === 'function' && opfsMountSupported(Module)) {
|
|
92
130
|
try {
|
|
93
131
|
const rc = Module.ccall('web_mount_opfs', 'number', ['string'], [WORK_ROOT]);
|
|
94
132
|
if (rc === 0)
|
|
@@ -97,9 +135,9 @@ function mountWorkingDir(Module, persist) {
|
|
|
97
135
|
catch {
|
|
98
136
|
/* fall through to in-memory */
|
|
99
137
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
138
|
+
}
|
|
139
|
+
if (persist === 'opfs') {
|
|
140
|
+
console.warn('[rsdkv4] OPFS requested but unavailable (needs a cross-origin isolated page and an Asyncify/JSPI build) — using in-memory WASMFS');
|
|
103
141
|
}
|
|
104
142
|
ensureDir(Module, WORK_ROOT);
|
|
105
143
|
return { persistent: false };
|
|
@@ -114,6 +152,106 @@ function fileExists(Module, path) {
|
|
|
114
152
|
return false;
|
|
115
153
|
}
|
|
116
154
|
}
|
|
155
|
+
/**
|
|
156
|
+
* Wait for Engine::Init, which runs on the engine's first frame (main.cpp's
|
|
157
|
+
* main_loop), not inside callMain. Gives up after ~4s rather than hanging the
|
|
158
|
+
* host: everything still works, the first read just comes back empty.
|
|
159
|
+
*/
|
|
160
|
+
async function waitForEngine(Module, timeoutMs = 4000) {
|
|
161
|
+
if (typeof Module.web_engine_ready !== 'function')
|
|
162
|
+
return false;
|
|
163
|
+
const deadline = Date.now() + timeoutMs;
|
|
164
|
+
while (Date.now() < deadline) {
|
|
165
|
+
if (Module.web_engine_ready())
|
|
166
|
+
return true;
|
|
167
|
+
await new Promise((resolve) => requestAnimationFrame(resolve));
|
|
168
|
+
}
|
|
169
|
+
console.warn('[rsdkv4] engine did not report ready within %dms', timeoutMs);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The embind bridges this SDK drives the engine through. All of them ship in the
|
|
174
|
+
* same rsdkv4.wasm, so a module missing any one of them is an artifact older
|
|
175
|
+
* than this SDK rather than a build variant.
|
|
176
|
+
*/
|
|
177
|
+
const ENGINE_BRIDGES = [
|
|
178
|
+
'web_engine_ready',
|
|
179
|
+
'web_game_type',
|
|
180
|
+
'web_get_players',
|
|
181
|
+
'web_get_save_slots',
|
|
182
|
+
'web_get_game_options',
|
|
183
|
+
'web_start_game',
|
|
184
|
+
'web_audio_stop',
|
|
185
|
+
'web_devmenu_get_stage_list',
|
|
186
|
+
];
|
|
187
|
+
function engineBridgeComplete(Module) {
|
|
188
|
+
return ENGINE_BRIDGES.every((name) => typeof Module?.[name] === 'function');
|
|
189
|
+
}
|
|
190
|
+
/** RSDKv4's save file, written next to the game data in the working dir. */
|
|
191
|
+
const SAVE_FILE = 'SData.bin';
|
|
192
|
+
/**
|
|
193
|
+
* OPFS handle for `<namespace>/`, reached with the plain (async) OPFS API from
|
|
194
|
+
* JS — which, unlike the WASM side's sync access handles, works on the main
|
|
195
|
+
* thread of any page. Returns null when OPFS isn't available at all.
|
|
196
|
+
*/
|
|
197
|
+
async function opfsNamespaceDir(namespace, create) {
|
|
198
|
+
if (typeof navigator === 'undefined' || !navigator.storage?.getDirectory)
|
|
199
|
+
return null;
|
|
200
|
+
try {
|
|
201
|
+
let dir = await navigator.storage.getDirectory();
|
|
202
|
+
for (const segment of namespace.split('/').filter(Boolean)) {
|
|
203
|
+
dir = await dir.getDirectoryHandle(segment, { create });
|
|
204
|
+
}
|
|
205
|
+
return dir;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return null; // missing (create: false), or blocked
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Mirror for the engine's save file.
|
|
213
|
+
*
|
|
214
|
+
* The working dir is in-memory whenever the OPFS *mount* is unavailable (which
|
|
215
|
+
* is every build without Asyncify/JSPI — see mountWorkingDir), so SData.bin
|
|
216
|
+
* would die with the page and every save slot would read "NEW GAME" forever.
|
|
217
|
+
* The host's own OPFS access has no such limitation, so the SDK copies the file
|
|
218
|
+
* in before the engine boots and back out as it changes. Saves therefore
|
|
219
|
+
* survive reloads even while the mounted working dir does not.
|
|
220
|
+
*/
|
|
221
|
+
async function restoreSaveData(Module, namespace, workDir) {
|
|
222
|
+
const dir = await opfsNamespaceDir(namespace, false);
|
|
223
|
+
if (!dir)
|
|
224
|
+
return;
|
|
225
|
+
try {
|
|
226
|
+
const file = await (await dir.getFileHandle(SAVE_FILE)).getFile();
|
|
227
|
+
if (file.size > 0) {
|
|
228
|
+
Module.FS.writeFile(`${workDir}/${SAVE_FILE}`, new Uint8Array(await file.arrayBuffer()));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
/* no save yet */
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async function persistSaveData(Module, namespace, workDir) {
|
|
236
|
+
let bytes;
|
|
237
|
+
try {
|
|
238
|
+
bytes = Module.FS.readFile(`${workDir}/${SAVE_FILE}`);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return; // the engine hasn't written one
|
|
242
|
+
}
|
|
243
|
+
const dir = await opfsNamespaceDir(namespace, true);
|
|
244
|
+
if (!dir)
|
|
245
|
+
return;
|
|
246
|
+
try {
|
|
247
|
+
const writable = await (await dir.getFileHandle(SAVE_FILE, { create: true })).createWritable();
|
|
248
|
+
await writable.write(bytes);
|
|
249
|
+
await writable.close();
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
console.warn('[rsdkv4] could not persist save data', e);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
117
255
|
/** Delete a file if present; returns true when something was removed. */
|
|
118
256
|
function deleteFileIfExists(Module, path) {
|
|
119
257
|
if (!fileExists(Module, path))
|
|
@@ -128,34 +266,119 @@ function deleteFileIfExists(Module, path) {
|
|
|
128
266
|
}
|
|
129
267
|
/** Boot the RSDKv4 engine. */
|
|
130
268
|
export async function load(config) {
|
|
131
|
-
const {
|
|
269
|
+
const { assets, onEvent, attachTo } = config;
|
|
132
270
|
const options = config.options;
|
|
133
|
-
|
|
134
|
-
throw new Error('rsdkv4: config.canvas is required');
|
|
135
|
-
// Emscripten's SDL2 port locates the canvas via document.querySelector('#canvas').
|
|
136
|
-
if (canvas.id !== 'canvas')
|
|
137
|
-
canvas.id = 'canvas';
|
|
138
|
-
const emit = (e) => {
|
|
271
|
+
const emit = (event) => {
|
|
139
272
|
try {
|
|
140
|
-
onEvent?.(
|
|
273
|
+
onEvent?.(event);
|
|
141
274
|
}
|
|
142
|
-
catch {
|
|
275
|
+
catch {
|
|
276
|
+
// A host callback must not break the engine runtime.
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
// ----------------------------------------------------------------- render target
|
|
280
|
+
const providedCanvas = config.canvasEl ?? config.canvas ?? null;
|
|
281
|
+
if (!providedCanvas && !attachTo) {
|
|
282
|
+
throw new Error('rsdkv4: config.canvasEl or config.attachTo is required');
|
|
283
|
+
}
|
|
284
|
+
const ownsCanvas = providedCanvas === null;
|
|
285
|
+
const canvas = providedCanvas ?? document.createElement('canvas');
|
|
286
|
+
// Emscripten's SDL2 port locates the canvas via document.querySelector('#canvas').
|
|
287
|
+
if (canvas.id !== CANVAS_ID) {
|
|
288
|
+
if (canvas.id) {
|
|
289
|
+
console.warn(`rsdkv4: renaming the render target's id from "${canvas.id}" to "${CANVAS_ID}" — SDL looks the canvas up by that id.`);
|
|
290
|
+
}
|
|
291
|
+
canvas.id = CANVAS_ID;
|
|
292
|
+
}
|
|
293
|
+
if (ownsCanvas) {
|
|
294
|
+
canvas.style.display = 'block';
|
|
295
|
+
canvas.style.maxWidth = '100%';
|
|
296
|
+
canvas.style.maxHeight = '100%';
|
|
297
|
+
canvas.style.height = 'auto';
|
|
298
|
+
canvas.classList.add('emscripten');
|
|
299
|
+
attachTo?.appendChild(canvas);
|
|
300
|
+
}
|
|
301
|
+
// A canvas is not in the tab order and `focus()` on one is a silent no-op
|
|
302
|
+
// until it has a tabindex. -1 makes it focusable without adding a tab stop.
|
|
303
|
+
if (!canvas.hasAttribute('tabindex'))
|
|
304
|
+
canvas.setAttribute('tabindex', '-1');
|
|
305
|
+
// …and the focus ring would draw a browser-blue box around the picture.
|
|
306
|
+
canvas.style.outline = 'none';
|
|
307
|
+
const swallowContextMenu = (event) => event.preventDefault();
|
|
308
|
+
canvas.addEventListener('contextmenu', swallowContextMenu);
|
|
309
|
+
const focusCanvas = () => {
|
|
310
|
+
if (!document.hasFocus())
|
|
311
|
+
window.focus();
|
|
312
|
+
canvas.focus({ preventScroll: true });
|
|
313
|
+
};
|
|
314
|
+
const onPointerDown = () => focusCanvas();
|
|
315
|
+
canvas.addEventListener('pointerdown', onPointerDown);
|
|
316
|
+
// ----------------------------------------------------------------- sizing
|
|
317
|
+
/** The box the picture has to fit inside, in CSS pixels. */
|
|
318
|
+
const boxElement = ownsCanvas && attachTo ? attachTo : canvas;
|
|
319
|
+
const fitPicture = () => {
|
|
320
|
+
if (!ownsCanvas)
|
|
321
|
+
return;
|
|
322
|
+
const box = boxElement.getBoundingClientRect();
|
|
323
|
+
if (box.width < 1 || box.height < 1)
|
|
324
|
+
return;
|
|
325
|
+
const bw = manifest.video.baseWidth;
|
|
326
|
+
const bh = manifest.video.baseHeight;
|
|
327
|
+
const scale = Math.min(box.width / bw, box.height / bh);
|
|
328
|
+
canvas.style.width = `${Math.round(bw * scale)}px`;
|
|
329
|
+
canvas.style.height = `${Math.round(bh * scale)}px`;
|
|
143
330
|
};
|
|
331
|
+
fitPicture();
|
|
332
|
+
const onResize = () => fitPicture();
|
|
333
|
+
window.addEventListener('resize', onResize);
|
|
334
|
+
const boxObserver = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(onResize);
|
|
335
|
+
boxObserver?.observe(boxElement);
|
|
336
|
+
// Fullscreen transitions need a refit too.
|
|
337
|
+
const onFullscreenChange = () => {
|
|
338
|
+
fitPicture();
|
|
339
|
+
requestAnimationFrame(fitPicture);
|
|
340
|
+
};
|
|
341
|
+
document.addEventListener('fullscreenchange', onFullscreenChange);
|
|
342
|
+
// ----------------------------------------------------------------- emscripten
|
|
144
343
|
const jsUrl = config.jsUrl ?? new URL('./rsdkv4.js', import.meta.url).href;
|
|
145
344
|
const wasmUrl = config.wasmUrl ?? new URL('./rsdkv4.wasm', import.meta.url).href;
|
|
146
345
|
// RSDKv4 keyboard bindings are the shared input script's default preset.
|
|
147
346
|
if (typeof window !== 'undefined')
|
|
148
347
|
window.__gamepadKeyMap = manifest.input;
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
348
|
+
const instantiate = async (bust) => {
|
|
349
|
+
const withBust = (url) => {
|
|
350
|
+
if (!bust)
|
|
351
|
+
return url;
|
|
352
|
+
const parsed = new URL(url, location.href);
|
|
353
|
+
parsed.searchParams.set('_', bust);
|
|
354
|
+
return parsed.href;
|
|
355
|
+
};
|
|
356
|
+
const mod = await import(/* @vite-ignore */ withBust(jsUrl));
|
|
357
|
+
return mod.default({
|
|
358
|
+
canvas,
|
|
359
|
+
noInitialRun: true, // built with -sINVOKE_RUN=0; we mount data before main()
|
|
360
|
+
locateFile: (path) => (path.endsWith('.wasm') ? withBust(wasmUrl) : path),
|
|
361
|
+
print: (...a) => console.log('[rsdkv4]', ...a),
|
|
362
|
+
printErr: (...a) => console.error('[rsdkv4]', ...a),
|
|
363
|
+
onAbort: (reason) => emit({ type: 'error', error: new Error(`rsdkv4 aborted: ${reason}`) }),
|
|
364
|
+
});
|
|
365
|
+
};
|
|
366
|
+
let Module = await instantiate();
|
|
367
|
+
// Self-heal a stale engine.
|
|
368
|
+
//
|
|
369
|
+
// rsdkv4.js/.wasm are big and served by most static hosts with nothing but
|
|
370
|
+
// Last-Modified, so a browser will happily keep a build for hours. The
|
|
371
|
+
// symptom is nasty: fresh SDK code against an old engine, where the bridges
|
|
372
|
+
// this SDK calls simply don't exist and every getter quietly answers "empty" —
|
|
373
|
+
// no save slots, no characters, an empty pause menu. Rather than leave that to
|
|
374
|
+
// the reader's cache hygiene, notice it and fetch once past the cache.
|
|
375
|
+
if (!engineBridgeComplete(Module)) {
|
|
376
|
+
console.warn('[rsdkv4] the engine that loaded is missing bridges this SDK needs — refetching past the HTTP cache');
|
|
377
|
+
Module = await instantiate(String(Date.now()));
|
|
378
|
+
if (!engineBridgeComplete(Module)) {
|
|
379
|
+
console.error('[rsdkv4] still missing engine bridges after a cache-busting reload — rsdkv4.wasm is genuinely older than this SDK; rebuild it (`make build-wasm`)');
|
|
380
|
+
}
|
|
381
|
+
}
|
|
159
382
|
// Mount the working dir first, so we can see what's already persisted (OPFS)
|
|
160
383
|
// before deciding whether to pull assets.
|
|
161
384
|
const { persistent } = mountWorkingDir(Module, config.persist);
|
|
@@ -192,10 +415,87 @@ export async function load(config) {
|
|
|
192
415
|
Module.FS.writeFile(settingsPath, new TextEncoder().encode(buildSettingsIni(options)));
|
|
193
416
|
}
|
|
194
417
|
// else: keep the persisted settings.ini
|
|
418
|
+
// Save data. `persist: null` means the host wants nothing kept, so honour it;
|
|
419
|
+
// otherwise pull any previous SData.bin in before the engine reads it.
|
|
420
|
+
const mirrorSaves = config.persist !== null;
|
|
421
|
+
if (mirrorSaves)
|
|
422
|
+
await restoreSaveData(Module, storageNamespace, workDir);
|
|
195
423
|
Module.FS.chdir(workDir);
|
|
196
|
-
|
|
424
|
+
let pauseOwner = null;
|
|
425
|
+
const applyPaused = (paused) => {
|
|
197
426
|
if (typeof Module.web_devmenu_set_paused === 'function')
|
|
198
427
|
Module.web_devmenu_set_paused(paused);
|
|
428
|
+
if (typeof Module.web_audio_set_paused === 'function')
|
|
429
|
+
Module.web_audio_set_paused(paused);
|
|
430
|
+
};
|
|
431
|
+
const pauseWith = (owner) => {
|
|
432
|
+
if (pauseOwner !== null)
|
|
433
|
+
return; // already paused — whoever got there first keeps the claim
|
|
434
|
+
pauseOwner = owner;
|
|
435
|
+
applyPaused(true);
|
|
436
|
+
// A pause is a natural checkpoint for the save mirror.
|
|
437
|
+
if (mirrorSaves)
|
|
438
|
+
void persistSaveData(Module, storageNamespace, workDir);
|
|
439
|
+
};
|
|
440
|
+
const resumeFrom = (owner) => {
|
|
441
|
+
if (pauseOwner !== owner)
|
|
442
|
+
return; // someone else's pause — leave it alone
|
|
443
|
+
pauseOwner = null;
|
|
444
|
+
applyPaused(false);
|
|
445
|
+
};
|
|
446
|
+
/** Legacy shape kept for `devMenu.setPaused` — always acts as the host. */
|
|
447
|
+
const setPaused = (paused) => {
|
|
448
|
+
if (paused)
|
|
449
|
+
pauseWith('host');
|
|
450
|
+
else
|
|
451
|
+
resumeFrom(pauseOwner ?? 'host');
|
|
452
|
+
};
|
|
453
|
+
const stopAudio = () => {
|
|
454
|
+
try {
|
|
455
|
+
Module.web_audio_stop?.();
|
|
456
|
+
}
|
|
457
|
+
catch {
|
|
458
|
+
/* engine already down */
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
/**
|
|
462
|
+
* Call a `web_*` embind getter and parse its JSON.
|
|
463
|
+
*
|
|
464
|
+
* A missing function means the loaded rsdkv4.wasm predates that bridge — the
|
|
465
|
+
* usual cause is a browser serving a cached build. Say so out loud: silently
|
|
466
|
+
* returning an empty list makes a stale artifact look like an empty save file
|
|
467
|
+
* or a game with no playable characters.
|
|
468
|
+
*/
|
|
469
|
+
const parseJson = (fn, fallback, what) => {
|
|
470
|
+
if (typeof fn !== 'function') {
|
|
471
|
+
console.error(`[rsdkv4] ${what} is missing from this build of rsdkv4.wasm — the page is probably running a cached copy. Hard-reload (or clear the site's storage) after rebuilding.`);
|
|
472
|
+
return fallback;
|
|
473
|
+
}
|
|
474
|
+
try {
|
|
475
|
+
return JSON.parse(fn());
|
|
476
|
+
}
|
|
477
|
+
catch (e) {
|
|
478
|
+
console.error(`[rsdkv4] ${what} failed`, e);
|
|
479
|
+
return fallback;
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
const game = {
|
|
483
|
+
type: () => (typeof Module.web_game_type === 'function' ? Module.web_game_type() : 0),
|
|
484
|
+
players: () => parseJson(Module.web_get_players, [], 'web_get_players'),
|
|
485
|
+
saveSlots: () => parseJson(Module.web_get_save_slots, [], 'web_get_save_slots'),
|
|
486
|
+
options: () => parseJson(Module.web_get_game_options, [], 'web_get_game_options'),
|
|
487
|
+
setOption(key, value) {
|
|
488
|
+
Module.web_set_game_option?.(String(key), value | 0);
|
|
489
|
+
},
|
|
490
|
+
deleteSave(slot) {
|
|
491
|
+
Module.web_delete_save?.(slot | 0);
|
|
492
|
+
},
|
|
493
|
+
start(slot, player = 0) {
|
|
494
|
+
Module.web_start_game?.(slot == null ? -1 : slot | 0, player | 0);
|
|
495
|
+
// The overlay that drove this is done with the engine — hand it back.
|
|
496
|
+
pauseOwner = null;
|
|
497
|
+
applyPaused(false);
|
|
498
|
+
},
|
|
199
499
|
};
|
|
200
500
|
const devMenu = {
|
|
201
501
|
getStageList() {
|
|
@@ -219,11 +519,22 @@ export async function load(config) {
|
|
|
219
519
|
// Run main() from the OPFS/WASMFS working dir. simulate_infinite_loop schedules
|
|
220
520
|
// the rAF loop and returns via a benign unwind Emscripten swallows.
|
|
221
521
|
Module.callMain(['UsingCWD']);
|
|
522
|
+
// callMain only *schedules* the loop: Engine::Init runs on the first frame, and
|
|
523
|
+
// until it has, there is no game config, stage list or saveRAM to read. Waiting
|
|
524
|
+
// here means a host can call devMenu/game getters the moment load() resolves.
|
|
525
|
+
await waitForEngine(Module);
|
|
526
|
+
focusCanvas();
|
|
527
|
+
// The engine writes SData.bin at its own pace (new game, checkpoint, options
|
|
528
|
+
// change), so copy it out on a slow timer as well as on the way down.
|
|
529
|
+
const saveTimer = mirrorSaves
|
|
530
|
+
? setInterval(() => void persistSaveData(Module, storageNamespace, workDir), 10_000)
|
|
531
|
+
: null;
|
|
222
532
|
emit({ type: 'ready' });
|
|
223
533
|
return {
|
|
224
534
|
start() { },
|
|
225
|
-
pause
|
|
226
|
-
|
|
535
|
+
/** `owner` lets a pause overlay avoid resuming a game something else paused. */
|
|
536
|
+
pause(owner = 'host') { pauseWith(owner); },
|
|
537
|
+
resume(owner = 'host') { resumeFrom(owner); },
|
|
227
538
|
reset() {
|
|
228
539
|
throw new Error('rsdkv4: reset() is not supported — destroy() and load() again');
|
|
229
540
|
},
|
|
@@ -233,6 +544,11 @@ export async function load(config) {
|
|
|
233
544
|
}
|
|
234
545
|
},
|
|
235
546
|
destroy() {
|
|
547
|
+
if (saveTimer !== null)
|
|
548
|
+
clearInterval(saveTimer);
|
|
549
|
+
// Last chance to keep whatever the player earned this session.
|
|
550
|
+
if (mirrorSaves)
|
|
551
|
+
void persistSaveData(Module, storageNamespace, workDir);
|
|
236
552
|
try {
|
|
237
553
|
Module.pauseMainLoop?.();
|
|
238
554
|
}
|
|
@@ -241,8 +557,19 @@ export async function load(config) {
|
|
|
241
557
|
setPaused(true);
|
|
242
558
|
}
|
|
243
559
|
catch { /* noop */ }
|
|
560
|
+
// Freezing the loop does not silence the audio callback — without this the
|
|
561
|
+
// music kept playing after the host went back to its launcher.
|
|
562
|
+
stopAudio();
|
|
563
|
+
canvas.removeEventListener('contextmenu', swallowContextMenu);
|
|
564
|
+
canvas.removeEventListener('pointerdown', onPointerDown);
|
|
565
|
+
document.removeEventListener('fullscreenchange', onFullscreenChange);
|
|
566
|
+
window.removeEventListener('resize', onResize);
|
|
567
|
+
boxObserver?.disconnect();
|
|
568
|
+
if (ownsCanvas)
|
|
569
|
+
canvas.remove();
|
|
244
570
|
},
|
|
245
571
|
devMenu,
|
|
572
|
+
game,
|
|
246
573
|
persistent,
|
|
247
574
|
storageNamespace,
|
|
248
575
|
purgeStorage() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rsdkv4.sdk.js","sourceRoot":"","sources":["../../src/rsdkv4.sdk.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rsdkv4.sdk.js","sourceRoot":"","sources":["../../src/rsdkv4.sdk.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wasm-gaming/rsdkv4-wasm",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "RSDKv4 (Retro Software Development Kit v4) compiled to WebAssembly, with a JS SDK conforming to the wasm-gaming engine contract. Runs Sonic 1 & Sonic 2 from a single WASM by loading Data.rsdk at runtime.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"comment:scripts": "Build logic lives in the Makefile, not here (make build / build-sdk / build-wasm / preview).",
|
|
36
36
|
"scripts": {},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@wasm-gaming/engine-specs": "
|
|
38
|
+
"@wasm-gaming/engine-specs": ">=0.2.0"
|
|
39
39
|
},
|
|
40
40
|
"peerDependenciesMeta": {
|
|
41
41
|
"@wasm-gaming/engine-specs": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
}
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@wasm-gaming/engine-specs": "^0.
|
|
46
|
+
"@wasm-gaming/engine-specs": "^0.2.6",
|
|
47
47
|
"typescript": "^5.5.0"
|
|
48
48
|
},
|
|
49
49
|
"engineContract": "https://github.com/wasm-gaming/engine-specs",
|
package/src/rsdkv4.manifest.ts
CHANGED
|
@@ -7,8 +7,10 @@ import { RSDKV4_OPTIONS_SCHEMA } from './rsdkv4.options.js';
|
|
|
7
7
|
|
|
8
8
|
export const manifest: EngineManifest = {
|
|
9
9
|
id: 'rsdkv4',
|
|
10
|
-
version: '0.1.
|
|
10
|
+
version: '0.1.5',
|
|
11
11
|
name: 'Retro Software Development Kit v4',
|
|
12
|
+
description:
|
|
13
|
+
'RSDKv4 compiled to WebAssembly via Emscripten. One game-agnostic WASM binary runs both Sonic 1 and Sonic 2 — the difference is only which Data.rsdk the host supplies at runtime. Ships none of the game: the player provides their own Data.rsdk, and it never leaves their browser.',
|
|
12
14
|
artifacts: {
|
|
13
15
|
// Relative to the manifest (dist/manifest.json); the engine files live in
|
|
14
16
|
// the dist/rsdkv4/ subfolder.
|
|
@@ -35,7 +37,18 @@ export const manifest: EngineManifest = {
|
|
|
35
37
|
'Engine settings. Omitted → the SDK generates one from config.options.',
|
|
36
38
|
},
|
|
37
39
|
],
|
|
38
|
-
|
|
40
|
+
// RSDKv4 keyboard defaults. The key names are KeyboardEvent.code values.
|
|
41
|
+
input: {
|
|
42
|
+
up: 'ArrowUp',
|
|
43
|
+
down: 'ArrowDown',
|
|
44
|
+
left: 'ArrowLeft',
|
|
45
|
+
right: 'ArrowRight',
|
|
46
|
+
a: 'KeyZ',
|
|
47
|
+
b: 'KeyX',
|
|
48
|
+
c: 'KeyC',
|
|
49
|
+
start: 'Enter',
|
|
50
|
+
select: 'ShiftLeft',
|
|
51
|
+
},
|
|
39
52
|
video: { baseWidth: 424, baseHeight: 240, aspect: '16:9' },
|
|
40
53
|
options: RSDKV4_OPTIONS_SCHEMA,
|
|
41
54
|
capabilities: { saveStates: false, sram: false, coreSelectable: false },
|