追加案: XML形式のシナリオでのファイル名不一致時の例外処理

Issue #386 resolved
Liar_cw NA created an issue

これはCWXEditor側の問題かもしれませんが、こちら(CWPy)の方で提案させていただきます。

CWXEditorとCWPyを同時に起動している時、 XML形式のシナリオのパッケージやバトル名をCWXEditorで変更した際に CWPy側で再更新を行わずに該当するパッケージまたはバトルを読み込むとCWPyが確実にフリーズしてしまいますが、クラシック形式ではフリーズしません。 これはファイル名の扱い方がクラシック形式とXML形式のシナリオで異なるためと思われます。

  • 展開されたXML形式のシナリオにてフリーズを確認。バトルはデバッガの呼び出しで確認、パッケージはエリアカードに設定したもので確認。ファイル更新の仕方は、変更があったファイルのみ上書き保存。ファイル名は[ID]_[名称].xml等、内部名称も含めて管理されている。
  • 非圧縮のクラシック形式ではフリーズしないことを確認。Battle1.wid等、ファイル名に内部名称は使用しない。

  • フリーズはバトルとパッケージで確認しました。他の要素は未確認です。エディターからファイルを削除した場合も未検証ですが、おそらく同じようにフリーズするものと思われます。

はっきり言ってしまうと シナリオを編集したにもかかわらずCWPy側で再更新を行わない事(ユーザ)が問題ですが、 クラシック形式では発生しない事柄がXML形式で発生してしまうことを考えますと、 ファイル名が不一致(存在しない)の場合は ダイアログなどで警告を通知されるか、 呼び出し処理を無視するなどされた方が良いかもしれません。

