Clone wiki

CardWirthPy Reboot / MemoForCompatibility

バージョン間の互換性情報 - CardWirth実装メモ

このページには、CardWirthPyを実装するにあたって遭遇し、互換モードで対応する事になった、CardWirthのバージョン間の差異や、それによって失われた互換性についての情報を記載しています。

以降に記述される1.20、1.28、1.29、1.30、1.50は、全てCardWirthのバージョン番号です。


表示

1.20以前はメニューカードがプレイヤーカードの上に描画される

1.20以前は、メニューカードをプレイヤーカードの上に被せるように配置する事ができましたが、1.28以降描画順が変更され、常にメニューカードがプレイヤーカードの下に表示されるようになりました。

1.20以前のシナリオでメニューカードをプレイヤーカードの上に重ねてキャラクターの隠蔽を表現していたシナリオは、これによって不具合が発生するため、1.20互換モードで対応しています。

また、1.50以降、この描画順を1.20相当に戻すオプションがエンジンに追加されました。それをオンにしてのプレイを推奨するシナリオが存在するため、バージョン番号とは独立にカードの描画順を入れ替えるだけの互換モードを追加しています。

1.28以降は行末に半角スペースがあると折り返し位置が変わる(イベントによるメッセージのみ)

台詞コンテントやメッセージコンテントで表示されるメッセージは、話者ありの時は半角32文字、無しの時は半角42文字で自動的に折り返されますが、その折り返し位置に半角スペース(\u20)があると実際の折り返し位置が変わります。

例えば話者ありの時、次のようなメッセージは、

012345678901234567890123456789_____123

最後の4文字が折り返されて次のようになります。

012345678901234567890123456789____
_123

ところが、次のようなメッセージは、

012345678901234567890123456789____ _123

1.20では以下のように予期した位置で折り返されますが、

012345678901234567890123456789____
 _123

1.28以降では折り返し位置の半角スペースが前の行に残留して次のようになります。

012345678901234567890123456789____ 
_123

これによってメッセージの表示がおかしくなるシナリオが存在するため、1.20互換モードで対応しています。

1.28以前は話者画像のサイズによって本文の位置がずれる

1.28以前は、メッセージや台詞の話者に横幅が74ピクセルでない画像を表示すると、実際のサイズと74ピクセルからの差の分、本文のテキストの位置がずれます。

これを利用して特殊なメッセージを表示しているシナリオが存在するため、1.28互換モードで対応しています。

1.30以前は&O&P&L&Dの各色が無い

1.30以前は台詞やメッセージ中にこれらの色指定を書いても無視されます。

これによって不具合が発生するシナリオは確認されていませんが、1.28互換モードで同様に無視するようにしてあります。

1.30以前は選択肢に特殊文字を使用しない

1.30以前は、メッセージの選択肢のテキストに#M%フラグ名%などの特殊文字を記述してもそのまま表示されていました。

選択肢に記述された#M等がそのまま表示される事を想定して作成されたシナリオが存在するため、1.30互換モードで対応しています。


イベント

1.20では状態判定分岐のうち、呪縛・睡眠・中毒・麻痺がずれて判定される

1.20以前の状態判定分岐にはバグがあり、次のように、エディタの設定とエンジンの挙動のずれが発生していました。

  • 呪縛判定分岐は睡眠判定分岐として機能する
  • 睡眠判定分岐は中毒判定分岐として機能する
  • 中毒判定分岐は麻痺判定分岐として機能する
  • 麻痺判定分岐は呪縛判定分岐として機能する

これは1.28で修正されましたが、エディタ側の表記ではなくエンジン側の挙動が修正されたため、バグを承知した上で状態判定分岐を行っているシナリオで不具合が発生しました。

そのため、1.20互換モードで、1.20エンジン相当の動作をサポートしています。

1.20では選択中のメンバがいない状態で選択中のメンバでの称号所持判定を行うと「誰か一人」のように動作する

1.20以前は、選択中のメンバがいない状態で「選択中のメンバ」による称号判定分岐を行うと、指定した称号を持つプレイヤーキャラクターが必ず選択状態になりました。

任意の称号を持つプレイヤーキャラクターを選択したい時には「誰か一人」を指定して称号判定分岐を行いますが、1.20では、ミスで「選択中のメンバ」を指定していても正常に動作していました。

このバグの修正によって、称号判定分岐の箇所で確率的に停止してしまうようになったシナリオが複数存在するため、1.20互換モードで対応しています。

1.20以前は最大値ダメージも防御修正による影響を受ける

1.20以前は、例えば最大の防御修正があれば最大値ダメージを与えても体力が半分残っていましたが、1.28以降は防御修正に係わらず必ず体力が0になるように仕様が変更されました。

これによって予期せぬ全滅が発生するシナリオが存在するため、1.20互換モードで対応しています。

1.20以前ではカード配付時に持札が一杯でも荷物袋に入らない

1.20以前は、特殊技能・アイテム・召喚獣カードをカード取得イベントでキャラクターへ配付した時、持札の数が一杯に達していて持ちきれなければ消滅する仕様でした。

