diff --git a/src/mujs/jslibtemple.c b/src/mujs/jslibtemple.c index 6448e96..6036612 100644 --- a/src/mujs/jslibtemple.c +++ b/src/mujs/jslibtemple.c @@ -157,6 +157,53 @@ void jsLT_initgr(js_State *J) js_defglobal(J, "Gr", JS_DONTENUM); } +/** Input **/ + +uint64_t get_glbl_var_addr(char* name) +{ + // 0x100300 + 0x3d0: adam_task + offset(CTask.hash_table) + // 0x8: HTT_GLBL_VAR + // 0x78: offset(CHashGlblVar.data_addr) + uint64_t addr = os_call_ext_str_4("HashFind", (uint64_t)name, *(uint64_t*)(0x100300 + 0x3d0), 8, 1); + return addr ? *(uint64_t*)(addr + 0x78) : 0; +} + +void Input_mouse_x(js_State *J) +{ + uint64_t* res = (uint64_t*)get_glbl_var_addr("ms"); + js_pushnumber(J, res[0]); // offset(CMsStateGlbls.pos.x) +} + +void Input_mouse_y(js_State *J) +{ + uint64_t* res = (uint64_t*)get_glbl_var_addr("ms"); + js_pushnumber(J, res[1]); // offset(CMsStateGlbls.pos.y) +} + +void Input_mouse_lb(js_State *J) +{ + uint8_t* res = (uint8_t*)get_glbl_var_addr("ms"); + js_pushboolean(J, res[0xa0]); // offset(CMsStateGlbls.lb) +} + +void Input_mouse_rb(js_State *J) +{ + uint8_t* res = (uint8_t*)get_glbl_var_addr("ms"); + js_pushboolean(J, res[0xa1]); // offset(CMsStateGlbls.rb) +} + +void jsLT_initinput(js_State *J) +{ + js_pushobject(J, jsV_newobject(J, -1, J->Object_prototype)); + { + jsB_propf(J, "Input.mouse_x", Input_mouse_x, 0); + jsB_propf(J, "Input.mouse_y", Input_mouse_y, 0); + jsB_propf(J, "Input.mouse_lb", Input_mouse_lb, 0); + jsB_propf(J, "Input.mouse_rb", Input_mouse_rb, 0); + } + js_defglobal(J, "Input", JS_DONTENUM); +} + /** OS **/ // U0 Beep(I8 ona=62,Bool busy=FALSE) @@ -276,5 +323,6 @@ void js_initlibtemple(js_State *J) { jsLT_initdc(J); jsLT_initgr(J); + jsLT_initinput(J); jsLT_initos(J); }