α⇔X+,M互換方法

同じmotion.lstで動くαとX+とKFM。互換性は高いけど処理は違う。
せっかく同じmotion.lstで作っているのに、X+やMでは動かないとかもったいないです。
誤差まとめを元に考えましたので、互換を考えている方は参考にされて下さい。


★互換法1.αかKFMか判定する(αかX+である)
 KFMではFLAGの10番と3番であるターゲット設定と食らい分岐がサポートされていない。
 これを逆手に取り、自分対象に強制ヒットをかけて食らい分岐させれば、αでは絶対にそちらへ移動し、
 KFMではスルーされる。

★互換法2.αかX+か判定する(αである)
 X+ではガードの飛び道具待機待ち強制ヒット『H2』がサポートされていない。
 これを逆手に取り、無敵の自分対象にH2強制ヒットをかけて食らい分岐させれば、αでは絶対にそちらへ移動し、
 X+ではスルーされる。(H2は0と同等の効果になるので、攻撃判定が、無敵の自分に触れてもヒットしない)

★互換法3.αかX+か判定する(αである)
 X+では、FLAGの2番である飛び道具相殺『E』がサポートされていない。
 これを逆手に取り、自分の飛び道具同士を相殺させれば、αでは絶対にそちらへ移動し、
 X+では処理されない。

他にも、FLAG2番の『A』はX+では本体のみサポートし、KFMではサポートしないので
飛び道具を強制ヒットさせて(KFMではヒットしない)、それ以降の処理を書くという手もある。
ただし、全てに言えることだが判定には2F以上を要する。
自分の飛び道具同士の判定では最大5F必要とするが、実際には一瞬(1F)で処理される。

■効果を発揮するのに必要なフレーム数
 2・・・音、移動、キャンセル、Flag(振り向き、飛び道具発射)(KFX+)
 3・・・判定(飛び道具vs本体)
 4・・・判定(飛び道具vs飛び道具)

 透過加算合成(-.1+)と深さを追加した場合は、さらに+1F

これらは、初回行の処理がなされないことによる影響である。

判定に関して、判定矩形の幅や高さが移動値より下回っている時は判定や相殺をしないので注意が必要だ。
(例えば自分基準にしている小さな飛び道具がある状態で、急に999などのものすごい勢いで移動すると、判定が重ならない)


★互換法4.X+で相殺を再現する
 2番の飛び道具が出ていない時にしか発動できないコマンド『?』にキャンセルフラグを立てて、
 キャンセルフラグの立った飛び道具と同時に、相殺判定のある2番の飛び道具を射出する。
 後はその2番飛び道具が消去(相殺)されれば、キャンセルフラグの立った飛び道具が自動で移行発動されるので、相殺の挙動のように見える。

ex)
・command.lst
CmdNum--Command--Cancel-------------Std-AmnNum---Vx---Comment
     0        n  00000              000      0   -1   ;立ち
   100      26p  00000              000   1000   -1   ;なんか出たー
   101        ?  0000001            000   1050    2   ;-相殺発動
 ;                    -2番

・motion.lst
--R---G---B---G-maxShotNum:99:#1:1:1:--LIFE:100%
  0   0 255  16
 ; 1.何でも:2.相殺発動用;3.X+互換用ダミー;4.X+互換用ダミー
-Num---To-Sp--Pic-----De-Ci---V----VxRx--- VyRy---C-CL--G----Da----Hit-H-Flag-------Def1----------Def2---------Att1----------COMMENT
   0    0  1    1      0  0   9     0 1     0 0   9 -1  0     0      0 9 0000       112060012000  112060012000 000000000000  ;立

1000    0  1    2      0 43   9     0 1     0 0   9 -1  0     0   1010 9 2000       112060012000  112060012000 000000000000  ;なんか出たー

1010 1010 -1    3      0 43   9   100 1     0 0   9  1  U     0   1020 1 1000       000000000000  000000000000 112060012000  ;飛び道具(spを-1にしているので1020の飛び道具は一回しか出ない)
1020 1020  1    4      0 43   9   100 1     0 0  -2  0  0     0      0 1 0000       000000000000  000000000000 000000000000  ;相殺待ち
1050 1050  1    5      0 43   9     0 1     0 0   9 -1  0     0      0 9 0000       000000000000  000000000000 000000000000  ;1010の飛び道具が消されたら自動で発動するよ
ただし、この場合個別の相殺はできない。
画面上から全ての2番飛び道具が消されないと発動されないので、個別の場合は別途考える必要がある。
基本的に同じ飛び道具を出せないようにする(command.lstのVxを-1にしない)か、出せる飛び道具の数(maxShotNum)を限定し、
画面全体の移行処理として書くと良いだろう。


・その他の互換

★飛龍++氏の判定エディタで、エラーチェックのエラーを少なくする
 α追加機能の加算処理などをたくさん書いていると相当数出るが、それでもなるべく正しく書いていたいところ。
 以下、見るところを書く。αモードでmotion.lstについてヒントまで表示させたときの場合。ファイル出力して検索すると良い。

・『どこからも』
 基本的に使われていない行。
 今後の為にとっておいてあるかもしれないが、きっと使わないのでさっさと削除しよう。

