From 0187d0f216bf3a58dcfe1acb86811120f4fc483b Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 28 Nov 2025 10:40:53 +0900 Subject: [PATCH] System3: Implement CD availability check The `Y14,2:` command (`Y20,2:` in Gakuen KING) now returns zero if CD audio is not available (i.e. playlist is not loaded). --- src/emscripten/mako.cpp | 5 +++++ src/generic/mako.cpp | 4 ++++ src/sys/mako.h | 1 + src/sys/nact_sys3.cpp | 11 +++++++++-- src/win/mako.cpp | 5 +++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/emscripten/mako.cpp b/src/emscripten/mako.cpp index ab83857..584dba7 100644 --- a/src/emscripten/mako.cpp +++ b/src/emscripten/mako.cpp @@ -151,6 +151,11 @@ bool MAKO::check_pcm() return EM_ASM_INT({ return xsystem35.audio.pcm_isplaying(0); }); } +bool MAKO::is_cd_available() const +{ + return EM_ASM_INT({ return xsystem35.cdPlayer.hasAudioTrack(); }); +} + extern "C" { EMSCRIPTEN_KEEPALIVE diff --git a/src/generic/mako.cpp b/src/generic/mako.cpp index f4b2735..c07d950 100644 --- a/src/generic/mako.cpp +++ b/src/generic/mako.cpp @@ -245,3 +245,7 @@ bool MAKO::check_pcm() return Mix_Playing(-1) != 0; } +bool MAKO::is_cd_available() const +{ + return !playlist.empty(); +} diff --git a/src/sys/mako.h b/src/sys/mako.h index cb387fe..0d3bb1f 100644 --- a/src/sys/mako.h +++ b/src/sys/mako.h @@ -40,6 +40,7 @@ public: bool check_pcm(); void set_cd_track(int num, int track) { cd_track[num] = track; } + bool is_cd_available() const; #ifdef _WIN32 void select_sound(BGMDevice dev); diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index e727e8a..ca515c7 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -785,8 +785,12 @@ void NACT_Sys3::exec_y(int cmd, int param) text_wait_time = (param - 1) * 1000 / 60; } break; - case 14: - RND = 1; + case 14: // audio device check + if (param == 2) { + RND = mako->is_cd_available() ? 1 : 0; + } else { + RND = 1; + } break; case 15: break; @@ -1402,6 +1406,9 @@ public: TRACE("Y %d,%d:", cmd, param); switch (cmd) { + case 20: // audio device check + exec_y(14, param); + break; case 25: ags->menu.back_color = ags->text.back_color = (param == 1 || param == 2) ? 0 : 1; // text_window = param; diff --git a/src/win/mako.cpp b/src/win/mako.cpp index df6387a..6a79aff 100644 --- a/src/win/mako.cpp +++ b/src/win/mako.cpp @@ -465,6 +465,11 @@ bool MAKO::check_pcm() return !PlaySound(null_wav, NULL, SND_ASYNC | SND_MEMORY | SND_NOSTOP); } +bool MAKO::is_cd_available() const +{ + return !playlist.empty(); +} + void MAKO::on_mci_notify(const SDL_SysWMmsg* msg) { if (!music)