特定条件下にて、シナリオの読み込みが失敗する

Issue #904 resolved
siso_siso created an issue

CardWirthPy 4.0にて、シナリオ内でセーブした後、再度ロードをすると、
エラーメッセージ「シナリオの読み込みに失敗しました。」が表示され、「冒険者の宿」画面に戻ります。
再現率は20回中20回不具合が発生しております。

再現手順としましては

①任意のシナリオ中にセーブをする
 (プリセット「交易都市リューン」でも確認済)

②-1 本体を終了して、再度ロードする
②-2 冒険の中断 → 宿を出て再度ロード
②-3 冒険の中断 → 冒険の再開 → ①でつかった宿選択
 ※再度ロード:スタート → ①でつかった宿選択

③エラーメッセージ
 「シナリオの読み込みに失敗しました。」が表示される
④「冒険者の宿」画面に戻る

となります。
「冒険者の宿」画面でのセーブにおいては問題ありません。

また、ロードの際読み込みに失敗するだけで、所持金、アイテム等の所持データに影響はありません。

補足---

※1 CardWirthPy Version.3.2で上記の現象は発生しないようです。
※2 CardWirthPy 4.0をダウンロードした初期環境でも上記の現象を確認しております。
※3 2020/01/01に更新されたもので確認しております。
※4 「CardWirthPy.exe」でログは出力されていません。

【再現環境】
OS:Windows7
メモリ:8.00GB
空き容量:HDD 805GB

環境固有ではないか、とも想定されるので、念の為記載しておきます。

以上、ご報告致します。

