roll parts of pr385 into source tree
This does not take the PR as is.
Unlike the PR, this streamlines and minimizes the integration somewhat:
- use hints/include mechanism instead of creating alternative
Makefile.dat, Makefile.src, Makefile.top, Makefile.utl in sys/lib;
those would have been a maintenance nightmare.
- don't have alternative mkmkfile.sh and setup.sh in sys/lib.
- sys/lib/libnethackmain.c differed from sys/unix/unixmain.c by
very little, so just place a small bit of conditional code at the
top of sys/unix/unixmain.c instead.
- changed the conditional code bits from __EMSCRIPTEN__ to
CROSS_TO_WASM.
- You should be able to build the wasm result by:
cd sys/unix ; sh setup.sh hints/linux.2020 ; cd ../..
make fetch-lua (<-one time)
make WANT_LIBNH all
- You should be able to build LIBNBH by:
cd sys/unix ; sh setup.sh hints/linux.2020 ; cd ../..
make fetch-lua (<-one time)
make CROSS_TO_WASM=1 all
As it is currently coded, winshim.c requires C99.
50 lines
1.9 KiB
JavaScript
50 lines
1.9 KiB
JavaScript
const path = require("path");
|
|
|
|
let Module;
|
|
let userCallback;
|
|
let savedOnRuntimeInitialized;
|
|
|
|
// starts nethack
|
|
function nethackStart(cb, inputModule = {}) {
|
|
if(typeof cb !== "string" && typeof cb !== "function") throw new TypeError("expected first argument to be 'Function' or 'String' representing global callback function name");
|
|
if(typeof inputModule !== "object") throw new TypeError("expected second argument to be object");
|
|
|
|
let cbName;
|
|
if(typeof cb === "function") {
|
|
cbName = cb.name;
|
|
if (cbName === "") cbName = "__anonymousNetHackCallback";
|
|
if (globalThis[cbName] === undefined) globalThis[cbName] = cb;
|
|
else if (globalThis[cbName] !== cb) throw new Error (`'globalThis["${cbName}"]' is not the same as specified callback`);
|
|
}
|
|
|
|
/* global globalThis */
|
|
userCallback = globalThis[cbName];
|
|
if(typeof userCallback !== "function") throw new TypeError(`expected 'globalThis["${cbName}"]' to be a function`);
|
|
// if(userCallback.constructor.name !== "AsyncFunction") throw new TypeError(`expected 'globalThis["${cbName}"]' to be an async function`);
|
|
|
|
// Emscripten Module config
|
|
Module = inputModule;
|
|
savedOnRuntimeInitialized = Module.onRuntimeInitialized;
|
|
Module.onRuntimeInitialized = function (... args) {
|
|
// after the WASM is loaded, add the shim graphics callback function
|
|
Module.ccall(
|
|
"shim_graphics_set_callback", // C function name
|
|
null, // return type
|
|
["string"], // arg types
|
|
[cbName], // arg values
|
|
{async: true} // options
|
|
);
|
|
|
|
// if the user had their own onRuntimeInitialized(), call it now
|
|
if (savedOnRuntimeInitialized) savedOnRuntimeInitialized(... args);
|
|
};
|
|
|
|
// load and run the module
|
|
var factory = require(path.join(__dirname, "../build/nethack.js"));
|
|
factory(Module);
|
|
}
|
|
|
|
// TODO: ES6 'import' style module
|
|
module.exports = nethackStart;
|
|
|