・『参照先』
 存在しない行を設定している。
 主に、toで-1と書いておきながらその直後の行が1ズレていたりする。おそらくコピペミス。
 行番号を修正するか、正しい行先を指定しよう。

・『範囲外』
 主に飛び道具消去などでpicを『999』に設定しているときに見られる。
 255を設定しよう。255に絵を使われているなら0を、0に絵を使われているなら『-』(ハイフン)を設定しよう。
 ただし、『-』(ハイフン)は飛び道具発生時の初回行に設定するなら良いが、
 飛び道具処理の最後に記述すると、『-』(ハイフン)直前の最後行picを持続させてしまうので注意が必要。

・『(○○○○)として』
 飛び道具がキャンセルフラグを持っており、そこから派生した移行先が飛び道具消去になっている。
 キャンセルフラグで移行できる可能性のあるものは、キャラ本体の移行先として見られてしまうので、
 キャンセルフラグから派生した飛び道具の移行先は、通常の飛び道具とは別に専用の消去行などを用意しよう。

・『有効な文字ではありません』
 Gに2がついている。2をつけていいのはNだけ。X+では防御無視の0とみなされてしまう。
 もしどうしても反映させたい場合は、N2とUなどを交互にした行に更新しよう。

・『変換できません』
 逆にこれは見なくていいところ。
 picの上下反転や、α特有の加算処理『.』『+』『-』『<』『>』を利用しているところである。
 『-255.9-』とか使っているとむちゃくちゃになったりするので、その加算処理などがどうしても必要な場合は
 スルーするか出力ファイルから該当部分を削除しよう。


★飛び道具に重さをつける
 これはαやX+の互換とは違うが書いておく。キャラと飛び道具の互換である。
 KFA1.5では、飛び道具のRy『2』が上手く動作しない(※)。
 もしうまく動作したなら、toが同行でSpが『1』、Ryが『2』でVyが『16』などして繰り返せば1行で済んだ。
 本体がジャンプした時Ryが『0』の時のような挙動を再現するには個別に指定する必要がある。
 なお、本体がジャンプした時は、そのジャンプ量から1F毎にキャラの重さを減算した値が加算されていくので、
 それと同等のことを書けばよい。

大体、キャラのジャンプ力は平均で重さx10だが、ここでは浮き食らいをした時の量『200』を例にする。
また、キャラの重さを『16』と仮定する(DLしたキャラで一番多い重さがこれだった)
関係ないが、秀丸で正規表現検索すれば、よほどひどい書式で書かれていなければ大抵ヒットする。

・重さの調べ方
検索『... *... *... [0-9][0-9] *\n』
ファイル『motion*.lst』
チェック『正規表現』

・重さの付いた飛び道具の落下までのフレーム数(&落下の標準)
 F plsY  sumY
 1  200
 2  184   384
 3  168   552 通常ジャンプの平均高さ(重さx10)
 4  152   704
 5  136   840
 6  120   960
 7  104  1064
 8   88  1152
 9   72  1224
10   56  1280
11   40  1320
12   24  1344
13    8  1356
14   -8
15  -24
16  -40
17  -56
18  -72
19  -88
20 -104
21 -120
22 -136
23 -152
24 -168
25 -184       地上から食らって、理論上のギリギリ直前(Max)
26 -200       地上から食らって、理論上の接地
27 -216  -416 地上から食らって、実際のギリギリ直前(α)
28 -232  -648 地上から食らって、実際の接地
29 -248  -896
30 -264 -1160 地上→最高点から食らって、理論上のギリギリ直前
31 -280 -1440 地上→最高点から食らって、理論上の接地
32 -296 -1736 地上→最高点から食らって、実際のギリギリ直前
33 -312 -2048 ジャンプ中→最高点から食らって、実際のギリギリ直前?
お分かり頂けるだろうか?
左に書いてあるFは、何フレーム目かということである。
plsYは初回移動量に伴い、キャラの重さ分減算されていく値である。(計算間違いしてたらゴメンw)

sumYは実際のYの位置となる。
厳密に言えば、ステージのYが最大240(処理上では2400)ならば、
地面部分が画面から16ドット(160)分上にオフセットされている例外を除けば
Ryが9でVyが0の位置から、sumY÷10(処理上)の位置となる。
もし飛び道具をキャラのように落下させたい場合は、Ryを1にして上記plsYのようにVyを指定すると再現できる。

蛇足だが、攻撃レベル4食らい(複数回浮き食らい)した時の動作も確認してみた。
プレイしながらだったので実際の最高点かどうかはご愛嬌ということで。
33F目では、重さ16のキャラが200で上昇した時、-2048の速度で動いているということになる。
(αでは相手操作した時のCiが43か53かでも動きが違うので詳細は不明)

ただ、実際のゲーム上でのフレームはヒットストップが関係するのか、理論上の計算と実際がズレている。
KFMでは理論上と同等の動きをする。
自分のメモ的な感じで書いてあるので、表現がわかりにくいところは申し訳。

(※ちなみに、2012/11/07時点での最新ver KFA1.5.1.2では、正常動作するようになっています。
 X+やMでは既に正常動作します)