Comments (11)

  1. siso_siso reporter

    補足ですが
    64bit 32bit、両方とも同現象を確認しております。
    併せてご報告致します。

  2. k4nagatsuki repo owner

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

    手持ちのプレイ用環境と初期状態の環境で何度か試してみたのですが、現象を再現できませんでした。また、手元にはWindows 7(64-bit)とWindows 10(64-bit)の環境がありますが、そのどちらでも再現に失敗しました。

    再現率からして実際にバグがありそうな感じがするのですが、どうも手順か前提条件に食い違いがあるような気がします。

    私が初期状態から試した時の手順を細かめに書いておきます(Win10マシンとWin7マシンの両方で実施)。

    1. PCの内蔵SSDにCardWirthPy 4(32-bit)をダウンロードして展開。
    2. 起動して新規宿を作る。
    3. ランダム生成したキャラクターを1人登録。1人パーティを編成。
    4. 交易都市リューンに入り、キャンプからセーブ(①)。
    5. キャンプを解除せずに右上の閉じるボタンでウィンドウを閉じる。
    6. 起動し、スタートから宿を選択(交易都市リューンにいる状態のパーティがロードされる)(②-1)。
    7. キャンプを開き、「冒険を中断」を選択。
    8. 宿画面から「宿を出る」を選択し、起動画面へ(②-2)。
    9. スタートから宿を選択(6.と同じ状態でロードされる)。
    10. キャンプを開き、「冒険を中断」。
    11. 宿画面から「冒険の再開」(②-3)。

    この11.が②-3にあたる操作で、ここでエラーが発生するはずですが、発生しません。

    この手順とそちらでエラーを発生させた時の手順に何か違いはあるか、また、この手順をそちらで試した時にはエラーは発生するか、教えていただけないでしょうか。

  3. siso_siso reporter

    迅速なご対応ありがとうございます。

    手順について、再現方法①が
    「内臓SSD→内臓HDD」に変わる以外に相違はありません。

    また、仰られた通りの順番にて
    初期状態の環境で試した際
    ⑥、⑨、⑪ の合計三箇所時点にて、
    それぞれ同じエラーメッセージ
    「シナリオの読み込みに失敗しました。」を確認しております。(まとめて記載したため、わかりにくく申し訳ありません)

    不勉強で恐縮なのですが
    起動の際、前提で「最新安定版」のフルパッケージ以外に必要なものはありますでしょうか?
    (java 8やpython37等)

    お手数をおかけして申し訳ございませんが
    よろしくお願い致します。

  4. k4nagatsuki repo owner

    フルパッケージ以外に必要なものは無いはずで、欠けているファイルがあればそもそも起動自体ができないはずです。

    6.・9.・11.で発生するという事は、シナリオ内のロードが全くできないという事ですね。シナリオの読み込みに失敗しているとしか思えないのですが、最初に開始する時は成功しているのでどうも解せません。

    以下に、ロードに失敗した時にエラーログを出力するバージョンを作ってみました。

    https://bitbucket.org/k4nagatsuki/cardwirthpy-reboot-k4nagatsuki/downloads/CardWirthPy_test_20190107.zip

    このバージョンを使用して現象を再現し、CardWirthPy.exe.logの内容を教えていただけないでしょうか(ログ内のファイルパスにPCのユーザ名など見られたくないものが入っている場合は別の文字列に置換してください)。

  5. siso_siso reporter

    朝早くからご対応いただきありがとうございます。
    k4nagatsuki様が提示いただいた手順にて
    上記ファイルをDL後、エラーログを確認できました

    6,9,11の段階全て踏まえた上でのログとなります


    Version : 4.0 (32-bit) / 2020-01-07 06:50:26
    DateTime: 2020-01-07 07:17:11
    Traceback (most recent call last):
    File ".\cw\thread.py", line 2438, in _set_scenario_impl
    File ".\cw\data.py", line 536, in set_log
    File ".\cw\util.py", line 2620, in decompress_zip
    File "<frozen importlib._bootstrap>", line 983, in _find_and_load
    File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 668, in _load_unlocked
    File "<frozen importlib._bootstrap>", line 638, in _load_backward_compatible
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 277, in <module>
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 191, in init
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 70, in init
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 92, in __calc_weekday
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 92, in <listcomp>
    File "C:\Program Files (x86)\Python37-32\lib\calendar.py", line 82, in getitem
    ValueError: embedded null byte

    DateTime: 2020-01-07 07:18:01
    Traceback (most recent call last):
    File ".\cw\thread.py", line 2438, in _set_scenario_impl
    File ".\cw\data.py", line 536, in set_log
    File ".\cw\util.py", line 2620, in decompress_zip
    File "<frozen importlib._bootstrap>", line 983, in _find_and_load
    File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 668, in _load_unlocked
    File "<frozen importlib._bootstrap>", line 638, in _load_backward_compatible
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 277, in <module>
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 191, in init
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 70, in init
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 92, in __calc_weekday
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 92, in <listcomp>
    File "C:\Program Files (x86)\Python37-32\lib\calendar.py", line 82, in getitem
    ValueError: embedded null byte

    DateTime: 2020-01-07 07:18:24
    Traceback (most recent call last):
    File ".\cw\thread.py", line 2438, in _set_scenario_impl
    File ".\cw\data.py", line 536, in set_log
    File ".\cw\util.py", line 2620, in decompress_zip
    File "<frozen importlib._bootstrap>", line 983, in _find_and_load
    File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
    File "<frozen importlib._bootstrap>", line 668, in _load_unlocked
    File "<frozen importlib._bootstrap>", line 638, in _load_backward_compatible
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 277, in <module>
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 191, in init
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 70, in init
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 92, in __calc_weekday
    File "C:\Program Files (x86)\Python37-32\lib_strptime.py", line 92, in <listcomp>
    File "C:\Program Files (x86)\Python37-32\lib\calendar.py", line 82, in getitem
    ValueError: embedded null byte

    Traceback (most recent call last):
    File ".\cw\thread.py", line 863, in run
    File ".\cw\thread.py", line 915, in _run
    File ".\cw\thread.py", line 926, in main_loop
    File ".\cw\eventhandler.py", line 129, in run
    File ".\cw\eventhandler.py", line 832, in executing_event
    File ".\cw\thread.py", line 2421, in load_failure
    File ".\cw\thread.py", line 2382, in set_yado
    File ".\cw\thread.py", line 2376, in change_area
    File ".\cw\thread.py", line 3672, in change_area
    File ".\cw\data.py", line 850, in start_event
    File ".\cw\event.py", line 621, in start
    File ".\cw\event.py", line 859, in start
    File ".\cw\event.py", line 953, in end
    File ".\cw\thread.py", line 3294, in show_party
    File ".\cw\animation.py", line 91, in animate_sprites
    File ".\cw\animation.py", line 162, in animate_sprites2
    File ".\cw\thread.py", line 1006, in wait_frame
    File ".\cw\eventhandler.py", line 129, in run
    File ".\cw\eventhandler.py", line 832, in executing_event
    File ".\cw\frame.py", line 592, in func
    File ".\cw\bassplayer.py", line 362, in pause
    AttributeError: 'NoneType' object has no attribute 'BASS_Pause'

    Exception in thread Thread-2:
    Traceback (most recent call last):
    File ".\cw\thread.py", line 863, in run
    File ".\cw\thread.py", line 915, in _run
    File ".\cw\thread.py", line 926, in main_loop
    File ".\cw\eventhandler.py", line 129, in run
    File ".\cw\eventhandler.py", line 832, in executing_event
    File ".\cw\thread.py", line 2421, in load_failure
    File ".\cw\thread.py", line 2382, in set_yado
    File ".\cw\thread.py", line 2376, in change_area
    File ".\cw\thread.py", line 3672, in change_area
    File ".\cw\data.py", line 850, in start_event
    File ".\cw\event.py", line 621, in start
    File ".\cw\event.py", line 859, in start
    File ".\cw\event.py", line 953, in end
    File ".\cw\thread.py", line 3294, in show_party
    File ".\cw\animation.py", line 91, in animate_sprites
    File ".\cw\animation.py", line 162, in animate_sprites2
    File ".\cw\thread.py", line 1006, in wait_frame
    File ".\cw\eventhandler.py", line 129, in run
    File ".\cw\eventhandler.py", line 832, in executing_event
    File ".\cw\frame.py", line 592, in func
    File ".\cw\bassplayer.py", line 362, in pause
    AttributeError: 'NoneType' object has no attribute 'BASS_Pause'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "C:\Program Files (x86)\Python37-32\lib\threading.py", line 926, in _bootstrap_inner
    File ".\cw\thread.py", line 880, in run
    File ".\cw\thread.py", line 4739, in play_sound
    File ".\cw\util.py", line 356, in play
    File ".\cw\thread.py", line 1404, in stop_the_world_with_iconized
    File ".\cw\thread.py", line 5493, in is_running
    cw.thread.CWPyRunningError


    特にファイルパスに差し支えはありませんでしたので
    「CardWirthPy.exe」のエラーログ全文そのままとなります。

  6. k4nagatsuki repo owner

    ありがとうございます。

    エラーログを見たところ、パーティが持っているシナリオプレイ情報(ZIP圧縮されている)を展開する時に、各圧縮ファイルの更新日時を取得しようとしたところでエラーになっていました。Python37-32はCardWirthPyを書くのに使っているプログラミング言語Pythonの処理系のフォルダで、配布版のCardWirthPyにはPython処理系が内蔵されています。エラーはPython処理系の中の時刻の文字列を解釈する部分で発生しています。

    普通ここでエラーが起きるわけはないので、環境がおかしいというのはありえそうです。特にタイムゾーンの設定は気になります。タスクバー上の時刻表示の上で右クリックして「日付と時刻の調整」を選択し、タイムゾーンの項目に何が表示されているか確認していただけないでしょうか。

    それはそれとして、問題の日時処理を別のやり方でやる事によって不具合を回避できるかもしれません。試しにそのようなバージョンを作ってみました。これで同手順をとったときに問題が発生するかお試しください。

    https://bitbucket.org/k4nagatsuki/cardwirthpy-reboot-k4nagatsuki/downloads/CardWirthPy_test_20200107b.zip

  7. siso_siso reporter

    確認やご対応いただきありがとうございます
    圧縮ファイルの更新日時の取得時点でエラーが発生していたのですね
    丁寧な解説をいただきありがとうございます。

    日付と時刻の調整、ですが、タイムゾーンは「(UTC+09:00) 大阪、札幌、東京」となっておりました。
    この「日付と時刻」につきましては、
    以前に別件で「インターネット時刻の同期」を諸事情で変更しておりまして、個人で変更した点はそのくらいです。

    さて、添付いただいたバージョンで手順を確認したところ
    6,9,11にて読み込みエラーは発生せず
    「交易都市リューン」内部でセーブした後、正常に読み込みプレイすることが可能でした。

    こちらの処理で回避ができるのであれば助かります。
    どうかご教示いただければ幸いです。

  8. k4nagatsuki repo owner

    ご確認ありがとうございます。

    タイムゾーンは問題なさそうですし、時刻の同期先を変更した事でこのようなエラーが発生するとは考えづらいです。ハードウェアやドライバに何らかの特殊な要因があるのかもしれませんが、そこまで追求するとなると正直なところ私の手には負えません。

    対症療法ではありますが、とりあえず問題の回避はできたようなので、pull request #2698で変更をマージしてテスト版をアップロードしました。Downloadsの一番上にあるcardwirthpy_<日付>_x86.zip(32-bit版)かcardwirthpy_<日付>_x64.zip(64-bit版)をダウンロードし、4.0の環境に上書きすれば、同じ問題は発生しなくなると思います。

  9. siso_siso reporter

    お疲れさまです。そしてこの度は大変お手数をおかけしました。
    上書きして確認したところ、
    シナリオ内で(リューン以外でも試しております)セーブ後、
    6.9.11の場所でも問題なく正常にロードすることができました。

    正月というお忙しい中、お手間をかけてしまい申し訳ございませんでした。
    こちらで引き続きプレイしたいとおもいます。
    ありがとうございました。

  10. k4nagatsuki repo owner

    こちらこそご迷惑をおかけして申し訳ありませんでした。

    来月頭にはこの修正を含めた4.1をリリースする事にします。

  11. Log in to comment