Comments (11)

  1. Liar_cw NA reporter

    こちらはフリーズ時のエラーログです。勝手ながらファイル名は伏せています。

    cardwirthpy_20160614b
    
    Version : 1.0 Beta 2 / 2016-06-14 06:54:16
    DateTime: 2016-06-14 19:07:00
    Traceback (most recent call last):
      File "cw\thread.pyo", line 679, in run
      File "cw\thread.pyo", line 709, in _run
      File "cw\thread.pyo", line 718, in main_loop
      File "cw\eventhandler.pyo", line 96, in run
      File "cw\eventhandler.pyo", line 277, in lclick_event
      File "cw\sprite\card.pyo", line 1208, in lclick_event
      File "cw\event.pyo", line 547, in start
      File "cw\event.pyo", line 714, in start
      File "cw\event.pyo", line 766, in run
      File "cw\event.pyo", line 874, in action
      File "cw\content.pyo", line 2447, in action
      File "cw\content.pyo", line 1642, in call_package
      File "cw\data.pyo", line 3287, in xml2etree
      File "cw\data.pyo", line 3296, in xml2element
      File "genericpath.pyo", line 62, in getmtime
    WindowsError: [Error 2] 指定されたファイルが見つかりません: u'(パス).xml'
    
  2. k4nagatsuki repo owner

    ありがとうございます。

    これははっきりエンジン側のバグとして扱うべきだと思います。存在しないリソースが発生したら、シナリオの側でファイル名の変更が発生したと仮定して、自動的にID・ファイル名テーブルの更新を行うべきです。というわけで、pull request #1491で対応しました。

    それとは別に、私はこの頃ファイル名がころころ変わったり日本語がファイル名に入る事は問題だと思っています。人間から見て分かりやすいというメリットはありますが、それよりバージョン管理システムが上手く機能しなくなってしまう方が問題です。そのうち、cwxeditorには各リソースをIDのみの名前で保存するオプションをつけようと考えています。

  3. Liar_cw NA reporter

    削除したバトルをデバッガから呼び出してみましたが、フリーズしました。

    バトル・パッケージの名称の変更は問題ないようです。
    自動的に再更新されることを確認しました。

    • いずれも展開されたXML形式のシナリオにて確認。
    cardwirthpy_20160614c
    
    Version : 1.0 Beta 2 / 2016-06-14 21:15:07
    DateTime: 2016-06-14 21:54:48
    Traceback (most recent call last):
      File "cw\thread.pyo", line 679, in run
      File "cw\thread.pyo", line 709, in _run
      File "cw\thread.pyo", line 718, in main_loop
      File "cw\eventhandler.pyo", line 113, in run
      File "cw\eventhandler.pyo", line 618, in executing_event
      File "cw\thread.pyo", line 2757, in change_battlearea
      File "cw\data.pyo", line 243, in get_resdata
      File "cw\data.pyo", line 505, in __getitem__
    KeyError: 623
    
  4. k4nagatsuki repo owner

    削除まで考慮してませんでした。

    これはかなり面倒なことになりました。削除まで問題に含めると小手先では直せません。内部構造を全体的に洗う必要がありそうです。しばらくお待ちください。

  5. Liar_cw NA reporter

    補足させていただきますと、ファイルはエディタ(CWXEditor)から削除しました。 直接削除したのではなく エディタから削除した結果となると、 今のうちに潰しておいた方がよい問題かもしれません。

    CWPyのソフトウェアとしての信頼性を高めるために報告させていただきましたが、 想像していたよりも大きな問題を掘り起こしてしまい、少々申し訳なく思います……。

  6. k4nagatsuki repo owner

    pull request #1492

    この問題は、CWPyのXMLリソース(*.widもですが)の取り回しに元々設計上の甘さがあったために生じたものです。各種リソースはIDとファイルパスのテーブルによって管理していますが、そのテーブルにはPythonのdictいわゆる辞書をそのまま使用しており、例えばテーブルから取り出したリソースの存在をチェックするかというような事は、テーブルを使う側に任されていました。

    XMLリソースを読み込む処理は大量にありますので、テーブルを使う側のコードは方々に散っています。それらのコードは、いちいちリソースの実在をチェックしたりはせず、テーブルの中身は現時点でも正しいものと思って処理を行っています。実際、その全部の箇所で一連のチェック処理を行うのは非効率に過ぎます。しかしそれでは今回指摘された問題が様々な形で、しかもあちこちで発生するという事になってしまいます。現になっていました。

    今回の改造で、テーブルの管理者を設定し、テーブルから情報を取り出す処理を一元化して、テーブルを直に使っているコードを全て、その管理者を通してリソースの情報を取り出すように改めました。また、リソースの読込に失敗する事を前提にした例外処理を全箇所に入れました。

    XMLの読込処理に、読込に失敗した時点でエラーダイアログを出して例外を投げる処理を入れてもいいのですが、それでは正しく終わる事が前提の処理が途中で中止されてしまい、その結果何が起こるかはまったく予想がつきません。データが壊れる事も無いとはいえません。「ここではリソースが読み込めないため処理が失敗する可能性がある」という事を、テーブルの使用箇所全てが認識する事は最低限必要で、実際にそうしています。

    テーブルの使用箇所の一覧は以下です。

    • キャストカードの加入・離脱・分岐
      • 冒険の再開時の同行キャストの状態が中断前と同じか
      • 再加入したキャストの状態が正しく初期化されるか
      • CWから変換した同行キャストが正しく現れるか
      • 1.28互換モードで同行キャストが戦闘ごとに初期化されるか
    • 特殊技能カードの入手・喪失・分岐
    • アイテムカードの入手・喪失・分岐
    • 召喚獣カードの入手・喪失・分岐
    • 情報カードの入手・喪失・分岐
    • エリア分岐
    • バトル分岐
    • エリア移動
    • バトル開始
      • 非表示だったエネミーカードのフラグ切替による表示
    • パッケージのコール
    • パッケージへのリンク
    • 上記各種コンテントのデバッガでの表示(イベントツリーとステータスバー)
    • デバッガでのエリア名・バトル名表示
    • デバッガからのカードの入手
    • デバッガからのカードの更新
    • デバッガからのエリア移動
    • デバッガからのバトル開始
    • デバッガからのパッケージコール
    • デバッガからの同行キャスト追加・除去
    • デバッガからの情報カード
    • デバッガからのイベント呼び出し
      • エリア
      • バトル
      • パッケージ
      • メニューカード
      • エネミーカード
      • 技能/アイテム/召喚獣使用時イベント
    • デバッガからのイベント実行
      • エリア
      • バトル
      • パッケージ
      • メニューカード
      • エネミーカード
      • 技能/アイテム/召喚獣使用時イベント
    • 他カードの参照が設定されたカードの持ち帰り
      • キャストの手札
      • 召喚獣

    これらについて、データが存在する時・データが存在しなくなった時の確認を行う必要があります。一通りテストはしましたが不安です。お手隙の方は確認にご協力いただけるとありがたいです。

  7. Liar_cw NA reporter

    バトルとパッケージについて一部検証を行ったところ、不具合を発見しました。 どうやら1~3どれも見た感じ同じ現象のようです。

    • 検証に使用したシナリオは、展開されたXML形式。(Wsn.1)
    1. バトル名の変更後、再更新せずにデバッガから呼び出し。設定したBGMが流れず無音になり、すべての敵キャスト(所有カードを含む)の画像が無い。異常後そのまま手動による再更新を行うと敵キャストの画像が読み込まれたが、BGMは無音のまま。バトル開始前に手動で再更新を行えば異常は出なかった。

    2. バトル削除後に再更新せずに、削除したバトルをデバッガから呼び出し。エラーメッセージが表示され、削除されたバトルが項目から消滅(自動的に再更新された?)。その後すぐに別のバトルを呼び出すと無音になり、敵キャストの画像が無くなる。バトルを中断するとエリアカードの画像とBGMも無くなった。

    3. パッケージ名の変更後、それをリンク(内容は、エリア移動後にバトルを開始する)で呼び出すと再更新されるものの、無音になり、PCとカード台紙以外表示されなかった。

    cardwirthpy_20160617
    CardWirthPy 1.0 Beta 2
    Build: 2016-06-17 20:01:58
    

    こちらについては余談です。 報告の情報量を増やしてはいけないと思っていたせいで(発言内容に優先順位を付けて)、発言が遅れましたが CWXEditorの各リソースのID名のみで保存するオプションについては私も好いと思います。

    さすがにCardWirthは日本国内の範囲に留まっていると思いますが、 そうではないとしたら、海外向けのOSの環境依存の文字の存在が気になるところですね(思い過ごしかもしれませんが)。

  8. k4nagatsuki repo owner

    ありがとうございます。

    薄々お察しかと思いますが、全て同一の問題でした。リロードでシナリオのディレクトリ情報が吹っ飛んでいました。

    pull request #1494で修正しました。


    さすがにCardWirthは日本国内の範囲に留まっていると思いますが、 そうではないとしたら、海外向けのOSの環境依存の文字の存在が気になるところですね(思い過ごしかもしれませんが)。

    OSレベルでは今時は大丈夫ですが、アプリケーションはまだまだのものが多いですね。特にgitやMercurialといったVCSは。個人的にデータがテキストになるメリットとしてそうしたVCSを使える事が挙げられるので、結構致命的です。

    今はシナリオのバージョン管理にはその辺りが無事なBazaarというソフトを使っていますが、VCS競争には完全敗北状態なのでこの先どうなることやら。

  9. Liar_cw NA reporter

    1~3どれも正常に自動的に再更新されることを確認しました。 ソースを直接 目で読んだわけではありませんので、 外から見た感じ、と発言しましたが やはり同一の問題でしたか。

    Bazaarについては詳しくはありませんが ツールも使い慣れた環境が一番ですし、細々とでもよいので続いてほしいものですね。聞きかじりの知識で申し訳ないですがツールといえばユーザビリティ、学習しやすさ(分かり易さ)・効率性・(操作の)記憶しやすさ・信頼性・主観的満足度、が重要というそうですし。

    cardwirthpy_20160618
    CardWirthPy 1.0 Beta 2
    Build: 2016-06-18 09:04:49
    
  10. Log in to comment