Summary.xmlとwsm・widファイルが混在するシナリオの読み込みに失敗する

Issue #42 open
Nameless created an issue

お世話になっております。

以下の通り、不具合らしき挙動をご報告します。お手数をお掛けしますが、お時間ある際にご確認ください。
再現しないなど、ご不明な点があればご連絡ください。

◆再現手順

  1. CardWirthPyLite Ver.4.0 ~ ver.5.2(HOTFIX20240705)
  2. 任意のwsn仕様シナリオ(Summary.xml)を作成
  3. 同フォルダ同階層に、Summary.wsmやArea1.widなど、クラシック仕様シナリオで使用されるファイルを配置
  4. 張り紙画面から当該シナリオを選択し、開始

◆事象

以下のメッセージが表示され、シナリオが開始されない。

「シナリオの読み込みに失敗しました。」

◆他エンジンでの結果

  • PyReboot5ではシナリオが開始される。
    (ただし、Summary.xmlとSummary.wsmが併存する場合、wsm側が優先される模様……Ascii順で読み込みの優先度が決まるんでしたっけか?)

◆補足

  • 一応事象に気付いたのは、Twitter(X)で公開されたwsn形式シナリオ【花旅人の想店/にじの様】が契機です。
  • xmlとwsm/widファイルの混在が正式にサポートされていないのは承知の上ですが、上記の通りPyRebootでは(一応)動いてしまうので、混乱を招き得ると言えば招き得るか……という事で起票しております。この点を鑑みて、起票時点ではminor評価としております。

Comments (5)

  1. 暗黒 騎士 repo owner

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

    ファイルがwidのとき、貼り紙(wsm)の情報を読み込みにいこうとするのですが、混在の場合はSummary.xml側を読んでいてwsm用のロード関数がxml読み込み側のクラスに存在していないのでAttributeエラーが出ているようです。

    とりあえず応急処置的に単純に読めなければ読み飛ばす(パワーコード)ようにして、ご教示頂いたシナリオは動作するようになったと思われますが、意図的な混在だと困るケースもありそうですね。

    うーん、現状、いいアイディアが思い浮かびません。混在シナリオであっても遊ぶ上で問題がある場合は極力対処したいとは思いますので、そのようなシナリオがありましたら都度お知らせ下さい。

    https://bitbucket.org/akkw/cardwirthpy-lite/downloads/CardWirthPyLite_5.2hotfix240705b.zip


    (ただし、Summary.xmlとSummary.wsmが併存する場合、wsm側が優先される模様……Ascii順で読み込みの優先度が決まるんでしたっけか?)

    そうですね。ZIP展開時(=圧縮されたWSNシナリオロード時)、多重にフォルダを入れ子にしている場合など、Py側からはどのディレクトリにシナリオが入っているかわからないため、ファイルを片っ端から検索しています。同一ディレクトリにSummary.xmlとSummary.wsmがある場合は、wが先に来るのでwsmが優先的に読み込まれてしまう・サブディレクトリから展開されるため、サブディレクトリの深層にSummary.wsm or 別のxmlが紛れ込んでいるようなケースでもそちらが優先されるというのがRebootの元仕様で、PyLiteではSummary.xmlがある場合は強制的にそちらを読み込むという振る舞いに変更しています。

  2. Nameless reporter

    ご対応ありがとうございます!
    アップロード頂いた版で、当該シナリオ、また手元で用意した「Summary.xmlとwidファイルが混在する」ケースについては、
    正常にシナリオの読み込みが出来る事を確認しました。
    「Summary.xmlとSummary.wsmが同フォルダ・同階層に存在している」ケースについては、引き続き読み込み失敗しているようではありますが、
    これはそもそもPyRebootでもSummary.xmlを無視しているケースなので、後述の都合も込みで問題無いような気はします。

    挙動としては、「widがあるのにSummary.wsmが無いケースでは、widファイルを一旦無視している」状況ですかね。
    個人的な見解としては一旦それで問題は無いのかな……と思っています。

    というのも、シナリオ作者的にwidやxmlを意図的に混在させたくなるような意図というのは、私が思い付く範囲では
    「1.50や1.60仕様のシナリオと、wsn仕様のシナリオを1フォルダに纏めて、プレイヤーにシナリオバージョンを意識せず運用して欲しい」
    くらいかなと思います。

    例えば、1.50仕様のシナリオとwsn仕様のシナリオを1フォルダに纏めた場合、

    • 現行のPyRebootとPyLiteではそれなりに動き、xmlがあるファイルについては(Summary以外は)xml側を優先して読み込む
    • 1.50では当然xmlが無視されるので、普通の1.50仕様シナリオとして動く

    といった動きをするように見えます。
    これにより、「1.50でも動かせるが、Py系エンジンで動かした場合は部分的にwsn仕様の機能が使える」といった事を実現できます。
    この際、1.50での動作を実現するため、Summary.wsmは当然ながら同梱されている筈です。

    というわけで、「widがあるのにSummary.wsmが無い」パターンというのは、
    「wsn仕様シナリオにうっかりwidを置きっ放しにしてしまった物」という解釈で良いように思われます……今のところ。
    そうでもないケースを見付けたら、改めてこちらに記載しますね。

    (ここからは余談ですが、恐らく前述の例示よりも需要がある「1.60仕様とwsn仕様を1フォルダに纏めて、ユーザ側の管理の手間を減らしたいケース」については、
    1.60仕様のSummary.xmlを見付けた時点でPyRebootが読み込みをやめてしまうので、現状実現出来ていません……が、仕方の無い事ですね)

  3. 暗黒 騎士 repo owner

    「Summary.xmlとSummary.wsmが同フォルダ・同階層に存在している」ケースについては、引き続き読み込み失敗しているようではあります

    すみません、確認ミスでした。

    ロード関連の処理を精査したところ、Pyでは「シナリオデータベース登録時の情報」を使って、クラシック形式ならsummary.wsmを随時xmlに変換して読んでいるのですが、「ZIP圧縮された混在シナリオ」に限り、シナリオデータベース上ではクラシック形式ではないと判定されているのに、summary.wsmが先に読み込まれるため、summary.wsm「WSN形式です」と偽装申請して無変換になり事故っているフローになっていました。

    よって、シナリオデータベース上でクラシック形式の情報がない場合は無視するようにしました。ただこのフローだと、同一ディレクトリのシナリオが書き換わった場合とかを考えると不味いような気もするんですが、まあそこについては元からそうなっているので今はみなかったことにします。

    https://bitbucket.org/akkw/cardwirthpy-lite/downloads/CardWirthPyLite_5.2hotfix240706.zip

    PyRebootが読み込みをやめてしまうので、現状実現出来ていません……が、仕方の無い事ですね

    Rebootもデータバージョン判定で弾いているはずなので4申告ならいけるかもしれません。7申告で混在させるのは内部ロジックをいじるほかないですが、現状のRebootの活動状況を踏まえるとどうしようもないと思われますね。もし将来的に長月さんのモチベが回復したとか別の人が引き継いだ場合は仕様変更を提案してみるといいかもしれません。

  4. Nameless reporter

    ありがとうございます!
    手元で用意した「WSN形式にクラシック形式のファイルを突っ込んだシナリオ」については、これでいずれも動いているようです。

    Rebootもデータバージョン判定で弾いているはずなので4申告ならいけるかもしれません。

    そうですね、4との混在なら今のところ行けているようでした。
    他については……今後の展望という事で……。

  5. Log in to comment