From ff1091112de23db6750a890d6838cd7531763312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=81=8D=E5=85=AE=E6=83=9A=E5=85=AE?= <101191390+HIllya51@users.noreply.github.com> Date: Sun, 5 May 2024 02:33:58 +0800 Subject: [PATCH] issues/708 --- LunaHook/engines/python/python.cpp | 20 ++++- LunaHook/resource/renpy_hook_text.py | 105 +++++++++++++++++++-------- 2 files changed, 92 insertions(+), 33 deletions(-) diff --git a/LunaHook/engines/python/python.cpp b/LunaHook/engines/python/python.cpp index f356267..26727c8 100644 --- a/LunaHook/engines/python/python.cpp +++ b/LunaHook/engines/python/python.cpp @@ -11,6 +11,24 @@ extern "C" __declspec(dllexport) const wchar_t* internal_renpy_call_host(const wchar_t* text,int split){ return text; } +bool Luna_checkisusingembed(uint64_t address, uint64_t ctx1, uint64_t ctx2) +{ + auto sm = embedsharedmem; + if (!sm) + return false; + for (int i = 0; i < 10; i++) + { + if (sm->use[i]) + { + if ((sm->addr[i] == address) && (sm->ctx1[i] == ctx1) && (sm->ctx2[i] == ctx2)) + return true; + } + } + return false; +} +extern "C" __declspec(dllexport) bool internal_renpy_call_is_embed_using(int split){ + return Luna_checkisusingembed((uint64_t)internal_renpy_call_host,0,split); +} namespace{ typedef enum {PyGILState_LOCKED, PyGILState_UNLOCKED} @@ -45,7 +63,7 @@ void hook_internal_renpy_call_host(){ hp_internal.address=(uintptr_t)internal_renpy_call_host; hp_internal.offset=GETARG1; hp_internal.split=GETARG2; - hp_internal.type=USING_SPLIT|USING_STRING|CODEC_UTF16|EMBED_ABLE|EMBED_BEFORE_SIMPLE|EMBED_AFTER_NEW; + hp_internal.type=USING_SPLIT|USING_STRING|CODEC_UTF16|EMBED_ABLE|EMBED_BEFORE_SIMPLE|EMBED_AFTER_NEW|NO_CONTEXT; NewHook(hp_internal, "internal_renpy_call_host"); PyRunScript(LoadResData(L"renpy_hook_text",L"PYSOURCE").c_str()); } diff --git a/LunaHook/resource/renpy_hook_text.py b/LunaHook/resource/renpy_hook_text.py index 9a27ba5..a2de11d 100644 --- a/LunaHook/resource/renpy_hook_text.py +++ b/LunaHook/resource/renpy_hook_text.py @@ -1,39 +1,72 @@ -def callLunaHost(text,split): +def callLunaHost(text, split): try: import ctypes + try: - internal_renpy_call_host=ctypes.CDLL('LunaHook64').internal_renpy_call_host + internal_renpy_call_host = ctypes.CDLL( + "LunaHook64" + ).internal_renpy_call_host except: - internal_renpy_call_host=ctypes.CDLL('LunaHook32').internal_renpy_call_host - internal_renpy_call_host.argstype=ctypes.c_wchar_p,ctypes.c_int - internal_renpy_call_host.restype=ctypes.c_wchar_p - + internal_renpy_call_host = ctypes.CDLL( + "LunaHook32" + ).internal_renpy_call_host + internal_renpy_call_host.argstype = ctypes.c_wchar_p, ctypes.c_int + internal_renpy_call_host.restype = ctypes.c_wchar_p + try: - _text=text.decode('utf8') + _text = text.decode("utf8") except: - _text=text - text=internal_renpy_call_host(_text,split) + _text = text + text = internal_renpy_call_host(_text, split) except: pass return text + +def callLunaIsUsingEmbed(split): + try: + import ctypes + + try: + internal_renpy_call_is_embed_using = ctypes.CDLL( + "LunaHook64" + ).internal_renpy_call_is_embed_using + except: + internal_renpy_call_is_embed_using = ctypes.CDLL( + "LunaHook32" + ).internal_renpy_call_is_embed_using + internal_renpy_call_is_embed_using.argstype = ctypes.c_int, + internal_renpy_call_is_embed_using.restype = ctypes.c_bool + + return internal_renpy_call_is_embed_using(split) + except: + return False + try: - #6.1.0 + # 6.1.0 import renpy + def hook_initT0(original_init): def new_init(self, *args, **kwargs): - + changed=False if isinstance(args[0], list): - trs = callLunaHost((args[0][0]),1) + trs = [] + for _ in args[0]: + _n=callLunaHost(_, 1) + if _n!=_: + changed=True + trs += [_n] else: - trs = callLunaHost((args[0]),1) - - nargs = (trs,) + args[1:] - if 'text' in kwargs: - kwargs['text'] = nargs[0] - self.mtoolHooked = True + trs = callLunaHost(args[0], 1) + if args[0]!=trs: + changed=True - original_init(self, *nargs, **kwargs) + if changed and callLunaIsUsingEmbed(1): + args = (trs,) + args[1:] + if "text" in kwargs: + kwargs["text"] = trs + + original_init(self, *args, **kwargs) return new_init @@ -45,17 +78,25 @@ try: def hook_init_renderT0(original): def new_init(self, *args, **kwargs): if not hasattr(self, "LunaHooked"): + changed=False if isinstance(self.text, list): - trs = callLunaHost((self.text[0]),2) + trs = [] + for _ in self.text: + _n=callLunaHost(_, 2) + if _n!=_: + changed=True + trs += [_n] else: - trs = callLunaHost((self.text),2) - self.set_text(trs) - self.LunaHooked = True + trs = callLunaHost(self.text, 2) + if self.text!=trs: + changed=True + if changed and callLunaIsUsingEmbed(2): + self.set_text(trs) + self.LunaHooked = True return original(self, *args, **kwargs) return new_init - - + if "original_hook_init_renderT0" not in globals(): original_hook_init_renderT0 = renpy.text.text.Text.render @@ -63,21 +104,21 @@ try: except: pass try: - #4.0 + # 4.0 import renpy + def hook_initT3(original_init): def new_init(self, *args, **kwargs): - trs = callLunaHost(str(args[0]),3) - - nargs = (trs,) + args[1:] - original_init(self, *nargs, **kwargs) + trs = callLunaHost(str(args[0]), 3) + if callLunaIsUsingEmbed(3): + args = (trs,) + args[1:] + original_init(self, *args, **kwargs) return new_init - if "original_Text_init_hookT3" not in globals(): original_Text_init_hookT3 = renpy.exports.Text.__init__ renpy.exports.Text.__init__ = hook_initT3(original_Text_init_hookT3) except: - pass \ No newline at end of file + pass