diff --git a/CMakeLists.txt b/CMakeLists.txt index b05919d..d0718f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,8 @@ if (ANDROID) src/android/nact_android.cpp src/generic/mako.cpp ) - target_link_libraries(system3 PRIVATE SDL2 SDL2_ttf SDL2_mixer ymfm) + find_library(ndk_log log) + target_link_libraries(system3 PRIVATE SDL2 SDL2_ttf SDL2_mixer ymfm ${ndk_log}) elseif (EMSCRIPTEN) add_executable(system3) @@ -216,7 +217,5 @@ if(NINTENDO_SWITCH) ) endif() -target_compile_definitions(system3 PRIVATE - $<$:_DEBUG_CONSOLE> - RESOURCE_PATH="${RESOURCE_PATH}") +target_compile_definitions(system3 PRIVATE RESOURCE_PATH="${RESOURCE_PATH}") target_include_directories(system3 PRIVATE src src/sys) diff --git a/README.md b/README.md index e3e4265..3cec21f 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,9 @@ for translation or other purposes. The available modes are: Suppress text hook on specified scenario pages. _list_ is a comma-separated list of page numbers. +#### `-trace` +Enables trace mode, which prints debug information to the console. + #### `-game` _game_id_ As System1-3 have slight variations depending on the game, `system3` uses the fingerprint of the scenario file (ADISK.DAT) to identify the game being played. diff --git a/src/android/nact_android.cpp b/src/android/nact_android.cpp index 86a6a07..66a6007 100644 --- a/src/android/nact_android.cpp +++ b/src/android/nact_android.cpp @@ -1,4 +1,5 @@ #include +#include #include "nact.h" #include "encoding.h" #include "jnihelper.h" @@ -36,15 +37,12 @@ void NACT::platform_finalize() { } -void NACT::output_console(const char *format, ...) +void NACT::trace(const char *format, ...) { -#if defined(_DEBUG_CONSOLE) va_list ap; - va_start(ap, format); - vfprintf(stdout, format, ap); + __android_log_vprint(ANDROID_LOG_INFO, "system3", format, ap); va_end(ap); -#endif } void NACT::set_skip_menu_state(bool enabled, bool checked) diff --git a/src/config.cpp b/src/config.cpp index 9b25f2d..5a2440a 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -156,6 +156,8 @@ Config::Config(int argc, char *argv[]) else if (strcmp(argv[i], "-debugger") == 0) debugger_mode = parse_debugger_mode(argv[++i]); #endif + else if (strcmp(argv[i], "-trace") == 0) + trace = true; else if (strcmp(argv[i], "-texthook") == 0) texthook_mode = parse_texthook_mode(argv[++i]); else if (strcmp(argv[i], "-texthook_suppress") == 0) @@ -222,6 +224,8 @@ void Config::load_ini() else if (!strcasecmp(key, "debugger")) debugger_mode = parse_debugger_mode(val, lineno); #endif + else if (!strcasecmp(key, "trace")) + trace = to_bool(val, lineno); else if (!strcasecmp(key, "texthook")) texthook_mode = parse_texthook_mode(val, lineno); else if (!strcasecmp(key, "texthook_suppress")) diff --git a/src/config.h b/src/config.h index 315bdfe..b1f830b 100644 --- a/src/config.h +++ b/src/config.h @@ -42,6 +42,7 @@ struct Config { std::string title; int midi_device = -1; bool print_version = false; + bool trace = false; bool use_fm = false; bool no_antialias = false; bool scanline = false; diff --git a/src/debugger/dap_frontend.cpp b/src/debugger/dap_frontend.cpp index eb50d49..e9baded 100644 --- a/src/debugger/dap_frontend.cpp +++ b/src/debugger/dap_frontend.cpp @@ -127,6 +127,25 @@ public: } bool console_output(const char* format, va_list ap) override { + char buf[1024]; + vsnprintf(buf, sizeof(buf), format, ap); + + Json json = { + {"type", "event"}, + {"event", "output"}, + {"body", { + {"output", buf}, + }} + }; + const char *src = symbols.page2src(g_nact->sco.page()); + if (src) + json["body"]["source"] = create_source(src); + int line = symbols.addr2line(g_nact->sco.page(), g_nact->sco.cmd_addr()); + if (line >= 0) + json["body"]["line"] = line; + + send_json(json); + return true; } diff --git a/src/emscripten/nact_emscripten.cpp b/src/emscripten/nact_emscripten.cpp index c40fd4b..d1629dc 100644 --- a/src/emscripten/nact_emscripten.cpp +++ b/src/emscripten/nact_emscripten.cpp @@ -46,15 +46,12 @@ void NACT::platform_finalize() { } -void NACT::output_console(const char *format, ...) +void NACT::trace(const char *format, ...) { -#if defined(_DEBUG_CONSOLE) va_list ap; - va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); -#endif } void NACT::set_skip_menu_state(bool enabled, bool checked) diff --git a/src/generic/nact_generic.cpp b/src/generic/nact_generic.cpp index 340c66a..ac6d704 100644 --- a/src/generic/nact_generic.cpp +++ b/src/generic/nact_generic.cpp @@ -14,25 +14,18 @@ void NACT::platform_finalize() { } -void NACT::output_console(const char *format, ...) +void NACT::trace(const char *format, ...) { + va_list ap; + va_start(ap, format); #ifdef ENABLE_DEBUGGER - if (g_debugger) { - va_list ap; - va_start(ap, format); - bool handled = g_debugger->console_vprintf(format, ap); + if (g_debugger && g_debugger->console_vprintf(format, ap)) { va_end(ap); - if (handled) - return; + return; } #endif -#if defined(_DEBUG_CONSOLE) - va_list ap; - - va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); -#endif } void NACT::set_skip_menu_state(bool enabled, bool checked) diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 602117b..a5949a9 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -283,7 +283,7 @@ void NACT::cmd_calc() } var[index] = cali(); - output_console("\n!var[%d]:%d!", index, var[index]); + TRACE("!var[%d]:%d!", index, var[index]); } void NACT::cmd_label_jump() @@ -291,7 +291,7 @@ void NACT::cmd_label_jump() int next_addr = sco.getw(); sco.jump_to(next_addr); - output_console("\n@%x:", next_addr); + TRACE("@%x:", next_addr); } void NACT::cmd_label_call() @@ -299,7 +299,7 @@ void NACT::cmd_label_call() int next_addr = sco.getw(); sco.label_call(next_addr); - output_console("\n\\%x:", next_addr); + TRACE("\\%x:", next_addr); } void NACT::cmd_page_jump() @@ -307,7 +307,7 @@ void NACT::cmd_page_jump() int next_page = cali(); sco.page_jump(next_page, 2); - output_console("\n&%d:", next_page); + TRACE("&%d:", next_page); } void NACT::cmd_page_call() @@ -315,7 +315,7 @@ void NACT::cmd_page_call() int next_page = cali(); sco.page_call(next_page); - output_console("\n%%%d:", next_page); + TRACE("%%%d:", next_page); } void NACT::cmd_set_menu() @@ -325,7 +325,7 @@ void NACT::cmd_set_menu() ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; - output_console("$"); + TRACE("$"); } else { if (menu_items.empty()) { ags->clear_menu_window(); @@ -339,13 +339,13 @@ void NACT::cmd_set_menu() if (game_id.is_gakuen()) menu_window = 2; - output_console("\n$%x,", menu_items.back().addr); + TRACE("$%x,", menu_items.back().addr); } } void NACT::cmd_open_menu() { - output_console("\n]"); + TRACE("]"); if (menu_items.empty()) { sco.jump_to(sco.default_addr()); @@ -377,7 +377,9 @@ void NACT::cmd_set_verbobj() menu_items.emplace_back(addr, verb, obj); verb_obj = true; - output_console("\n[%x,%s,%s:", addr, caption_verb[verb].c_str(), caption_obj[obj].c_str()); + TRACE("[%x,%s,%s:", addr, + encoding->toUtf8(caption_verb[verb].c_str()).c_str(), + encoding->toUtf8(caption_obj[obj].c_str()).c_str()); } void NACT::cmd_set_verbobj2() @@ -392,14 +394,16 @@ void NACT::cmd_set_verbobj2() } verb_obj = true; - output_console("\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb].c_str(), caption_obj[obj].c_str()); + TRACE(":%d,%x,%s,%s:", condition, addr, + encoding->toUtf8(caption_verb[verb].c_str()).c_str(), + encoding->toUtf8(caption_obj[obj].c_str()).c_str()); } void NACT::cmd_a() { texthook_nextpage(); - output_console("A\n"); + TRACE("A"); if (msgskip->skipping()) { if (msgskip->get_flags() & MSGSKIP_STOP_ON_CLICK && get_key()) @@ -439,7 +443,7 @@ void NACT::cmd_a() void NACT::cmd_f() { - output_console("\nF"); + TRACE("F"); sco.jump_to(2); } @@ -448,7 +452,7 @@ void NACT::cmd_r() { texthook_newline(); - output_console("R\n"); + TRACE("R"); // ウィンドウの表示範囲外の場合は改ページ if(ags->return_text_line(text_window)) { @@ -460,7 +464,7 @@ void NACT::cmd_s() { int page = sco.getd(); - output_console("\nS %d:", page); + TRACE("S %d:", page); if(page) { mako->play_music(page); @@ -473,7 +477,7 @@ void NACT::cmd_x() { int index = sco.getd(); - output_console("\nX %d:", index); + TRACE("X %d:", index); if(1 <= index && index <= 10) { ags->draw_text(tvar[index - 1]); @@ -510,7 +514,7 @@ void NACT::message(uint8_t first_byte) msgskip->on_message(sco.page(), sco.current_addr()); // TODO: Convert hankaku to zenkaku - output_console(buf); + TRACE("%s", encoding->toUtf8(buf).c_str()); } void NACT::text_wait() diff --git a/src/sys/nact.h b/src/sys/nact.h index e24c824..64f1eda 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -83,6 +83,8 @@ #define MAX_VAR 512 #define MAX_STRVAR 10 +#define TRACE(fmt, ...) if (config.trace) trace(fmt "\n", ##__VA_ARGS__) + class AGS; class MAKO; class MsgSkip; @@ -248,8 +250,7 @@ public: std::unique_ptr encoding; Strings strings; - // デバッグログ - void output_console(const char *format, ...); + void trace(const char *format, ...); int get_scenario_page() const { return sco.page(); } uint16 get_var(int index) const { return var[index]; } diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 2c10411..1986dd7 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -213,13 +213,13 @@ void NACT_Sys1::cmd_branch() } } - output_console("\n{%d:", condition); + TRACE("{%d:", condition); } void NACT_Sys1::cmd_open_verb() { // 動詞メニューの表示 - output_console("\nopen verb-obj menu"); + TRACE("open verb-obj menu"); verb_obj = false; // 表示する動詞のチェック @@ -420,7 +420,7 @@ void NACT_Sys1::cmd_g() { int page = sco.getd(); - output_console("\nG %d:", page); + TRACE("G %d:", page); if (game_id.crc32_a == CRC32_INTRUDER) { page = (page == 97) ? 96 : (page == 98) ? 97 : page; @@ -469,7 +469,7 @@ void NACT_Sys1::cmd_l() { int index = sco.getd(); - output_console("\nL %d:", index); + TRACE("L %d:", index); if (1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT @@ -501,7 +501,7 @@ void NACT_Sys1::cmd_p() ags->text_font_color = (uint8)((param & 0x7) + 16); - output_console("\nP %d:", param); + TRACE("P %d:", param); } void NACT_Sys1::cmd_q() @@ -518,7 +518,7 @@ void NACT_Sys1::cmd_q() int index = sco.getd(); - output_console("\nQ %d:", index); + TRACE("Q %d:", index); if (1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT @@ -537,7 +537,7 @@ void NACT_Sys1::cmd_u() int page = sco.getd(); int transparent = sco.getd(); - output_console("\nU %d,%d:", page, transparent); + TRACE("U %d,%d:", page, transparent); if (game_id.crc32_a == CRC32_INTRUDER) { ags->load_cg(page, 11); @@ -567,7 +567,7 @@ void NACT_Sys1::cmd_y() int cmd = cali(); int param = cali(); - output_console("\nY %d,%d:", cmd, param); + TRACE("Y %d,%d:", cmd, param); if (game_id.crc32_a == CRC32_INTRUDER) { switch(cmd) { @@ -770,7 +770,7 @@ void NACT_Sys1::cmd_z() int cmd = cali(); int param = cali(); - output_console("\nZ %d,%d:", cmd, param); + TRACE("Z %d,%d:", cmd, param); switch (game_id.crc32_a) { case CRC32_INTRUDER: diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index 7cc27f6..98b901c 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -245,13 +245,13 @@ void NACT_Sys2::cmd_branch() } } - output_console("\n{%d:", condition); + TRACE("{%d:", condition); } void NACT_Sys2::cmd_open_verb() { // 動詞メニューの表示 - output_console("\nopen verb-obj menu"); + TRACE("open verb-obj menu"); verb_obj = false; // 表示する動詞のチェック @@ -361,7 +361,7 @@ void NACT_Sys2::cmd_b() int p4 = cali(); int p5 = cali(); - output_console("\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); + TRACE("B %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); if(cmd == 1) { if (game_id.crc32_a == CRC32_AYUMI_FD || game_id.crc32_a == CRC32_AYUMI_HINT || game_id.crc32_a == CRC32_DRSTOP) { @@ -438,7 +438,7 @@ void NACT_Sys2::cmd_d() int p7 = cali(); int p8 = cali(); - output_console("\nD %d,%d,%d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6, p7, p8); + TRACE("D %d,%d,%d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6, p7, p8); } void NACT_Sys2::cmd_e() @@ -447,14 +447,14 @@ void NACT_Sys2::cmd_e() int p2 = cali(); int p3 = cali(); - output_console("\nE %d,%d,%d:", p1, p2, p3); + TRACE("E %d,%d,%d:", p1, p2, p3); } void NACT_Sys2::cmd_g() { int page = cali(); - output_console("\nG %d:", page); + TRACE("G %d:", page); if (game_id.crc32_a == CRC32_SDPS && (game_id.crc32_b == CRC32_SDPS_TONO || game_id.crc32_b == CRC32_SDPS_KAIZOKU)) { if(20 <= page && page <= 100) { @@ -479,7 +479,7 @@ void NACT_Sys2::cmd_h() int length = sco.getd(); int val = cali(); - output_console("\nH %d,%d:", length, val); + TRACE("H %d,%d:", length, val); // 8桁の文字列を生成 char tmp[8]; @@ -522,7 +522,7 @@ void NACT_Sys2::cmd_i() // int p3 = sco.getd(); int p3 = cali(); - output_console("\nI %d,%d,%d:", p1, p2, p3); + TRACE("I %d,%d,%d:", p1, p2, p3); } void NACT_Sys2::cmd_j() @@ -530,7 +530,7 @@ void NACT_Sys2::cmd_j() int p1 = cali(); int p2 = cali(); - output_console("\nJ %d,%d:", p1, p2); + TRACE("J %d,%d:", p1, p2); } void NACT_Sys2::cmd_k() @@ -543,7 +543,7 @@ void NACT_Sys2::cmd_l() { int index = sco.getd(); - output_console("\nL %d:", index); + TRACE("L %d:", index); if (1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT @@ -568,7 +568,7 @@ void NACT_Sys2::cmd_m() string[p] = '\0'; } - output_console("\nM %s:", string); + TRACE("M %s:", encoding->toUtf8(string).c_str()); if(1 <= tvar_index && tvar_index <= 10) { memcpy(tvar[tvar_index - 1], string, 33); @@ -580,7 +580,7 @@ void NACT_Sys2::cmd_n() int p1 = cali(); int p2 = cali(); - output_console("\nN %d,%d:", p1, p2); + TRACE("N %d,%d:", p1, p2); } void NACT_Sys2::cmd_o() @@ -589,7 +589,7 @@ void NACT_Sys2::cmd_o() int width = cali(); int height = cali(); - output_console("\nO %d,%d,%d:", st, width, height); + TRACE("O %d,%d,%d:", st, width, height); #if 0 // white mesh @@ -607,7 +607,7 @@ void NACT_Sys2::cmd_p() ags->text_font_color = (uint8)((param & 0x7) + 16); } - output_console("\nP %d:", param); + TRACE("P %d:", param); } void NACT_Sys2::cmd_q() @@ -624,7 +624,7 @@ void NACT_Sys2::cmd_q() int index = sco.getd(); - output_console("\nQ %d:", index); + TRACE("Q %d:", index); if (1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT @@ -639,7 +639,7 @@ void NACT_Sys2::cmd_t() int p2 = cali(); int p3 = cali(); - output_console("\nT %d,%d,%d:", p1, p2, p3); + TRACE("T %d,%d,%d:", p1, p2, p3); } void NACT_Sys2::cmd_u() @@ -654,7 +654,7 @@ void NACT_Sys2::cmd_u() transparent = sco.getd(); } - output_console("\nU %d,%d:", page, transparent); + TRACE("U %d,%d:", page, transparent); ags->load_cg(page, transparent); } @@ -692,7 +692,7 @@ void NACT_Sys2::cmd_v() int p28 = cali(); int p29 = cali(); - output_console("\nV %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d:", + TRACE("V %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d:", cmd, p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29); } @@ -703,7 +703,7 @@ void NACT_Sys2::cmd_w() int ex = cali(); int ey = cali(); - output_console("\nW %d,%d,%d,%d:", sx, sy, ex, ey); + TRACE("W %d,%d,%d,%d:", sx, sy, ex, ey); ags->draw_mesh(sx, sy, ex - sx, ey - sy); } @@ -713,7 +713,7 @@ void NACT_Sys2::cmd_y() int cmd = cali(); int param = cali(); - output_console("\nY %d,%d:", cmd, param); + TRACE("Y %d,%d:", cmd, param); switch(cmd) { case 1: @@ -865,7 +865,7 @@ void NACT_Sys2::cmd_z() int cmd = cali(); int param = cali(); - output_console("\nZ %d,%d:", cmd, param); + TRACE("Z %d,%d:", cmd, param); // Z1 // Z2 diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index bdacf92..98799aa 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -25,13 +25,13 @@ void NACT_Sys3::cmd_branch() // sigmarion3 最適化誤爆の対策 sco.jump_to(condition ? t_addr : f_addr); - output_console("\n{%d: T:%4x, F:%4x", condition, t_addr, f_addr); + TRACE("{%d: T:%4x, F:%4x", condition, t_addr, f_addr); } void NACT_Sys3::cmd_open_verb() { // 動詞メニューの表示 - output_console("\nopen verb-obj menu"); + TRACE("open verb-obj menu"); verb_obj = false; // 表示する動詞のチェック @@ -141,7 +141,7 @@ void NACT_Sys3::cmd_b() int p4 = cali(); int p5 = cali(); - output_console("\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); + TRACE("B %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); if(cmd == 1) { // あゆみちゃん物語 @@ -214,7 +214,7 @@ void NACT_Sys3::cmd_e() int ex = cali(); int ey = cali(); - output_console("\nE %d,%d,%d,%d,%d,%d:", index, color, sx, sy, ex, ey); + TRACE("E %d,%d,%d,%d,%d,%d:", index, color, sx, sy, ex, ey); ags->box[index - 1].color = color; ags->box[index - 1].sx = column ? sx * 8 : sx; @@ -227,7 +227,7 @@ void NACT_Sys3::cmd_g() { int page = cali(); - output_console("\nG %d:", page); + TRACE("G %d:", page); ags->load_cg(page, -1); } @@ -237,7 +237,7 @@ void NACT_Sys3::cmd_h() int length = sco.getd(); int val = cali(); - output_console("\nH %d,%d:", length, val); + TRACE("H %d,%d:", length, val); // 隠しコマンド? if(length >= 9) { @@ -288,7 +288,7 @@ void NACT_Sys3::cmd_i() int dx = cali(); int dy = cali(); - output_console("\nI %d,%d,%d,%d,%d,%d:", sx, sy, ex, ey, dx, dy); + TRACE("I %d,%d,%d,%d,%d,%d:", sx, sy, ex, ey, dx, dy); // X方向はカラム単位で切り捨て sx = column ? sx * 8 : sx & 0xfff8; @@ -302,7 +302,7 @@ void NACT_Sys3::cmd_j() int x = cali(); int y = cali(); - output_console("\nJ %d,%d:", x, y); + TRACE("J %d,%d:", x, y); // x方向はカラム単位で切り捨て ags->cg_dest_x = column ? x * 8 : x & 0xfff8; @@ -314,7 +314,7 @@ void NACT_Sys3::cmd_k() { int cmd = sco.getd(), val; - output_console("\nK %d:", cmd); + TRACE("K %d:", cmd); // K6の場合は、すぐに返る if(cmd == 6) { @@ -404,7 +404,7 @@ void NACT_Sys3::cmd_l() { int index = cali(); - output_console("\nL %d:", index); + TRACE("L %d:", index); if (index == 0) { // 特殊セーブ @@ -454,7 +454,7 @@ void NACT_Sys3::cmd_m() string[p] = '\0'; } - output_console("\nM %s:", string); + TRACE("M %s:", encoding->toUtf8(string).c_str()); if(1 <= tvar_index && tvar_index <= 10) { memcpy(tvar[tvar_index - 1], string, 22); @@ -477,7 +477,7 @@ void NACT_Sys3::cmd_n() int src = cali(); int dest = cali(); - output_console("\nN %d,%d,%d:", cmd, src, dest); + TRACE("N %d,%d,%d:", cmd, src, dest); } void NACT_Sys3::cmd_o() @@ -502,7 +502,7 @@ void NACT_Sys3::cmd_o() B15 = (val & 0x4000) ? 1 : 0; B16 = (val & 0x8000) ? 1 : 0; - output_console("\nO %d,%d:", cmd, val); + TRACE("O %d,%d:", cmd, val); } else { uint16 val = 0; val |= B01 ? 0x0001 : 0; @@ -524,7 +524,7 @@ void NACT_Sys3::cmd_o() int index = cali2(); var[index] = val; - output_console("\nO %d,var[%d]:", cmd, index); + TRACE("O %d,var[%d]:", cmd, index); } } @@ -535,7 +535,7 @@ void NACT_Sys3::cmd_p() int g = cali(); int b = cali(); - output_console("\nP %d,%d,%d,%d:", index, r, g, b); + TRACE("P %d,%d,%d,%d:", index, r, g, b); ags->set_palette(index, r, g, b); set_palette = true; @@ -567,7 +567,7 @@ void NACT_Sys3::cmd_q() int index = cali(); - output_console("\nQ %d:", index); + TRACE("Q %d:", index); if (index == 0) { // 特殊セーブ @@ -594,7 +594,7 @@ void NACT_Sys3::cmd_t() int x = cali(); int y = cali(); - output_console("\nT %d,%d:", x, y); + TRACE("T %d,%d:", x, y); // x方向はカラム単位で切り捨て ags->text_dest_x = column ? x * 8 : x & 0xfff8; @@ -606,7 +606,7 @@ void NACT_Sys3::cmd_u() int page = cali(); int transparent = cali(); - output_console("\nU %d,%d:", page, transparent); + TRACE("U %d,%d:", page, transparent); if (game_id.is_rance4x()) { transparent = (transparent == 28) ? 12 : transparent; @@ -619,7 +619,7 @@ void NACT_Sys3::cmd_v() int cmd = cali(); int index = cali(); - output_console("\nV %d,%d:", cmd, index); + TRACE("V %d,%d:", cmd, index); if(cmd == 0) { for(int i = 0; i < 20; i++) { @@ -644,7 +644,7 @@ void NACT_Sys3::cmd_w() int y = cali(); uint8 color = (uint8)cali(); - output_console("\nW %d,%d,%d", x, y, color); + TRACE("W %d,%d,%d", x, y, color); ags->paint(x, y, color); } @@ -654,7 +654,7 @@ void NACT_Sys3::cmd_y() int cmd = cali(); int param = cali(); - output_console("\nY %d,%d:", cmd, param); + TRACE("Y %d,%d:", cmd, param); switch(cmd) { case 1: @@ -1018,7 +1018,7 @@ void NACT_Sys3::cmd_z() int cmd = cali(); int param = cali(); - output_console("\nZ %d,%d:", cmd, param); + TRACE("Z %d,%d:", cmd, param); if(cmd == 0) { ags->palette_bank = (uint8)(param & 0xff); diff --git a/src/win/nact_win.cpp b/src/win/nact_win.cpp index 4796b8a..def4a00 100644 --- a/src/win/nact_win.cpp +++ b/src/win/nact_win.cpp @@ -45,6 +45,8 @@ void init_console(int sys_ver) freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); freopen("CONIN$", "r", stdin); + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); char title[] = "SYSTEM1 Debug Console"; title[6] = '0' + sys_ver; SetConsoleTitle(title); @@ -135,39 +137,28 @@ void NACT::text_dialog() void NACT::platform_initialize() { init_menu(mouse_move_enabled, config); -#ifndef _DEBUG_CONSOLE - if (config.debugger_mode == DebuggerMode::CLI) -#endif + if (config.trace && config.debugger_mode != DebuggerMode::DAP) init_console(game_id.sys_ver); SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); } void NACT::platform_finalize() { -#if defined(_DEBUG_CONSOLE) FreeConsole(); -#endif } -void NACT::output_console(const char *format, ...) +void NACT::trace(const char *format, ...) { + va_list ap; + va_start(ap, format); #ifdef ENABLE_DEBUGGER - if (g_debugger) { - va_list ap; - va_start(ap, format); - bool handled = g_debugger->console_vprintf(format, ap); + if (g_debugger && g_debugger->console_vprintf(format, ap)) { va_end(ap); - if (handled) - return; + return; } #endif -#if defined(_DEBUG_CONSOLE) - va_list ap; - - va_start(ap, format); vfprintf(stdout, format, ap); va_end(ap); -#endif } void NACT::set_skip_menu_state(bool enabled, bool checked) diff --git a/system3.ini.example b/system3.ini.example index 0e9fa75..3b628f1 100644 --- a/system3.ini.example +++ b/system3.ini.example @@ -46,6 +46,9 @@ texthook = none ; The example below is for Rance 4.1, to filter out system messages. ;texthook_suppress = 2,7 +; Enables trace mode, which prints debug information to the console. +;trace = true + ; The [string] section allows you to override Japanese text embedded in the ; game engine. The values below are the original Japanese text. [string]