VF2の入力について調べる
入力猶予に関するやり取りを発端として、様々な入力について試してみたのでまとめておきます。
検証結果は、成立することを保証するものではなく、また、成立しなかったケースを否定するものでもありません。
あくまで当方での検証結果をシステム理解のためのヒントとしてまとめたものです。
スプラッシュマウンテンについて(ジェフリー)
まずはスプラッシュマウンテンの入力について整理してみます。
あくまでコマンドを自動入力するための検証なので、しゃがみダッシュからスプラッシュマウンテンを入れる通称すべりスプラについては触れません。
具体的にはスプラッシュマウンテンを3N3P+Kで入力する際のニュートラルのフレーム数について確認します。
最速スプラ
まずは最速スプラです。
負論理なので、レバー・ボタンの波形が高い時(+5V)は入力なし、低い時(0V)は入力ありです。
うちにあるのは4chオシロスコープなので残念ながらレバー・ボタンの全てを確認することはできず、以下のように割り当てました。
上から
・V-SYNC(垂直同期信号)
・レバー下
・Pボタン
・Kボタン
です。
V-SYNC(垂直同期信号)のFALLING(波が下がる)時に割り込みをかけて入力データの出力を行っています。
3N3のニュートラルは1フレームでもスプラッシュマウンテンが成立しています。
この時の配列データは以下の通り。
3N3P+KのNは1フレーム。
3P+Kは同時に入力しています。
1 2 3 4 5 6 7 8 9 10 | volatile byte action[] = { //UDLRGPKE B11111111, B10101111, B11111111, B10101001, B11111111, ・・・ |
再遅スプラ
今度は一番入力が遅いスプラッシュマウンテンです。
3N3P+Kのニュートラルは最大で25フレームまでスプラッシュマウンテンが成立しました。
スプラッシュマウンテンの成立には入力開始(最初の3入力)から最後の3P+Kまでの全体フレームが関係しているような気がします。
今回のケースでは最後の3P+Kが完全に同時入力できているため、ニュートラル部分のフレーム数を最大で取れている可能性が高いです。
そのためニュートラルが25フレームまで有効であることを保証するものではありません。
26Fスプラ失敗
3N3P+Kのニュートラルを26フレームにするとスプラッシュマウンテンは成立しませんでした。
入力猶予などの検証(VF2.1)
ジェフリー 3N3P+K,G
3N3P+Kというスプラッシュマウンテンが成立する入力を行ったままの状態で、次のフレームでGボタンを押してみます。
入力猶予で立ち投げ/下段投げの投げ自動2択が実現できるかの検証。
1 2 3 4 5 6 7 8 9 10 11 | volatile byte action[] = { //UDLRGPKE B11111111, B10101111, B11111111, B10101001, B10100001, B11111111, ・・・ |
しゃがみ状態で下段投げ、投げ失敗時にはしゃがみパンチ。
立ち投げは入りませんでした。
ニュートラルのフレーム数を変えても結果は同じでした。
上から
・V-SYNC(垂直同期信号)
・レバー下
・Pボタン
・Gボタン
です。
ジェフリー 3N3P+K,G ②
今度は3N3P+Kというスプラッシュマウンテンが成立する入力を行った後、P,Kボタンを離してGボタンを押してみます。
1 2 3 4 5 6 7 8 9 10 11 | volatile byte action[] = { //UDLRGPKE B11111111, B10101111, B11111111, B10101001, B10100111, B11111111, ・・・ |
こちらも結果は同じでした。
しゃがみ投げは入りますが立ち投げが成立しません。
上から
・V-SYNC(垂直同期信号)
・レバー下
・Pボタン
・Gボタン
です。
ジェフリー 466P+K+G,3
ジェフリーのフロントバックブリーカー(466P+K+G入力)の次のフレームでレバーを3に入力。
入力猶予でフロントバックリーカー(466P+K+G)とパワーボム(3P+K+G)の投げ2択になるかどうかの検証です。
1 2 3 4 5 6 7 8 9 10 11 12 | volatile byte action[] = { //UDLRGPKE B11111111, B11011111, B11101111, B11111111, B11100001, B10101111, B11111111, ・・・ |
上段投げかヒップアタックのどちらかとなり、下段投げは成立しませんでした。
フロントバックブリーカーの時点でP+K+G入力なので入力が確定してしまっているのかもしれません。
上から
・レバー左
・レバー右
・Pボタン
・Kボタン
です。
ジェフリー P+G,3K
P+G投げ入力の次のフレームで3Kを入力。
入力猶予により、立ち投げとしゃがみ投げ(P+K+G)の投げ2択になるかの検証。
投げ失敗時にミドルキックが出るか立ちパンチが出るかも検証したいポイントです。
1 2 3 4 5 6 7 8 9 | volatile byte action[] = { //UDLRGPKE B11111111, B11110011, B10101101, B11111111, ・・・ |
投げ失敗時はしゃがみパンチが出ました。
パワーボム(下段投げ)は成立しましたが、立ち投げは成立しませんでした。
上から
・レバー下
・Gボタン
・Pボタン
・Kボタン
です。
ウルフ3,NP+K,3G
入力猶予を利用してSSD(3N3P+K)とタイガードライバー(3P+K+G)の投げ2択は成立するかの検証です。
ジェフリーでの検証で3N3P+K,Gは失敗したため、3N3入力の間にP+Kを入力するアプローチです。
1 2 3 4 5 6 7 8 9 10 | volatile byte action[] = { //UDLRGPKE B11111111, B10101111, B11111001, B10100111, B11111111, ・・・ |
しゃがみ状態で下段投げ、投げ失敗時にはしゃがみパンチ。
立ち投げは入りませんでした。
上から
・レバー下
・Gボタン
・Pボタン
・Kボタン
です。
ウルフ 3,N,P+K,3G
間にニュートラルを1フレーム挟んだケースです。
1 2 3 4 5 6 7 8 9 10 11 | volatile byte action[] = { //UDLRGPKE B11111111, B10101111, B11111111, B11111001, B10100111, B11111111, ・・・ |
結果は変わらず、しゃがみ状態で下段投げ、投げ失敗時にはしゃがみパンチ。
立ち投げは入りませんでした。
上から
・レバー下
・Gボタン
・Pボタン
・Kボタン
です。
ウルフP+G,2
P+G投げ入力の後、入力猶予を利用してレバー下を入力。
上段投げと下段投げの投げ2択が可能かの検証です。
1 2 3 4 5 6 7 8 9 | volatile byte action[] = { //UDLRGPKE B11111111, B11110011, B10111111, B11111111, ・・・ |
これは綺麗に立ち投げ/下段投げ/しゃがみパンチの自動3択になっています。
P+G投げを兼ねながらも投げ失敗時にしゃがみパンチに化けるのもポイントが高いですね。
上から
・V-SYNC(垂直同期信号)
・レバー下
・Gボタン
・Pボタン
です。
レバーを下に入れる際にボタンを離していますが、ボタンを押したままでも結果は同じでした。
これは他の入力猶予系でも同様です。
ウルフ 4123P6
ジャイアントスイング入力の途中(コマンド完成の1F前)でパンチを入力するパターンです。
入力猶予でジャイアントスイングとアッパーの二択を狙っています。
1 2 3 4 5 6 7 8 9 10 11 12 | volatile byte action[] = { //UDLRGPKE B11111111, B11011111, B10011111, B10111111, B10101011, B11101111, B11111111, ・・・ |
想定通りジャイアントスイングとアッパーの2択になりました。
ジャイアントスイングは最速入力していますが、最後の3P6部分だけきちんと入力すれば、余裕を持った入力でもおそらく大丈夫でしょう。
しゃがみ状態からジャイアントスイングを入力すると投げ失敗時にリバーススレッジハンマー(ちゃぶ台返し)が出てしまいますが、アッパーに化けさせることができればリスク回避できると思います。
上から
・レバー左
・レバー下
・レバー右
・Pボタン
です。
ウルフ41236P
こちらは入力猶予とは異なりますが、ジャイアントスイングに関するものとしてご紹介。
先程との違いはジャイアントスイング入力の最後の6(レバー右)と同時にPボタンを押しているところです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | volatile byte action[] = { //UDLRGPKE B11111111, B11011111, B10011111, B10111111, B10101111, B11101011, // P B11111111, B11111101, // K B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110111, // Kキャン B11111111, ・・・ |
立ちパンチがジャイアントスイングの入力を兼ねています。
もちろん立ちパンチはPKキャンセルすることが可能です。
こちらも最後の6P部分だけきちんと入力すれば、おそらく余裕を持った回し方でも大丈夫だと思います。
上から
・レバー左
・レバー下
・レバー右
・Pボタン
です。
アキラ P+G,4
P+K+G以外の打撃では次のフレームまで入力が確定しませんが、投げで同じことを行ったらどうなるかの検証。
1 2 3 4 5 6 7 8 9 | volatile byte action[] = { //UDLRGPKE B11111111, B11110011, B11011111, B11111111, ・・・ |
翻胯(4P+G)が出ています。
投げ入力でも入力猶予は効くことがわかりました。
上から
・V-SYNC(垂直同期信号)
・レバー左
・Gボタン
・Pボタン
です。
アキラ P+G,K
今度はP+G投げ入力の後、Kボタンを入力した際にどの投げが出るのかという検証。
1 2 3 4 5 6 7 8 9 | volatile byte action[] = { //UDLRGPKE B11111111, B11110011, B11111101, B11111111, ・・・ |
崩拳(P+K+G)が出ています。
上から
・V-SYNC(垂直同期信号)
・Gボタン
・Pボタン
・Kボタン
です。
舜帝 P+G,2K
P+G投げ入力の後、2Kを入力したらどうなるかという検証。
1 2 3 4 5 6 7 8 9 | volatile byte action[] = { //UDLRGPKE B11111111, B11110011, B10111101, B11111111, ・・・ |
立ち投げ成立時はP+K+G投げが入り、投げ失敗時にはしゃがみパンチが出ています。
上から
・レバー下
・Pボタン
・Gボタン
・Kボタン
です。
1P側/2P側ともに自動操作させた検証
1P側/2P側の両方を自動操作させる検証の場合、これまでのように配列の要素を順に実行していくという作りだと検証しにくいため作りを変えています。
タクトSWが押されたことを検出したら、次のV-SYNC割り込みでPORT操作(入力データ出力)を行うようにしました。
(繰り返しではなく1度だけ出力)
P+G/P+K+G ①
P+K+G投げを持つキャラでP+GとP+K+Gを同時入力させた時にどうなるかという検証。
1 2 3 4 5 6 | //UDLRGPKE PORTC = B11110001; // 1P PORTA = B11110011; // 2P ・・・ |
P+G入力の投げよりもP+K+G入力の投げの方が早く成立することがわかります。
立ちパンチが出ているときは投げ間合いの外だったのだと思います。
上から
・1P側Pボタン
・1P側Gボタン
・2P側Pボタン
・2P側Gボタン
です。
同時に入力されていることがわかります。
P+G/P+K+G ②
P+K+G投げを持たないキャラでP+GとP+K+Gを同時入力させた時にどうなるかという検証。
ソースコードとオシロでの波形は先程と同じなので省略します。
1P側(P+K+G入力)のパンチが2P側(P+G入力)のパンチよりも早く出ていることがわかります。
お互い立ち状態で距離が近い時もあるのですが、立ち投げは1度も発生していません。
P+G投げは0F(即時)発動ではなく、入力猶予のため次のフレームで成立するのかもしれません。
P+K+G/P+K+G
立ちパンチの発生がともに9フレームのアキラとラウを使用して、同時にP+K+Gを入力。
投げと打撃のどちらが成立するかの検証です。
1 2 3 4 5 6 | //UDLRGPKE PORTC = B11110001; // 1P PORTA = B11110001; // 2P ・・・ |
オシロでの波形は先程と同じなので省略します。
投げが成立しました。
P+K+G投げは0F(即時)成立のようです。
VF2.0での検証
46P投げの入力確認
まずは46P投げが成立する入力になっていることを確認します。
1 2 3 4 5 6 7 8 9 | volatile byte action[] = { //UDLRGPKE B11111111, B11111111, B11011111, B11101011, B11111111, |
4,6Pで最速の46P投げが成立することが確認できました。
上から
・レバー左
・レバー右
・Gボタン
・Pボタン
です。
46P,Gの検証
46P投げ入力の次のフレームでGボタンを押してみた時の検証です。
1 2 3 4 5 6 7 8 9 10 | volatile byte action[] = { //UDLRGPKE B11111111, B11111111, B11011111, B11101011, B11110111, B11111111, |
投げ不成立時は立ちパンチが出ています。
また、立ち投げ成立時は46P投げではなくP+G投げになっています。
上から
・レバー左
・レバー右
・Gボタン
・Pボタン
です。