GAMESTATE:SetSongBeat()の使えないopenITG/StepMania5環境では譜面分岐は実質的に無理。なのでガワだけ整えて分岐してるっぽく見せかける方法で何とかする方針で。
1/2の確率でかわいそうになるおでん、openITG/StepMania5対応版の試作品。最後が上手く動いてないけど録画してなかったら綺麗に動きます pic.twitter.com/r1YYoQW9Ja
— paraphrohn (@paraphrohn) July 15, 2019
代入する数字間違えて分岐後に16分音ズレしてるけれども、まあ何とか形になったもの。基本的には実ノートの判定消しと疑似ノートスキン変更の2つを組み合わせて構成。
・実ノートの判定消し
ワープ中のノートは落としてもミス判定にならない。一方でワープ開始直後 (0.5拍以内程度) に置いてある場合は踏めば普通に反応する。ちなみに判定を消すノートからワープ終了までは1拍ちょっと無いとミス判定が出るのでやや余裕をもって設定する。これを利用して
こんな感じで分岐先を全部置いた上で判定を消してやれば、分岐している側は踏めば光ってコンボやスコアも伸びるし、見た目上分岐していない方の譜面は踏まなくてもゲージ減らないという疑似的な分岐が作れる。192分ずらしてあるのは同時判定になってしまうと両方踏まないと反応しないため。
問題はこのままだと動きがとんでもないことになる上に両方の分岐が見えてしまうことなので、これをSTEALTH100%状態でのノートスキン疑似変更luaで解決する。
・ノートスキン疑似変更lua
配列steps内のsmファイルチックな記述を扱いやすい形に変換する。具体的には
smファイルの譜面をコピペして正規表現で2回置換すれば作れるこういう形式の譜面arrayを、{{0, 4}, {4,5}, {8,3}, {12,2}}という{(拍数), (矢印位置)}という配列を要素に持つ配列(多次元配列)に変換している。同時がある場合は{{0, 147}}みたいな感じになる。
後で調べたがluaは異なる形式の値を同じ配列内に並べられるので、IsPositionedをmod_steps[i][j][2]に入れてやればもう少し綺麗に書けたと思う。あと数値のCONCATENATEのやり方を知らなかったので虚無のstringを挟んでCONCATENATEしてて極めて見苦しい。でも動いてるから弄るつもりは当分無し。
で、扱いやすいmod_stepsに変換した譜面を、Updateコマンド内で読み込んで命令を出力する。
基本はmodsと同じ形式で読んでいく。違うのは矢印位置の桁数を読んで同時の場合には複数回命令を同時に出すところと、使ってない矢印画像を探してそこに命令を出しに行くくらい。break知らない時代に作ったんでIsProcessedとかいう謎のboolean入ってるけどbreak追加した今なら消しても動くはず。でもめんどくさいので試してない。
前後するけどPositionArrowとShowArrowは2個上の画像にfunctionとして定義してある。それぞれj番目の矢印に対して、矢印位置へと移動させるのと、実際に画面内に表示させる関数。
命令を受け取る側は別の画像レイヤー。
こんな感じで16枚レイヤーを用意している。ap、arはそれぞれ1P、2P側の上下左右に対応したx軸と回転量を入れたarray。PositionArrowで矢印の位置と向きを揃えて、ShowArrowで実際に画面の下から動かす形式。
使用中 (=移動中) の矢印に対してはIsArrowUsedに使用中である旨を書き込んでおき、消えた後にfalseに戻す。仕様上、踏んでも踏まなくても判定ラインで矢印は消える。
ちなみにハイスピが3.0xの場合、BPMにかかわらず16分矢印がピッタリ8個見えるようになっているのでハイスピ依存で表示時間=移動速度を変えている。
・具体的な分岐
こんな感じで分岐先の譜面を作ってsmファイルから上記形式に変換して多次元配列step1、step2としてInitCommand内に格納しておく。
で、雑に分岐させてやる。あとはノートスキン変更が始まるタイミングでSTEALTHをかけてやれば完了
・利点
譜面が見た目上分岐できる
・欠点
内部的には分岐してないしQuadが取れなくなる
別の分岐を踏んでもスコアが入る
そもそも全く踏まなかったらゲージが減らない(Way Offでは減る)
動作が安定しない(Odinの動画でも最後から5歩目でズレが発生してそれ以降の譜面が16分速く表示されている)
・制約
各分岐の長さを揃えないと分岐によって虚無の時間が発生する
UP、mini、C mod、reverseなど非対応オプションが多い(C以外は対応予定)
ソフランできない
めんどくさい(特に192分ズレと連続ワープの配置)
・今後の課題
連続ワープ時のUpdate動作の安定化(おそらく、拍数依存ではなく時間依存にしてやればよい)
各種オプション対応(1回の初期労力だけで解決する)
疑似ゲージの作成(ゲージの変動式が分かれば……)
疑似スコアの作成(分岐を読んでノート数を算出すれば作れる)
このあたりはresult画面に影響しないので作る必要があるかどうかは不明。MAWARU INFINITYみたいに別途リザルト画面を曲内で表示させてやる必要がある。