バグ:特殊文字「#t」や状態変数のセリフ/メッセージ展開時に別の特殊文字への置換が生じる

Issue #387 resolved
権兵衛 七篠 created an issue

ご無沙汰しております、七篠権兵衛です。
先日は検証お付き合いくださりありがとうございました。
(その後シナリオの開始時フリーズはいまだ発生してません。)

表題どおり、パーティー名の文字列で、
半角「&」で始まるいわゆる特殊文字と同じ文字列が存在した場合に
(例:「Lv1&Lv2組」など)メッセージやセリフコンテントの表示で
これらの文字列が特殊文字扱いで置換されるという挙動を発見しました。
(先ほどの例であれば「Lv1v2組」となって「v」以降の文字が変色する)
調子こいてさらに「#n#q」などとパーティー名を設定して追試を進めたところ
半角「#」で始まる特殊文字も同様に置換が起きることを確認しました。
(1.20、1.28、1.30、1.50で検証したところ、置換は発生せず)
よせばいいのにさらに検証し、状態変数の値でも同種の現象を確認しましたが
おそらく宿名やメンバ名、使用中カード名などでも
同種の置換が生じるものと思われます。

(検証用シナリオを添付しましたので、どうぞご確認ください)

推測するに、セリフ/メッセージの表示に先立って、
1)これら宿/パーティー/メンバ/カード/状態変数に相当する
 特殊文字と該当文字列との置換が行われてから、
2)それ以外の特殊文字の処理を行う
....という流れになっているために
このような症状が発生したものかと思われます。
(「cw / sprite / message.py」あたり?)

おそらくこの問題は、状態変数名で、
「「2)」に該当する「それ以外の特殊文字」が存在する可能性」
に気をつければ、1)と2)を逆順にして解決するかと愚考します。
(半角の「$」や「%」見つけたら改行にぶつかるか
対になる「$」や「%」見つけるまで特殊文字処理をスキップする、とか?
一応実際に状態変数として使われている文字かどうか
確認してからスキップしたほうがいいのかなぁ.....?)

#個人的には状態変数の値で特殊文字使えるのは
#「厳密にはバグ」でも存外悪い話じゃないんだよな、とか思ってたり(を
#それまで多岐分岐でぞろぞろメッセージやセリフ並べてたのが
#ステップの指定でこうやって楽にできますし(を
#step-0「&L時間切れ」
#step-1「&Rあと1分」
#step-2「&Yあと3分」
#step-3「&Wあと5分」
#step-4「&Bあと9分」

Comments (5)

  1. k4nagatsuki repo owner

    ご報告ありがとうございます。検証用のシナリオも作っていただいた事で、問題の再現にも修正の確認にも使えるので非常に助かりました。

    原因については仰る通りです。特殊文字の最初の置換処理の後で処理されるのは、実際に画像を作成し始めないと処理不能である「色変更」と「画像の埋め込み」なのですが、今回問題が起きていたのはまさにこれらの特殊文字です。

    ちょっと単純な修正はできないのですが(単純にするにはメッセージ描画と折り返し周りのコード全体を一体化して整理する必要がありますが大変です)、最初の置換処理で特殊文字使用箇所を記録していくという方法で対処しました。pull request #1495です。

    よろしければ最新のテスト版をお試しください。


    状態変数内の特殊文字を展開したいという需要は実際にあるようで、CWNextでは限定的に対応しているようです。たぶんWsn.2かそれ以降では実現できると思います。

  2. k4nagatsuki repo owner

    ちなみに波線「~」が繋がって見えるのは、メッセージ文字のサイズのMS明朝の字間を1ピクセル縮めると、たまたま文字の左右の位置がぴったり一致するからです。つまり偶然です(でもgroupAskはその偶然を狙って文字配置を決めたのかもしれない)。

  3. k4nagatsuki repo owner

    修正確認のコメントをまだいただいていませんが、問題は解決したと思うのでクローズさせてください。

    解決していなかったり、別の問題が生じている場合は、再オープンしてください。

  4. Log in to comment