ITGギミック制作記6: StepMania5への対応 (1)

一通りStepManiaもしくはITGの譜面が作れるようになって、ちょっとギミックを使って演出を強化したりプレイヤーの邪魔をしたりしたいな、という方向けにいくつか記事を書いていこうと思います。特別編です。

 今回は、ITG向けに書いたluaをStepMania5で動かせるようにするための第一歩について説明します。

 いつか紹介しましたが、ITGはdefault.xmlを読みに行くのに対して、SM5はdefault.luaを読みに行きます。なので、まずはdefault.xmlをコピーしてdefault.luaを作成します。

f:id:paraphrohn:20190915210402p:plain

で、今回は下のdefault.xmlをSM5用に書き直します。

f:id:paraphrohn:20190915211125p:plain

 

答えです。

f:id:paraphrohn:20190915211350p:plain

ほとんど変わりません。一つずつ見に行きましょう。

 

<ActorFrame><children> </children></ActorFrame>

return Def.ActorFrame{}

xmlでは基本<>で囲んで取り扱いますが、luaでは{}で囲んで取り扱います。

また、最終的に全体を囲んでいるActorFrameを出力しますので、returnを頭に付けます。

ちなみに、ポッターとかで見られる t = Def.ActorFrame{} / return tという形式は、tをActorFrameとして定義してtを出力させているだけで特に変わりありません。

 

<Layer Type="Quad" />

Def.Quad{},

上に同じく。Layerを{}で囲みます。ちなみに、画像とかを読み込む場合、xmlでは

<Layer File="" />という形でしたが、luaではLoadActor("")..{}という形になります。なお末尾のカンマを忘れるとluaがほぼほぼ動作しません。しかもSM5はluaがバグっていた場合エラーも吐かずにただ読み込まないだけなのでエラー部位の特定が極めて難しいです。xmlはカンマ周り適当でもなんとかなること多いんですけどねえ。

 

InitCommand="hidden,1;sleep,9999

InitCommand=cmd(visible,false;sleep,9999),

コマンドの省略形は"ではなくcmd()で囲むようになりました。

また、hidden命令は使えずvisible,true/falseで代用するほか、末尾のカンマを付け忘れるとやっぱりluaが動作しないことがほどんどなのでご注意を。

 

OnCommand="%function(self) end"

OnCommand=function(self) end,

"%が不必要になりました。あと赤字で示してますがカンマを忘れるとやっぱり動作しません。

 

for i = 1, 32 do (ハイスピ読み込み)

for i = 1, 160 do

これは単純にSimplyLoveがデフォルトで0.05単位でハイスピ設定できるからですね。

実際にはプレイヤーが使ってるオプションをまとめて取得する手法があるので、そちらを利用したほうが良いんですが、まあそれはおいおい説明しようと思います。まずはこれで動くことが大事です。

 

ApplyGameCommand('mod, ')について

上の例では*10000を残してありますが、SM5ではどんな数字を入れても一瞬で変化します。なのでゆっくり変化させたいときには使えず、別の手段を取ることになります。その紹介もまた今度……というかまだ勉強してないところです。まあ、sscの機能としてオプションはある程度弄れますので、そちらで対応しているのが現状です。

それと、SM5はApplyGameCommandで弄ったオプションが曲終了後も持続します。つまり、曲の終わりにハイスピを半分にする命令を出した場合、次の曲でのデフォルトハイスピが半分になってます。 ステルスとかも全部残るのでご注意を。

 

 

とりあえず今回はやる気がないのでこんなところです。まずは上のような書き換えでSM5で動かせるかどうかを試してみてください。最低限動かせるようになってから足りない部分を補っていくのが基本だと思っているので、ここを乗り越えるのが一番大事です。