全ての元凶
(source: https://twitter.com/n2n2n2n2/status/1138422226867220482 )
というわけで踏みックマーケット (フミケット、フミケ) の制作記です。
今回のテーマは単純に「SM5luaでこれだけのものが動かせる」という一つの基準を作ることでした。理由については
・前回優勝者のえぬつーさんからドキドキ・フレン・シーフォなんてリプライが飛んできた
・自分のlua系作品が散乱しているためどこまで実現できるかわかりにくい
の2点がかなり大きく、それに次いで
・luaだからこそ表現できるものを明確に示す
・luaを書きたいときに参考にできるファイルを残す
というlua系譜面の普及もそれなりにありました。
自分自身プログラミングを特に学んだこともなく、それほど複雑な処理もしていない(1500行超えの本編でさえコア部分は100行くらい)ので結果としてluaベンチマークとしては微妙な仕上がりにはなってしまいましたが、できる範囲内では可能な限り作りこむことを優先しました。
以下、各譜面についてプレイ順に紹介します。
・土管に入るとCROSS†OVERに分岐してしまうフレン
フミケット提出譜面①: 土管に入るとCROSS†OVERに分岐してしまうフレン pic.twitter.com/G8YKzffybY
— paraphrohn (@paraphrohn) August 17, 2019
正直これ以外の何物でもないです。最初は全然作るつもりなかったんですが、本編とOP作り終わった時点で残り時間が30秒くらいしかなかったことと、こんなリプライを貰ったので作ることにしました。
土管に入るとCROSS†OVERに分岐してしまうスーパーフレンブラザーズ
— えなじ〜 (@nablaenergy_21) July 17, 2019
マリオ動かしても面白くなくない?っていうかそれステマニでやる意味なくない?正男でやっとけみたいな感じだったんですが、確かにフレンの顔を動かしたらITG感出て良いなと。というわけで5時間くらいでやっつけで作りました。SM5Conversion含めても10時間かかってるかどうかくらいです。
BGはTales of Vesperiaのエフミドの丘 (ToV公式サイトのキャラ紹介欄背景です)を引用、FGの地形や看板はプレイ動画からそのまま切り抜いて加工しています。
lua要素としては
・入力の検知 (SM5/notITG)
・曲のリセット/変更/強制開始
・曲をまたいだライフ管理
・FGの連続アップデート
など割と盛りだくさんです。いずれも過去作品に搭載したものを寄せ集めています。
入力検知を最初に導入したのは6月18日、CG Projectです。
プレイ中に散々フレン・シーフォが邪魔してきた挙句クソみたいなクイズに正解しないとCROSS†OVERに分岐してしまうCG Project DX13 pic.twitter.com/pFslURxZbz
— paraphrohn (@paraphrohn) June 18, 2019
入力検知自体はTaroNuke先生のSpider Danceを参考に作っています。感謝。踏みゲーの楽しい点のひとつとして身体を動かすことがあると思っているので、入力検知による別ゲー操作も割と楽しいんじゃないかと。なので別ゲーやらせても問題ないかなって。
実装についてはSpider Danceとほぼ同じなので省略します。
曲のリセットなどについては7月20日、およしさんとの会話を経まして方針を確立、
確かにこの方法なら好きな曲の好きな譜面を呼び出せますね。
— およし🍀 (@waiei) July 20, 2019
ScreenGameplayに遷移するたびにステージ数カウント上がるんでFINALステージで選曲すると勝手にEXステージになるという副作用が出るのはまあ…EVENTモードなら気にしなくていい話ですしね
その後7月21日にShiny World (openITG対応版) として実際に搭載しました。
openITG対応しました。Final Stage限定でExtra Stage扱いのCROSS†OVERに分岐します(そしてライフゲージがバグる) pic.twitter.com/7o0RF0dFQf
— paraphrohn (@paraphrohn) July 21, 2019
実装もこのリプライツリーの中にある通りです。おそらく僕の学んだlua技術としては最も新しいもので、そもそもSCREENMAN:を使ったことがこれまでありませんでした。MODS譜面作るなら必須技術ですが、僕の目指してる方針とは違ったわけです。
曲をまたいだライフ管理については実は作品としては残っていないのですが、複数のlua作品を連続してプレイした際によくわからない挙動をすることがあって、実はlua内で使った変数はソフト落とすまで記憶されていることに気付いたのがきっかけでした。
今回は曲リセット時にはライフを減らして、そうでないときには9に設定する処理をしています。
(曲開始時)
(フレンが死んだとき)
FlynnDiedはフレンが死んだときにtrueになり、フレンが全滅するか、土管に入った時にfalseになるbooleanです。なのでフレンが死んだ後にescapeで選曲画面に戻ってもライフは9に戻りません。
FGの連続アップデートは6月20日、火花散らしてremixで実装したものです。
矢印を踏むとそっちの向きに動くフレン・シーフォ (何もしなくても画面中央でフラフラしてる) を画面外に出してしまうと増えてしまう火花散らして (vs. Flynn Scifo Bootleg remix) pic.twitter.com/NQ26uEgQno
— paraphrohn (@paraphrohn) June 20, 2019
UpdateCommandが走るたびにFlynnUpdateMessageCommandを飛ばすようにして、それをフレンの画像を表示するレイヤーで受け取って更新しています。
更新先の座標は、現在の座標に各ボタンが押されているかどうかで増分を足して計算しています。縦軸方向は毎フレーム0.15pixelの重力加速度を加えています。
実装については割と複雑なのでluaを見て頂くのが一番速いかと思います。足場の当たり判定がある領域とない領域で分けて演算しているのでなかなかの汚さです。例えば今後足場を増やしたり、敵を置いたりする場合には当たり判定を設定する関数などを用意する必要がありますが、そこまでしてステマニでマリオをやりたいかというお話。
1画面、足場も1/3程度、オブジェクトは土管のみという条件でとりうる行動すべてを詰め込みました。制限時間が10秒というのも「残った30秒 - CROSS†OVERの20秒」という雑な決め方しましたが、ルールを理解して土管に入るor自殺するのには十分、かつ時間切れになったらどうなるのかという知的好奇心を満たす際にも長すぎないというのでいいくらいの設定になっていた印象でした。
総じて製作時間は短いものの、文脈に乗った完全な一発ネタとして、またある程度の遊びを持った譜面(?)として楽しんでいただけたようでかなり嬉しかったです。また結果としてフレン・シーフォ3連続の雰囲気も十分作ってくれたかなと。
ちなみに.smファイルは10秒くらいでできました。OVER分はShiny Worldの譜面のタイトル変えただけです。
そういえばこれ、クソ枠で投げたはずなんですけど。
・ドキドキ☆フレン・シーフォ OP
まあ流石に1曲くらいはまともに音ゲーする譜面作らないとな、とか、cross timeってCROSS†OVERっぽいよな、とか、まあとにかくそんな感じでフレン・シーフォは出しつつも箸休めのつもりで書きました。
こいつのせいでダメになりました。
そういうわけです。
ところで僕、生まれてこの方まともに絵とか描いてなかったんですが、5月中旬に緊急入院した際、あまりにもやることが無かったので毎食渡される献立表の裏を利用して絵の練習を始めることにしました。もちろんこの動画用の絵を描くためです。
ただ練習の方法も全然分からなかったのでカスタムキャストで作ったフレン・シーフォにいろんなポーズを取らせ、「身体を10分以内に模写する」と「顔を30分かけて描く」の二つを交互に練習してました。献立表が8x6 cmくらいしかない小さいものだったので、小さい絵を4個描いては捨ててました。何やってるんですかね。
さて曲ですが、kooridoriさんが第二回 BMS衆議院選に提出されたHappy Blazing Summer!!!を使用させてもらっています。
そもそもハピコアが好きなのと、ハピコアに合わせて振り回し踏むのが好きなのと、曲調も夏感溢れていてちょうど良かったので迷わず決定しました。多分曲聴き始めてから決めるまで30秒くらいだったと思います。
曲自体もフレン・シーフォの音声を乗せたほかにいくつか踏みゲーとしての展開を作るために変更を加えています。ぜひ聞き比べてみてください。
ムービーについては上にも書いた通りPump It Up版Cross Timeのオマージュ(というかトレス)になっています。
登場人物が赤と青で、CROSS†OVERも赤と青なのでぜひコラボさせたいなとずっと思ってたんですね。結局相方はフレン・シーフォになっちゃいましたがなんとか形にできました。本当はモーセの十戒地帯も再現したかったんですが時間が足りず。作画40時間に対してムービーは4時間くらいしかかけてないです。いや本当に時間が無くて。
フレン・シーフォが満面の笑みなのに対してオルタがむすっとしてるあたりにストーリー性を感じて頂ければと思います。
もともとまとも枠として作ってたぶん譜面は本当にまともで、配信中もまとも枠でいいのではって散々言われてましたが結局CROSS†OVERが全部轢き殺していってくれるという安心感があったのでニヤニヤしながら見られました。
luaについてはほとんどCG Projectの引用とFG出してるだけなので特筆すべき点は無いです。だってまとも枠だし。みんなTales of Vesperia REMASTERED、買おう!
・ドキドキ☆フレン・シーフォ 本編
これは本当に何。
まあ元はと言えばえぬつーさんがすべて悪いんですけど、luaの限界を示しつつ、すごい勢いで提供されまくった小ネタを消化するなら物語形式が一番収拾付けやすかったんですよね。
長くなるので最初に配信での感想を述べますとほんと滑らなくてよかったなと。直前まで超ビクビクしてました。田頭で全部ぶっ飛んじゃったので本番はめちゃくちゃ笑ってましたが、それでも僕の心がずっとドキドキでした。シーンってなったらもうどうしようかと。それでもひさくんさんはじめ配信者の皆様のリアクションだったりコメントだったりで盛り上げてくれて本当に助かりました。感謝感激。ありがとうございます。
小ネタについては提供されたり自分で使いたいなって思った奴だったりを並べて(スタッフロールに載せています)いるだけですが、これ全部を話として繋げたうえでフレン・シーフォとCROSS†OVER要素を同居させるの無理では……?ってなってしまい結局シナリオは丸投げしました。その結果今回の内容と全然関係ない部分ばかり構成してくれてあんまり意味なかったんですが。。。そもそもCROSS†OVERが要素として重すぎるのでしょうがないんですが。そして努力が報われないままTo Be Continued扱いされるかわいそうなシナリオ担当。
ともあれノベルゲーなので立ち絵が必要で、それが上のOPで書いた絵の練習に繋がるんですがそのあたりは省略します。だいたい絵1枚当たり10時間、やる気のなかったRobot Battle D23マンだけ5時間かかっています。
曲に関してはOPとの統一感を持たせつつ夏感を出すために引き続きHappy Blazing Summer!!!をメインに起用しつつ他の曲を場面に合わせフェードインさせたりしてます。また最後にスタッフロールという名の責任転嫁の場を入れながら罰ゲームするのが確定していたので、最後2分はCROSS†OVERで統一してました。
さてluaです。
まず画面のレイアウトについてですが、立ち絵とか会話文とか名札とか全部別々のレイヤーに表示してluaの上で調整しています。ぱっと見FG動画流してる風にも見えますけど全然そんなことないです。
というのもaviutlで動画作って流す形式だと尺に合わせた微調整がマジでめんどくさいのと、そもそもluaで書いた方がさっさと作れちゃうからなんですね。aviutl慣れてないですし。
例えばこんな感じです。これは会話文の枠レイヤーです。
大量にMessageCommandが並んでますが、これはUpdateCommandから流しています。つまり
こういうことです。絵を出したりしまったりするタイミングを拍数で管理できるので秒数変換もやりやすく、尺の微調整に役立ちました。
文字類についてはStepManiaで文字を出力する方法が分からなかったので全部画像に格納しています。
(文字色が白じゃないのが選択肢しかありませんでした)
こんな感じで一つの画像に並べて3x3指定して、setstateで動かせるようになっています。
]
そして別途文字類用のテーブルを拍数, stateの配列として用意して、
UpdateCommandのなかで目的のstateを読んでmessageを流します。
stateを読んであるので、文字列側の関数はめちゃくちゃシンプルにsetstateし直すだけで終わりです。比較的楽に実装できました。
ただこの方法には問題があって、SM5は画像解像度の上限が2000x2000なんですね。これが何を意味するかと言えば
会話文のサイズ 960x130
2000x2000に収まる会話の数 28
実際の会話の数 53
つまり画像が1枚じゃ足りないということです。というわけで会話文の画像は2つに分かれていて、
こんな感じで29個目の会話文を読みだすときに表示する画像を変更しています。
またここに写っているとおり選択肢に対する反応については、読み込むstateに選択肢をかませて分岐させています。
ちなみに表情も同様に分岐しています。
選択肢はやはりTaroNuke先生のInputHandlerを使っています。ただUpdateCommandで読む意味がなさそうだったので、直接messageを流すようにしています。
文字類と同じようにAnswerをstateとしてmessageを流し、選択肢側のレイヤーでsetstateし直すことで選択肢を表現しています。選択肢のstateは全部光ってる状態と、一つだけが光ってる状態3種類の4種類を2x2の画像としています。そっちの方が楽だったので。
そして好感度アップ。これはランダムな座標に発生させた24枚のハートを、またランダムな方向に動かしてそれっぽい演出にしています。
こんなレイヤーが24枚。ここだけで500行くらい増えてます。
基本的なシステムはここまでで完成していて、画像レイヤーと各種多次元配列を含まなければ単純なUpdateCommandがmessage飛ばしているだけという極めてシンプルなものになっています。誰でも作れます。本当に。
で、ここから小ネタを挟みまくって無理矢理会場を盛り上げていこうというわけです。
FULL MODEに入るネタは6月21日、Haloで実装していました。
>の形の階段配置を踏むたびにFULL MODEに突入してどんどん背景がうるさくなっていくHalo SX13 pic.twitter.com/WGWrIN0VUk
— paraphrohn (@paraphrohn) June 21, 2019
これをなんとか利用したかったわけですが、「曲の中に選曲画面を作る」という力技で無理矢理応用先を作り出しました。CROSS†OVERからは逃げられない。おそらく今回唯一の自力で出したネタじゃないかと思います。選曲画面はなかなか気合が入っています。
基本的にはこの画像を動かしつつ、枠+曲名の画像の透明度を弄ってそれっぽくしています。本当はスクロール音も入れたかったんですがいい素材が見つかりませんでした……あと上の画像が解像度2000x2000なんですが、1枚だけだと全力で選曲画面動かしたときに画像の端が見えてしまったので3枚横に並べて無理矢理対策してます。
またパネル連打の対策のため、IsMovingがtrueの間はInputHandlerがmessage流さないようにしてあります。これやんないとfinishtweeningが間に合わず選曲画面が動いてる後ろでCROSS†OVERの譜面が流れる無理ゲーになってしまいました。
Hello WilliamはFGでムービー流してるだけなんで基本的には超簡単です。ただFLYNN SCIFO DERBYのロゴだけ全力で動かしてます。透過aviが使えれば解決なんですけど、ITGは非対応なもので。そもそもただ画像を揺らすだけのavi作るのも馬鹿らしいです。
画像も手作りで、普通にGIMPで文字を書いた後不透明部分を選択→選択領域の拡大で枠を作り、さらに上からdarken onlyで適当なテクスチャを重ねてそれっぽい見た目にしています。
また1949の方のRUNの画像はmorphさんに提供していただきました。仕事速すぎてめっちゃビビりました。試しに置いてみたら全く違和感なくてもっとビビりました。本当にありがとうございます。
1949以降はただbgで動画流してるだけですね。めっちゃ楽です。別に飽きたわけではなく展開的にそうせざるを得なかっただけです。
ただスタッフロールには意外に気合が入ってます。例えば左側に表示される動画ですが
当日ひさくんさんがここで死ぬと予想してスタッフロール中でも死んでます。
そして全力で責任を転嫁しに行きます。こうやって見ると本当にオリジナルの要素がない譜面群ですね。
恐らくほとんどの人が気付かなかったであろうspecial thanks ひさくんの1文。0.6秒後にCROSS†OVERが始まるのでまず見えないです。企画を開いていただいている感謝を表すと同時に、CROSS†OVERにも感謝していることを表しています。
最後のポッター。実はこれも元ネタがあります。
O Harry Potterとかいうゴミ譜面出てきたけど
— paraphrohn (@paraphrohn) May 25, 2019
O Harry Potterとかいうゴミ譜面をかつて作ったのですが、発想としては2分間全押しを連打させた後に超低速で地雷全押しが降ってきて、判定ライン直前で地雷8個のうち7個が実ノートに変化して落とすと死ぬ、ただ地雷を踏んでも死ぬ上に音割れポッターが流れるというサイコパス感あふれるBMS譜面でした。
ただこのギミックを実装する際に適当にBPMを9999999999とかに設定したらBPMがオーバーフローしてしまいまして、判定ライン直前で地雷全押しが逆走していくという極めてシュールな光景に早変わり。これやべえよやべえよって話をしたら「音割れポッター流しながら逆流したら最高のエンターテインメントでしょ」とか言われたんでそういう実装となってゴミが完成しました。これをStepManiaに移植したのが今回のポッター出演です。
あと貰ったシナリオにポッターがいっぱい出てきたので調子乗ってポッターもあるよ!みたいな一文を追加したのに尺の都合で一切出てこなかったのでどこかでポッター出したかったというのもあったり。
ともあれ作画50時間、動画編集10時間を含む合計100時間程度を費やした3譜面でしたが、制作中はものすごく楽しくて本当にこの企画参加してよかったなと心から思いました。そのうえで嬉しい評価もいただいて家主賞も受賞とこの上ない結果を残せてうれしさ半分安堵半分という。luaの限界を示すのが目的で受賞が目的ではない……とはしつつも、これだけ時間かけちゃったから何かしら受賞しないとすげー悲しいだろうなというエゴに満ちた心情だったので救われました。
正直次回にこれだけのやる気を持ち越せるかと言えばNOですし、フレン枠で隔離しろという声も強いので、次出すとしたら数人の合作で何かしらフレンっぽいものを作りつつ、いつも通りの普通の譜面を出すことになるんじゃないかなと思います。
またそろそろ脱CROSS†OVERという話もかなり出てきているので別のmemeを生成していければと。何になるかは大体決まってますが流行ってくれるかどうかはまた別。