バグ:副音声でのBGM再生とゲームオーバー

Issue #571 resolved
暗黒 騎士 created an issue

副音声でBGMを鳴らしている時に全滅するとゲームオーバー画面でも鳴りっぱなしになっています。 それ自体はどちらでもいいように思うのですが(演出に使える場合もあると思いますし)、そこで「続ける」を押して宿に戻った場合でも鳴りっぱなしになり(100%再現)、その後操作不能になる(再現しない場合もある?ログ出力なし)ようです。

issue #490、b3e9200の判断を見るに同じく初期化するか、Classicスキン側で止めるなどした方がいいように思いますが、どうでしょうか。

また、副音声でBGMを鳴らしている状態でゲームオーバー・F9すると主音声も含めてそのまま多重に鳴り続ける場合があるようです(安定再現せず)

https://bitbucket.org/akkw/cardwirthpy-reboot/downloads/WSN%E7%89%88%E6%A4%9C%E8%A8%BC.wsn

WSN音声関連>副音声でBGMを再生しつつゲームオーバーした場合

Comments (12)

  1. k4nagatsuki repo owner
    • pull request #2005
    • pull request #2006

    ありがとうございます。Classicにかぎらず全てのスキンで問題が起き、しかもスキンの構造上自動アップデートが難しいので、ゲームオーバー時に停止処理を入れました。

    しかし操作不能になるとかF9でBGMが止まらないというのは再現できず不明です。一応F9の方にも停止処理を追加しておきましたが、別の原因があった場合は効果がないかもしれません。

  2. 暗黒 騎士 reporter

    副音声については修正を確認しました。 ただ、JUDGMENTの戦闘曲だと依然として主音声の再生が止まらない場合があるようです。(OGGの問題?)

    ゲームオーバー後「続ける」後の操作不能については、どうも副音声関係なく再現するようです(修正版でも上記シナリオで100%再現)。 症状としては厳密には設定ダイアログやメッセージログを左クリックしたり右クリックで宿から出たりは有効で、カードにポインタを合わせても反転しないしクリックできないということになるようです。

    パターンを色々変えてみたところ「開始イベントで全滅している」のが不味いのかなと思ったのですがそちらで再現しないとなると微妙ですね。

    不要かと思いますが一応あげ直しました。

    https://bitbucket.org/akkw/cardwirthpy-reboot/downloads/WSN%E7%89%88%E6%A4%9C%E8%A8%BC.wsn

    • 戦闘関連>開始イベントでゲームオーバーするとカードがクリックできなくなる
    • 戦闘関連>毎ラウンドイベントでゲームオーバー後続けるとBGMが残る(JUDGMENTで再現)
  3. 暗黒 騎士 reporter

    追記:すいません、説明文がごっちゃになっていますね。正しくは以下の通りです。

    • 戦闘関連>開始イベントでゲームオーバー後「続ける」とカードがクリックできなくなる
    • 戦闘関連>毎ラウンドイベントで全滅するとBGMが残る(JUDGMENTで再現)
  4. k4nagatsuki repo owner

    バトル開始からの全滅に関しては、余計な代入があった事が原因でした。pull request #2008

    BGMが残る問題は依然再現できません。BGM停止の処理自体が動いていないのでしょうか、それとも停止処理BASS_ChannelStop()が動いているにもかかわらず止まっていないのでしょうか?

  5. 暗黒 騎士 reporter

    バトル開始全滅後カードを選択出来なくなる件の修正を確認しました。

    BGMが残る件に関連性があるかは不明ですが、DefOver.midとDefbattle,oggが同時に再生されている状態でスキンを変えたらどうなるか試そうと数回変更を繰り返したところ、以下のようになり操作不能、終了でログが出力されました。音声の方はスキンを変えても変わらず二重に流れ続けていました。

    https://bitbucket.org/akkw/cardwirthpy-reboot/downloads/SS3.png

    Version : 2.1 / 2017-09-16 22:48:02
    DateTime: 2017-09-16 23:15:51
    Traceback (most recent call last):
      File "cw\thread.pyo", line 732, in run
      File "cw\thread.pyo", line 762, in _run
      File "cw\thread.pyo", line 771, in main_loop
      File "cw\eventhandler.pyo", line 96, in run
      File "cw\eventhandler.pyo", line 281, in lclick_event
      File "cw\sprite\statusbar.pyo", line 1076, in lclick_event
      File "cw\battle.pyo", line 96, in start
      File "cw\battle.pyo", line 384, in defeat
      File "cw\thread.pyo", line 2130, in set_gameover
      File "cw\thread.pyo", line 3100, in change_area
      File "cw\data.pyo", line 542, in start_event
      File "cw\event.pyo", line 569, in start
      File "cw\event.pyo", line 758, in start
      File "cw\event.pyo", line 818, in run
      File "cw\event.pyo", line 1014, in action
      File "cw\content.pyo", line 3670, in action
      File "cw\thread.pyo", line 1703, in show_message
      File "cw\eventhandler.pyo", line 735, in run
      File "cw\eventhandler.pyo", line 783, in lclick_event
      File "cw\sprite\statusbar.pyo", line 1231, in lclick_event
      File "cw\eventhandler.pyo", line 388, in f2key_event
      File "cw\thread.pyo", line 1519, in call_modaldlg
      File "cw\thread.pyo", line 771, in main_loop
      File "cw\eventhandler.pyo", line 113, in run
      File "cw\eventhandler.pyo", line 626, in executing_event
      File "cw\thread.pyo", line 431, in update_skin
      File "cw\data.pyo", line 542, in start_event
      File "cw\event.pyo", line 567, in start
      File "cw\event.pyo", line 818, in run
      File "cw\event.pyo", line 1014, in action
      File "cw\content.pyo", line 3670, in action
      File "cw\thread.pyo", line 1703, in show_message
      File "cw\eventhandler.pyo", line 735, in run
      File "cw\eventhandler.pyo", line 783, in lclick_event
      File "cw\sprite\statusbar.pyo", line 1231, in lclick_event
      File "cw\eventhandler.pyo", line 388, in f2key_event
      File "cw\thread.pyo", line 1519, in call_modaldlg
      File "cw\thread.pyo", line 771, in main_loop
      File "cw\eventhandler.pyo", line 113, in run
      File "cw\eventhandler.pyo", line 626, in executing_event
      File "cw\thread.pyo", line 431, in update_skin
      File "cw\data.pyo", line 542, in start_event
      File "cw\event.pyo", line 567, in start
      File "cw\event.pyo", line 818, in run
      File "cw\event.pyo", line 1014, in action
      File "cw\content.pyo", line 3670, in action
      File "cw\thread.pyo", line 1703, in show_message
      File "cw\eventhandler.pyo", line 735, in run
      File "cw\eventhandler.pyo", line 783, in lclick_event
      File "cw\sprite\statusbar.pyo", line 1231, in lclick_event
      File "cw\eventhandler.pyo", line 388, in f2key_event
      File "cw\thread.pyo", line 1519, in call_modaldlg
      File "cw\thread.pyo", line 771, in main_loop
      File "cw\eventhandler.pyo", line 113, in run
      File "cw\eventhandler.pyo", line 626, in executing_event
      File "cw\thread.pyo", line 431, in update_skin
      File "cw\data.pyo", line 542, in start_event
      File "cw\event.pyo", line 567, in start
      File "cw\event.pyo", line 818, in run
      File "cw\event.pyo", line 1014, in action
      File "cw\content.pyo", line 3670, in action
      File "cw\thread.pyo", line 1695, in show_message
      File "cw\thread.pyo", line 1023, in update
      File "cw\thread.pyo", line 1042, in update_groups
      File "pygame\sprite.pyo", line 462, in update
      File "cw\sprite\message.pyo", line 791, in update
    ValueError: <SelectionBar DirtySprite(in 1 groups)> is not in list
    
  6. k4nagatsuki repo owner

    pull request #2009

    ゲームオーバー画面でのスキン変更の問題を修正しました。

    BGMが停止しない問題は、停止処理が呼び出されていないという事でしょうか。それともDLLの問題でしょうか。bass.dllを最新版にアップデートする等しても再現するのでしょうか?

  7. 暗黒 騎士 reporter

    多分原因がわかりました。#557の検証で005.6mg_Aspirin_Stereo_V1.2_Bank.sf2を一覧から削除していたのですが、それがいけなかったようです。うーん、(CWフォルダにある)KDrumとGeneralUser GSにはチェックがついているため「サウンドフォントで鳴らしているから問題はない」と思ったのですが……何にせよこちらの設定不備が原因なら申し訳ないです。

    すいませんが、呼び出し有無の特定の仕方がわかりませんでした。DLLを入れ替えても再現します。

  8. k4nagatsuki repo owner

    すみません、SDL mixerに切り替わっている可能性には気づくべきでした。しかしそれで試してもこちらでは再現できないところを見ると、依然超常現象のたぐいのようです。

    すいませんが、呼び出し有無の特定の仕方がわかりませんでした。

    以下は今回の件に限らないデバッグ一般の話です。

    • 問題の関数名が分かっているのであれば、検索で該当箇所を見つける事ができます。IDEを使っているなら検索機能があるはずです。そうでない場合は、Grep機能を持つテキストエディタを使うのが一番簡単だと思います。
    • 問題の関数の呼び出し直前にprint文を置けば、その出力の有無でその関数が実行されているかどうかを確認する事ができます。直後にも置けば、関数が無事に帰ってきているかどうかも確認できます。
    • IDEなどでデバッガを使える環境にあれば、問題の箇所にブレークポイントを置くのが一番手っ取り早いです。
  9. k4nagatsuki repo owner

    やはり、BASS Audioが使えない状態になっても、SDL mixerは実行されないようにした方がよさそうですね。

    そうすれば、無音になる事で、設定が間違っている事がすぐに分かります。警告を出してもいいでしょう。

    2.1リリース後に実施する事にします。

  10. 暗黒 騎士 reporter

    どうも移動や削除などで「存在しないサウンドフォント」に一つでもチェックがあると 他に有効なサウンドフォントにチェックが付いていてもSDLに切り替わってしまうようです。 恐らく#557の方も移動を繰り返していたはずなので問題の一因になってたんじゃないかと思います。

    問題の関数名が分かっているのであれば

    BASS_ChannelStop直前にprint channel等は昨日試していたのですが、 プリント文ではBASSを正しく呼び出せているか、正しい出力が返ってきているかっていうのは判断できないのでは?という感じでした。

  11. k4nagatsuki repo owner

    どうも移動や削除などで「存在しないサウンドフォント」に一つでもチェックがあると 他に有効なサウンドフォントにチェックが付いていてもSDLに切り替わってしまうようです。

    これは仕様ですが、トラブルの元になるので変えた方がいいかもしれないですね。とりあえず以下のIssueを立てておきました。

    プリント文ではBASSを正しく呼び出せているか、正しい出力が返ってきているかっていうのは判断できないのでは?という感じでした。

    呼び出しに失敗すれば戻り値がおかしくなるか例外が投げられるかです。例外が出れば直後のprintが実行されない事を確認できますし、戻り値はprint文でそのままコンソールに出力する事ができます。

    BASSの場合はBASS_ErrorGetCode()の結果も出した方がいいでしょう。

  12. 暗黒 騎士 reporter

    表題については解決しているので閉じます。 対応ありがとうございました。

  13. Log in to comment