1.28以降は当該カードが荷物袋に入る仕様に変更されましたが、それによって、予期せぬ荷物袋へのカード配付が行われるシナリオが発生しました。そのため、1.20互換モードで相当動作に対応しています。

1.28以前のバグで、確率分岐の値が+1になる

1.28以前はランダム分岐の挙動にバグがあり、例えばエディタで50%の分岐を指定すると、エンジン側では51%の分岐であるかのように動作していました。

このバグは1.29で修正されました。それによって不具合が発生するシナリオは確認されていませんが、一応1.28互換モードで対応しています。


データ

1.20以前にカード名キーコードは存在しない

1.28以降、キーコードイベントは使用されたカード名でも発火するようになりましたが、1.20以前はこの仕様は存在しませんでした。

この新機能によって不正なショートカットが行えるシナリオが存在するため、1.20互換モードでカード名がキーコードにならない挙動に対応しています。

1.30以前ではMatchingType=Allは普通のキーコード

1.50以降、イベントのキーコード発火条件に「全てマッチ」が選択できるようになりましたが、これは内部データではMatchingType=Allというキーコード発火条件を追加する事で表現されています。

1.30以前のエンジンはMatchingType=Allというキーコードを普通のキーコードとして認識するため、挙動にずれが生じる可能性があります。これによって不具合が発生するシナリオは確認されていませんが、一応1.30互換モードで対応しています。

1.30以前ではで始まっていても普通のキーコード

1.50以降、イベントのキーコード発火条件に「当該キーコードを持たない」という条件が指定できるようになりました(キーコード名の前にを追加)。

1.30以前のエンジンはで始まるキーコードを普通のキーコードとして認識するため、挙動にずれが生じる可能性があります。これによって不具合が発生するシナリオは確認されていませんが、一応1.30互換モードで対応しています。

1.30以前ではカードの売値は常に半額

通常、カードの売却額は購入額の半分ですが、1.50以降、レアカードの売却額は購入額の3/4になりました。これによって、売却額に関するメッセージと実際の売却額が食い違うシナリオが発生しました。

実際にそのようなシナリオは確認されており、1.30互換モードでレアカードの半額の売却に対応しましたが、その程度の食い違いは大きな不具合とはいえないため、それらのシナリオを互換性データベースには追加していない状況です。


音声

1.28以前はMP3がループ再生されない

1.28以前はMP3音声をBGMとして再生してもループ再生されませんでしたが、1.29以降ループするようになりました。

不具合が発生するシナリオは確認されていませんが、一応1.28互換モードで対応しています。

1.29以降でWinMM以外の音声再生方式を使うと動画が再生されない

1.28以前は動画が再生できていましたが、1.29以降でWinMM以外の音声再生方式を使用すると再生できません(デフォルト設定でBASS Audioが使用されるため、一般的な環境で再生できません)。

CardWirthPyでは互換モードによらず動画を再生します。


エフェクトブースター

1.30以前はJPY1のレタッチ内容によってセルとして配置した時に指定したマスク設定が無効にされてしまう場合があるが、1.50では無効にならない

1.30以前は、JPY1でpaintmode3以外の時にfilter=1などのレタッチ操作を画像に適用すると、transparent=1やセルとして配置した時のマスク設定が無効化されていました。

1.50では、transparent=1は依然として無効になりますが、セルとして配置した時のマスク設定は機能するようになりました。

それによって本来マスクされるべきでないJPY1イメージがマスクされてしまい、表示がおかしくなるシナリオが複数確認されているため、1.30互換モードで対応しています。

1.50ではJPDCのcopymode=1指定はcopymode=2指定のように動く

1.50ではJPDCのcopymode=1指定はcopymode=2指定のように動いてしまいます(不指定時は変化無し)。

それによって表示がおかしくなるシナリオが存在するため、1.30互換モードで対応しています。

セクション名が重複した時、セクションの内容が上書きされて同一のセクションが複数回実行されるような挙動が発生するが、1.30以前では後に定義されたセクションが、1.50では先に定義されたセクションが複数回実行される

JPY1では同一名称のセクションが複数存在すると、その中のどれか一つが同一名称のセクションが存在する回数だけ実行されるという現象が発生します。

例えば次のようにセクションが並んでいる場合、1.30以前は後に定義された[sec1]が2度実行され、AdventurersInn.bmpMapOfWirth.bmpAdventurersInn.bmpの順で表示が更新されます。

[init]

[sec1]
dirtype=2
fileName=AdventurersInn_.bmp
width=332
height=420
wait=-1
animation=2

[sec2]
dirtype=2
fileName=MapOfWirth.bmp
width=332
height=420
wait=-1
animation=2

[sec1]
dirtype=2
fileName=AdventurersInn.bmp
width=332
height=420
wait=-1
animation=2

ところが、1.50では先に定義された[sec1]が優先されるため、AdventurersInn_.bmpMapOfWirth.bmpAdventurersInn_.bmpと表示が更新されます。

この挙動の変化によって表示がおかしくなるシナリオが存在するため、1.30互換モードで対応しています。

Updated