@neth4ck/neth4ck
Version:
NetHack WASM shim — version-agnostic callback bridge and module initializer
93 lines (87 loc) • 2.72 kB
JavaScript
let _module = null;
export function setModule(mod) {
_module = mod;
}
export function decodeArgs(name, args) {
switch (name) {
case "shim_create_nhwindow":
args[0] = globalThis.nethackGlobal.constants.WIN_TYPE[args[0]];
break;
case "shim_status_update":
args[0] = globalThis.nethackGlobal.constants.STATUS_FIELD[args[0]];
if (
args[0] !== "BL_CONDITION" &&
args[0] !== "BL_RESET" &&
args[0] !== "BL_FLUSH" &&
args[0] !== "BL_CHARACTERISTICS" &&
args[1]
) {
args[1] = getArg(name, args[1], "s");
} else {
args[1] = getArg(name, args[1], "p");
}
break;
case "shim_display_file":
args[1] = !!args[1];
break;
case "shim_display_nhwindow":
args[0] = decodeWindow(args[0]);
args[1] = !!args[1];
break;
case "shim_getmsghistory":
args[0] = !!args[0];
break;
case "shim_putmsghistory":
args[1] = !!args[1];
break;
case "shim_status_enablefield":
args[3] = !!args[3];
break;
case "shim_add_menu":
case "shim_putstr":
case "shim_clear_nhwindow":
case "shim_destroy_nhwindow":
case "shim_curs":
case "shim_start_menu":
case "shim_end_menu":
case "shim_print_glyph":
args[0] = decodeWindow(args[0]);
break;
case "shim_select_menu":
args[0] = decodeWindow(args[0]);
args[1] = decodeSelected(args[1]);
break;
}
}
function decodeWindow(winid) {
const { WIN_MAP, WIN_INVEN, WIN_STATUS, WIN_MESSAGE } = globalThis.nethackGlobal.globals;
switch (winid) {
case WIN_MAP:
return "WIN_MAP";
case WIN_MESSAGE:
return "WIN_MESSAGE";
case WIN_STATUS:
return "WIN_STATUS";
case WIN_INVEN:
return "WIN_INVEN";
default:
return winid;
}
}
function decodeSelected(how) {
const { PICK_NONE, PICK_ONE, PICK_ANY } = globalThis.nethackGlobal.constants.MENU_SELECT;
switch (how) {
case PICK_NONE:
return "PICK_NONE";
case PICK_ONE:
return "PICK_ONE";
case PICK_ANY:
return "PICK_ANY";
default:
return how;
}
}
function getArg(name, ptr, type) {
const { getPointerValue } = globalThis.nethackGlobal.helpers;
return type === "o" ? ptr : getPointerValue(name, _module.getValue(ptr, "*"), type);
}