From cae401602bd6659602dc044260f9c16e5fd4d1bd Mon Sep 17 00:00:00 2001 From: PencilMario Date: Sat, 27 Dec 2025 16:08:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=AC=E4=B8=BA=E8=A7=92=E8=89=B2=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/Submods/MAICA_MTTSubmod/main.rpy | 26 ++++++---- .../MAICA_MTTSubmod/override_mcharacter.rpy | 5 -- .../override_mcharacter_callback.rpy | 52 +++++++++++++++++++ game/Submods/MAICA_MTTSubmod/status.rpy | 7 ++- 4 files changed, 73 insertions(+), 17 deletions(-) delete mode 100644 game/Submods/MAICA_MTTSubmod/override_mcharacter.rpy create mode 100644 game/Submods/MAICA_MTTSubmod/override_mcharacter_callback.rpy diff --git a/game/Submods/MAICA_MTTSubmod/main.rpy b/game/Submods/MAICA_MTTSubmod/main.rpy index 86b6110..6331400 100644 --- a/game/Submods/MAICA_MTTSubmod/main.rpy +++ b/game/Submods/MAICA_MTTSubmod/main.rpy @@ -85,19 +85,22 @@ init -100 python: return "微笑" # 无匹配时返回 None init python: persistent.mtts["_chat_installed"] = store.mas_submod_utils.isSubmodInstalled("MAICA Blessland") -init python: +init -1 python: import MTTS old_renpysay = renpy.say store.mtts = mtts PY2, PY3 = MTTS.PY2, MTTS.PY3 - def mtts_say(who, what, interact=True, *args, **kwargs): + import time + def mtts_available(): if not renpy.seen_label("mtts_greeting"): store.mtts_status = renpy.substitute(_("未解锁")) - return old_renpysay(who, what, interact, *args, **kwargs) + return False# old_renpysay(who, what, interact, *args, **kwargs) if not persistent.mtts["enabled"] and persistent.mtts["_outdated"] and not store.mtts.mtts.is_accessable: store.mtts_status = renpy.substitute(_("未启用/未更新/服务不可用")) - return old_renpysay(who, what, interact, *args, **kwargs) + return False# old_renpysay(who, what, interact, *args, **kwargs) + return True + def mtts_generate_sound(what): def process_str(srt): import re # \{fast\}.*?\{fast\} , \{.*?\} 将匹配的str替换为空字符串 @@ -110,7 +113,7 @@ init python: store.mtts_match_rule = rule.get('name', 'Default') if not rule['action']: store.mtts_status = renpy.substitute(_("未匹配任何规则/规则为空action")) - return old_renpysay(who, what, interact, *args, **kwargs) + return# old_renpysay(who, what, interact, *args, **kwargs) if rule['name'] == 'MAICA_Chat': target_lang = store.maica.maica.target_lang else: @@ -122,15 +125,16 @@ init python: res = mtts.AsyncTask(mtts.mtts.generate, text=text, label_name=store.mas_submod_utils.current_label, emotion=exp, target_lang=target_lang) name = mtts.mtts.cache.get_cachename(text = text, label_name=store.mas_submod_utils.current_label) while not res.is_finished: - old_renpysay(who, "...{w=0.3}{nw}", interact, *args, **kwargs) - _history_list.pop() + time.sleep(0.1) + #old_renpysay(who, "...{w=0.3}{nw}", interact, *args, **kwargs) + #_history_list.pop() if res.is_success: res = res.result if res.is_success(): store.mtts_status = renpy.substitute(_("播放中")) renpy.music.set_volume(persistent.mtts["volume"], channel="voice") - renpy.music.play( - store.AudioData(res.data, name),#os.path.join(mtts.mtts.cache_path, "test.ogg"), + renpy.music.queue( + store.MASAudioData(res.data, name),#os.path.join(mtts.mtts.cache_path, "test.ogg"), channel="voice", ) else: @@ -140,6 +144,6 @@ init python: store.mtts_status = renpy.substitute(_("待机")) - old_renpysay(who, what, interact, *args, **kwargs) + #old_renpysay(who, what, interact, *args, **kwargs) - renpy.say = mtts_say \ No newline at end of file + #renpy.say = mtts_say \ No newline at end of file diff --git a/game/Submods/MAICA_MTTSubmod/override_mcharacter.rpy b/game/Submods/MAICA_MTTSubmod/override_mcharacter.rpy deleted file mode 100644 index 12f8ea7..0000000 --- a/game/Submods/MAICA_MTTSubmod/override_mcharacter.rpy +++ /dev/null @@ -1,5 +0,0 @@ -#init python: -# m2 = DynamicCharacter('m_name', image='monika', what_prefix='', what_suffix='', ctc="ctc", ctc_position="fixed", show_function=store.mas_core.show_display_say) -# -#init 1 python: -# m = m2 \ No newline at end of file diff --git a/game/Submods/MAICA_MTTSubmod/override_mcharacter_callback.rpy b/game/Submods/MAICA_MTTSubmod/override_mcharacter_callback.rpy new file mode 100644 index 0000000..5d132be --- /dev/null +++ b/game/Submods/MAICA_MTTSubmod/override_mcharacter_callback.rpy @@ -0,0 +1,52 @@ +init python: + # 条件显示的角色回调 + # 这个回调会在显示对话前检查条件,如果条件不满足则暂停直到条件满足 + import MTTS + def cb_mtts_monika(event, interact=True, what=None, **kwargs): + """ + 条件显示回调函数 + + 参数: + - event: 回调事件类型 + - interact: 是否发生交互 + - condition_check: 一个返回布尔值的可调用对象,检查是否应该显示对话 + - **kwargs: 其他回调参数 + """ + if not interact: + return + #log所有入参: + store.mas_submod_utils.submod_log.debug("event: {}, interact: {}, what: {}, kwargs: {}".format(event, interact, what, kwargs)) + # 在"show"事件时检查条件 + if event == "show": + if what == None: + what = renpy.last_say().what + # 如果条件不满足,暂停直到条件满足 + if what and mtts_available(): + store.mtts_saying_what = what + sound_thread = mtts.AsyncTask(mtts_generate_sound, what) + while not sound_thread.is_finished: + renpy.pause(0.1) + if sound_thread.exception: + raise sound_thread.exception + + + monika_callbacks_list = [] + monika_callbacks_list.append(cb_mtts_monika) + + def cb_monika(*args, **kwargs): + for cb in monika_callbacks_list: + cb(*args, **kwargs) + + +init 1 python: + monika_callbacks_list.append(slow_nodismiss) + + @store.mas_submod_utils.functionplugin("ch30_preloop", priority=900) + def override_mcb(): + m.display_args['callback'] = cb_monika + + #m2 = DynamicCharacter('m_name', image='monika', what_prefix='', what_suffix='', ctc="ctc", ctc_position="fixed", show_function=store.mas_core.show_display_say, callback=cb_mtts_monika) + #config.all_character_callbacks.append(cb_mtts_monika) + #m.display_args['callback'] = cb_mtts_monika +#init 1 python: +# m = m2 \ No newline at end of file diff --git a/game/Submods/MAICA_MTTSubmod/status.rpy b/game/Submods/MAICA_MTTSubmod/status.rpy index 082dffd..9b35008 100644 --- a/game/Submods/MAICA_MTTSubmod/status.rpy +++ b/game/Submods/MAICA_MTTSubmod/status.rpy @@ -5,6 +5,8 @@ init -1 python: store.mtts_status = renpy.substitute(_("待机")) if not hasattr(store, "mtts_match_rule"): store.mtts_match_rule = renpy.substitute(_("未知")) + if not hasattr(store, "mtts_saying_what"): + store.mtts_saying_what = renpy.substitute(_("未知")) # default store.mtts_status = renpy.substitute(_("待机")) # quick functions to enable disable the mouse tracker def maicatts_enableWorkLoadScreen(): @@ -31,7 +33,7 @@ screen maicatts_stat_lite(): fixed: frame: xsize 619 - xoffset 5 yoffset 450 + xoffset 5 yoffset 250 background "mod_assets/console/cn_frame_stats.png" has vbox hbox: @@ -44,5 +46,8 @@ screen maicatts_stat_lite(): hbox: text _("匹配规则: [store.mtts_match_rule]"): size 15 + hbox: + text _("输出文本([store.mtts.matcher._count_content_chars(store.mtts_saying_what)]): [store.mtts_saying_what]"): + size 15