バグ:エンター押しっぱなしでスキップしたままテーブル画面になった時、メニューカードが表示されないことがある

Issue #321 resolved
暗黒 騎士 created an issue

CardWirthPy 0.12.4 Alpha 3 Build: 2016-01-12 20:57:20で確認。

一度キャンプ画面に切り替えてから戻すと表示されるのであまり害はないです。

戦闘開始の上にカーソルを置いてエンター押しっぱなしで戦闘終了させた時によく発生する感じです。

Comments (19)

  1. k4nagatsuki repo owner

    ご報告ありがとうございます。

    手許で何度か試してみましたが、いまのところ再現できていません。症状からして環境依存の話でもなさそうな気がするのですが。イベントの内容か、あるいは設定次第でしょうか? 例えば初期設定では発生するでしょうか。

    他にこの症状が発生した方がいらっしゃったら詳しい状況を教えていただけるとありがたいです。

  2. 暗黒 騎士 reporter

    あ、すいません。よくとは言いましたが、自分も狙って再現できるほど発生頻度は高くない感じですね。 (今デフォルト設定で公爵の遺跡を回っていますが再現できていません)

    今日「公爵の遺跡」をやっていて複数回発生しました。 アニキ戦終了後と、3rdで入れるarea60だったと思います。 それ以前にも何度かあって、たしか「不思議な博物店~木こりの斧~」でも発生した気がしますが、数週間前なので状況はあまり覚えていません。

    Qubesシナリオが多い気がしますが、長くさ迷っていて焦れて自然とスキップ多用しているところがあるので気のせいかもしれません。 感覚的にはメニューカードの再描画処理がスキップによって稀にすっ飛ばされることがあるのかな?という感じです。

    追記:発生時の設定は「システムカードを高速表示する」が有効、カード速度は最速一歩手前でした。

  3. k4nagatsuki repo owner

    公爵の遺跡の該当箇所で何度か試してみたのですが、今のところ再現なしですね。考えていたより再現性の低い問題のようですが……。

    確認なのですが、現象発生時にはデバッガを開いていたでしょうか。デバッガのイベントツリー更新処理の影響で異常が起きたという事が過去にあります。

    また、もし次にこの問題が発生したら、メッセージログの表示を行ってみていただけないでしょうか。描画処理が行われていないというような問題ならば、それによって全画面更新がかかるので、カードが表示されるはずです。それで表示されないようなら、カード自体が配置されていない事になります。また、それで表示されないようであれば、スキンの変更も試していただけないでしょうか。

  4. 暗黒 騎士 reporter

    デバッガは開いていないと思います。Ctrl+Dでデバッグモードのオンオフは使った可能性はあります。(敵の手札が表示されていて気付いてオフに戻すことが多々あるので)

    検証方法については了解しました。

  5. 暗黒 騎士 reporter

    遅くなりましたが、CardWirthPy 0.12.4 Alpha 4Build: 2016-02-16 19:42:15、通常モード、自動戦闘オンで再現しました。 状況としては烈梟刃で雑魚を攻撃中にPCカードのちょっと上の空間をマウス左ドラッグしっぱなしで戦闘終了したタイミングでした。

    メッセージログを表示させただけでは元に戻らないようです。スキンの変更では表示されました。

  6. 暗黒 騎士 reporter

    その後も再現させようと上記と同じ操作を繰り返すうちに戦闘終了後、メニューカードが表示された状態で操作不能になりました(終了確認ダイアログは出る)

    Version : 0.12.4 Alpha 4 / 2016-02-16 19:42:15
    DateTime: 2016-02-18 20:14:57
    Traceback (most recent call last):
      File "cw\thread.pyo", line 622, in run
      File "cw\thread.pyo", line 652, in _run
      File "cw\thread.pyo", line 657, in main_loop
      File "cw\eventhandler.pyo", line 30, in run
      File "cw\eventhandler.pyo", line 520, in returnkey_event
      File "cw\sprite\statusbar.pyo", line 970, in lclick_event
      File "cw\battle.pyo", line 81, in start
      File "cw\battle.pyo", line 144, in run
      File "cw\character.pyo", line 891, in action
      File "cw\character.pyo", line 817, in use_card
      File "cw\event.pyo", line 897, in start
      File "cw\event.pyo", line 655, in start
      File "cw\event.pyo", line 711, in run
      File "cw\event.pyo", line 906, in run_exit
      File "cw\event.pyo", line 725, in run_exit
      File "cw\event.pyo", line 44, in pop_event
    IndexError: pop from empty list
    
  7. k4nagatsuki repo owner

    ありがとうございます。スキン変更でないと表示されないという事は、メニューカードのリスト化はできているが画面への配置(スプライトの追加)ができていないか、スプライトの画像生成が行われていないかのとぢらかです。後者の場合は、カーソルキーやホイール操作で見えないカードを選択できる可能性があります。もしもまた発生したら、そうした事が行えるか試していただけないでしょうか。

    一応、pull request #1334で、カードの表示処理でもっと確実に画像の生成が行われるようにしてはみました。

    エラーはissue #337の本来操作できないタイミングで操作できてしまう問題が関係しているかもしれませんが、判然としません。また発生したらお知らせください。

  8. 暗黒 騎士 reporter

    お疲れ様です。今パターンに入っている感じで高頻度で再現するので試してみました。カーソルキーやホイールでは選択できず、本来メニューカードがある部分をクリックしても駄目なようです。

    新しいバージョンはこれから試してみますね。

  9. 暗黒 騎士 reporter

    CardWirthPy 0.12.4 Alpha 4 Build: 2016-02-18 21:06:55でも再現(メニューカードが表示されない方)を確認しました。

  10. k4nagatsuki repo owner

    ありがとうございます。

    高頻度で発生する状況の詳細を教えていただけないでしょうか。自動戦闘で発生したとの事ですが、クリックし続けて連打モードに入るオプションはオンになっているのでしょうか。

  11. k4nagatsuki repo owner

    再現可能なうちに試していただきたいのですが、cw/thread.pyの2729行目辺り:

            if areachange:
                # 戦闘前のエリアに戻る
                self.change_area(areaid, False, ttype=("None", "Default"), bginhrt=True)
    

    を以下のように変更し、何が表示されるか見ていただけないでしょうか。

            if areachange:
                # 戦闘前のエリアに戻る
                print self.cardgrp.sprites()
                self.change_area(areaid, False, ttype=("None", "Default"), bginhrt=True)
                print self.cardgrp.sprites()
    

    本来はここでメニューカードの配置を行っているので、change_area()の後のprint文でMenuCardオブジェクトが表示されるはずですが、現象発生時には現れないかもしれあせん。だとするとchange_area()の中で問題が起きている事になります。

  12. 暗黒 騎士 reporter

    上記の通りエンカウント戦闘で自動戦闘有効、_2のキャストカードのちょっと上ぐらいで左ボタンを押しっぱなしで1/3ぐらいの頻度で発生します。 「マウスの左ボタンを押し続けた時は連打状態にする」「連打状態の時カードなどの選択を自動的に決定する」は有効になっています。

    応答不能になる件についても再現しました。

    Version : 0.12.4 Alpha 4 / 2016-02-18 21:06:55
    DateTime: 2016-02-18 21:39:59
    Traceback (most recent call last):
      File "cw\thread.pyo", line 622, in run
      File "cw\thread.pyo", line 652, in _run
      File "cw\thread.pyo", line 657, in main_loop
      File "cw\eventhandler.pyo", line 30, in run
      File "cw\eventhandler.pyo", line 520, in returnkey_event
      File "cw\sprite\statusbar.pyo", line 970, in lclick_event
      File "cw\battle.pyo", line 81, in start
      File "cw\battle.pyo", line 144, in run
      File "cw\character.pyo", line 871, in action
      File "cw\character.pyo", line 817, in use_card
      File "cw\event.pyo", line 897, in start
      File "cw\event.pyo", line 655, in start
      File "cw\event.pyo", line 701, in run
      File "cw\event.pyo", line 794, in action
      File "cw\content.pyo", line 1534, in action
    TypeError: argument of type 'NoneType' is not iterable
    
  13. k4nagatsuki repo owner

    再現できした! 現象の内容からするとどうやら自動決定のオプションが絡んでいそうな感じがします。

    ありがとうございます。これでようやく手許で調査できそうです。原因の特定と修正までしばらくお待ちください(エラーも同じ原因だろうか?)。

  14. 暗黒 騎士 reporter

    おお、よかったです。再現できたとのことで既に必要ないかもしれませんが、print文で表示されなかった場合の結果を 貼っておきます。(一度目は応答不能の方が再現してしまい、モーション中にキャストカードが拡大中にフリーズでインデックスエラーpop from empty list)

    通常時
    [<BackGround DirtySprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <Me
    nuCard DirtySprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <MenuCard
     DirtySprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <MenuCard Dirty
    Sprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <PlayerCard DirtySpri
    te(in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <PlayerCard DirtySprite
    (in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <PlayerCard DirtySprite(i
    n 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>]
    [<BackGround DirtySprite(in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <
    PlayerCard DirtySprite(in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <Pl
    ayerCard DirtySprite(in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <Play
    erCard DirtySprite(in 1 groups)>]
    
    非表示時
    [<BackGround DirtySprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <Me
    nuCard DirtySprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <MenuCard
     DirtySprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <MenuCard Dirty
    Sprite(in 1 groups)>, <MenuCard DirtySprite(in 1 groups)>, <PlayerCard DirtySpri
    te(in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <PlayerCard DirtySprite
    (in 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>, <PlayerCard DirtySprite(i
    n 1 groups)>, <PlayerCard DirtySprite(in 1 groups)>]
    
  15. k4nagatsuki repo owner

    pull request #1335

    画面には表示されませんが、自動戦闘中にラウンドの切れ目で「行動開始」ボタンを押す事ができていたようです。

    そしてそのラウンドで戦闘が終了すると、勝利イベント発生後に「行動開始」が再度行われ、敵キャストが片付けられているので自動的に勝利となり、勝利処理の中で再び画面上の全カードが片付けられる――つまりメニューカードが表示されないのではなく、表示された後で消去されていた、のだと思います。

    その他のエラーも、行動開始二重発生でイベントの階層構造がおかしくなった結果であるように思えます。

    なぜ入力が受け付けられていたのかの所が若干不明瞭です(今回の修正は、万一ボタンが押されても何もしないように変更したものです)。調査は続けてみますが、とりあえず直ったかどうかテスト版をお試しください。

  16. 暗黒 騎士 reporter

    なるほど…!そっちでしたか。

    上記状況で100回ほど戦闘しましたが、非表示と応答不能エラー、どちらも再現しないので修正できたといっていいと思います。お疲れ様でした。

  17. k4nagatsuki repo owner

    バトル行動中はイベント実行中に当たり、イベント実行中は基本的に入力を受け付けない(一部のステータスバーのボタンを除く)のですが、イベントが実行中かどうかの判断には、バトル中にcw.cwpy.battle.is_ready()Trueを返す状況であればイベント中に当たらないという条件が含まれます。これはプレイヤーがカードを選択するなどしているタイミングだからです。

    ところが、自動戦闘中のラウンドの合間は、プレイヤーの手が入らないにもかかわらず、一瞬だけis_ready()Trueを返すタイミングが発生していました。この一瞬で入力を行うのは、それこそ連打モードでカーソル下のオブジェクトを一瞬で選択肢ない限り不可能に近いのですが、オプションの組み合わせによりそれが実現できてしまったというのが今回の問題のようです。

    自動戦闘中はis_ready()が常にFalseを返すようにすると、実際に再現しなくなったようなので、たぶんこれで問題無いでしょう。この問題を見つけられてよかったです。ありがとうございます。これでクローズさせていただきます。

  18. Log in to comment