Wiki

Clone wiki

CardWirthPy Reboot / MemoForEffectBooster

エフェクトブースターの問題 - CardWirth実装メモ

このページには、CardWirthPyを実装するにあたって遭遇したエフェクトブースターの問題やドキュメント化されていない情報を記載しています。

作成したJPY1ファイルが予期したように動かないような時、このページの情報が参考になるかもしれません。


共通

backcolorの初期値がドキュメントと異なる

文法一覧では初期値は白となっていますが、実際には黒($000000)です。

colorの初期値がドキュメントと異なる

文法一覧では初期値は白となっていますが、実際には黒($000000)です。

色指定に名前が使える

ドキュメントにありませんが、次の名前が使えるようです。仕様かバグかは不明です。

  • black …… $000000
  • maroon …… $800000
  • green …… $008000
  • olive …… $808000
  • navy …… $000080
  • purple …… $800080
  • teal …… $008080
  • gray …… $808080
  • silver …… $C0C0C0
  • red …… $FF0000
  • lime …… $00FF00
  • yellow …… $FFFF00
  • blue …… $0000FF
  • fuchsia …… $FF00FF
  • aqua …… $00FFFF
  • white …… $FFFFFF

色指定では$の他に#が使える

$記号の他に#記号を使っても色指定が機能します。今のところ、他に使用可能な文字は確認されていません。

数値列の数値部分を数値としてパースできない文字列にすると0として扱われる

値として42,42のように複数の数値を指定する際、,4242,、はたまた,のように数値部分を省略したり、a,42のように数値として扱えない文字列を指定したりすると、その部分の値が0として扱われます。

数値列に余計な数値を付け加えても動作する

必要な数より多くの数値列を指定した場合は必要な数だけの値が使用されます。たとえば位置の指定で10,20,30,40などと書くと、前方の1020が使用されます。

セクション内でコマンドが重複した時の挙動

詳細には確認していませんが、JPY1では先の定義が優先され、JPTXでは後の定義が優先されるようです。

例えばJPY1で次のような指定を行うと、colorの実際の値は$000000になります。

[section]
color=$000000
color=$FFFFFF

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

互換性問題でもあるため、バージョン間の互換性情報の当該項目で詳しく解説しています。

JPY1

wait-1より小さな値を指定するとアイコンが変化しない

無限ウェイトは発生しますが、アイコンが変化しないという挙動になります。未定義動作なので、環境や状況によって結果は異なるかもしれません。

waitにごく小さな値を指定した場合は正確に機能しない

waitには1ミリ秒単位で待機時間が指定できますが、Windowsの内部タイマーは、通常概ね15.6ミリ秒程度の周期を最短として処理を行っています。それ未満の時間のウェイトはOSレベルで正確に動作することが保証されていません。あまり短い時間を指定すると、環境や状況によって挙動が異なるような事がありえます。

dirtype=4についてのドキュメントの記述誤り

dirtype=4は現在プレイ中のシナリオフォルダを指定すると記述されていますが、実際にはJPY1ファイルが存在するフォルダが基準となります。また、alphaパラメータ必須と書かれていますが、dirdepthの誤りと思われます。

JPY1の加工内容によってtransparent=1や背景セルとして配置した時のマスク指定が機能しなくなる

JPY1で次の加工を行うと、transparent=1や、背景セルとして配置した時のマスク指定が機能しなくなります。

  • filter=1~6filter=9filter=10
  • 全てのcolormap
  • noise=1と、noisepoint0以外を指定
  • noise=234

※ ただし全てpaintmode=3以外の時

なお、CardWirth 1.50では挙動が異なります。バージョン間の互換性情報の当該項目を参照してください。

JPY1でbackwidthにマイナス値を指定すると消滅する

[init]セクションでbackwidth-1以下の値を指定すると当該JPY1ファイルが全く機能せず、事実上消滅します。backheight=-1は、ドキュメント通りサイズの自動計算として動作します。

JPY1でwidthにマイナス値とdirtype=2を指定するとそれ以降の処理が飛ばされる

JPY1のセクションでdirtype=2を指定し、かつwidth-1以下の値を指定すると、当該セクション以降の処理が消滅したかのように動作します。height=-1は、ドキュメント通りサイズの自動計算として動作します。

clip指定時に透過ピクセルが切り取り後の左上となる仕様がドキュメントに載っていない

CardWirthでは透過(マスク)色は左上のピクセルのものと決まっていますが、JPY1でclipを指定した時は切り取り後の左上座標になります。これはおそらく仕様ですが、ドキュメントに記されていないので注意が必要です。


JPTX

JPTXでantialias=1の時のフォントサイズの計算がおかしくなる

JPTXでantialias=1を指定すると、フォントのサイズ計算が若干おかしくなります。具体的には、一般的な環境で13ピクセルを指定すると13.5ピクセル、14ピクセルを指定すると14.5ピクセル、15ピクセルを指定しても14.5ピクセル……程度で描画されます。

これは、おそらく、描画されたテキストにアンチエイリアスをかけるために、内部で2倍で描画して半分に縮小するという処理を行っているためだと思われます。2倍で描画するためのフォントサイズ計算時、ポイントサイズを2倍にしているのではないでしょうか。

96PPI環境でのantialias=1の時のフォントサイズは次の手順で正確に計算できるようです。

  1. ピクセルサイズ+2が4で割り切れる場合はピクセルサイズ+1
  2. 2倍サイズ = ピクセルサイズ * 72 / 96 * 2 * 96 / 72
  3. ピクセルサイズ-1が4で割り切れる場合は2倍サイズ+3
  4. 2倍サイズを半分にした値が実際に描画されるサイズ

JPTXで勝手にアンチエイリアスがかかる問題

フォントの指定がWindows APIのTextOut()関数などでアンチエイリアスがかかるものになると、antialias=0を指定していてもアンチエイリアスがかかります。

具体的には、MS P明朝MS Pゴシック等でピクセルサイズが22以上の時にアンチエイリアスがかかってしまうようです。

JPTXで<fontcolor="blue">のようなスペース抜け表記が有効になる

<fontcolor="blue">のような記述が<font color="blue">のように機能します。


JPDC

JPDCのcopymodeのデフォルト値がドキュメントと異なる

ドキュメントには「始めは2で一時描画すると1の値を取る」と書いてありますが、実際には始めが1で一時描画後に2となるようです。

JPDCによるイメージのファイル保存について

JPDCではsaveFileNameの指定によって撮影した画像を保存できますが、この仕様には問題があります。

  • シナリオ自体を上書きします。そのため、プレイヤーが予期せぬ所でシナリオの内容が変わってしまう上、宿Aで撮影のあるシナリオをプレイし、宿Bでそのシナリオを開くと、宿Aで撮影されたイメージが出てきてしまいます。
  • CAB圧縮されたシナリオを直接プレイすると、一時展開されたフォルダ内に撮影されたイメージが入るため、一時展開先が削除されると撮影されたイメージも消滅してしまいます。

CardWirthPyでは撮影イメージを宿毎に保存するようにする事でこれらの問題を解決しています。

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

互換性問題です。バージョン間の互換性情報の当該項目を参照してください。

Updated