April Fool Step Documentary 提出譜面解説

昨日行われたエイプリルフールステップドキュメンタリーに提出した譜面についての記事です。

今回は「Requiem for teneno」と「Requiem of the sky」の2曲で参加しました。

 

選曲について

曲についてはPapasito鎮魂の空Requiemザ☆ウルトラマンの順番で連想しています。意味不明ですね。

 

以前luaに関する記事の中で「似たような処理をする大量の画像」についての書き方を軽く紹介しました。ところでこういった処理がなされている代表的な譜面として怒首領Papasito大往生デスレーベルがあります。

 これのluaの中身を見てみると、

f:id:paraphrohn:20200402170821p:plain

まあこんな感じで「命令付き」の画像レイヤーが大量に並んでいて、しかも全部の中にUpdateCommandが入っている(つまり、常時UpdateCommandが50重くらい走っている)状態だったので、綺麗に書き直してみようと思いました。

ただ、綺麗に書き直すだけだと嫌がらせにしかならないので綺麗に書き直したことで実装できる機能として、弾幕のメイン要素である「被弾」を取り入れ、さらに土管シーフォとの組み合わせで実際に弾幕ゲームとして遊べる形にしようとなりました。

それで、弾幕として真・緋蜂改を流用するのもなんか情けないので、同じくCAVEシュー真ボスである真アキ&アッカを使用することに。

真アキの発狂って、

・弾源32個を楕円状に配置

・それぞれの弾源が移動しながら、楕円の焦点あたりに向けて3way/8fを発射

という構成なんですよね。この弾源の動き、割とPapasitoの手の動きに似てるので割と説得力ある弾幕構築ができると考えました。というわけで曲は真アキ第二段階BGMである鎮魂の空 (Requiem of the sky) に決定、こちらの弾幕構築に取り掛かることに。ただエイプリルフール要素が薄いので、Requiemだけを抜き出してプレビュー画面をRequiem (MAX) にすることにしました。

で、ちょうどこの頃盛り上がっていたのがDP偽装譜面企画「DOUBLE PRETENDERS」の締め切りバトルです。

 自分でザ☆ウルトラマンを出しておきながら提出が一番遅かったのがてねのさんなんですが、締め切り直前にこんなことほざいてました。

f:id:paraphrohn:20200402174548p:plain

ところでザ☆ウルトラマンの開幕ってウルトラマンが4回連続でアップになるんですが、Requiemも開幕でオケヒが4回鳴るんですよね。というわけでこの2曲をマッシュアップしてRequiem for tenenoという形で上のRequiem of the skyと並べることにしました。もちろんこちらもプレビューはRequiem (MAX)。それだけです。

 

1. Requiem for teneno / MAX

 テーマは「戒め」。お前偽装作者がどれだけ苦しんで譜面を生み出したと思ってんだ自分だけ責任逃れしようとするなという割とガチ目の怒りを込めてます。

PUMP IT UP公式のUCSサイトからRequiemのサンプルファイル落としてきて、ウルトラマンの再生速度を123.6%にして、audacityで二つ並べて、最後のドゥルルクを揃えて完成。適当な譜面を付けて合計30分くらいでできました。Requiem側は音源切り貼りしてないんですよこれ。マジで。

もう譜面もクソもないんですが、反省点としては一切の音量調整をしなかったせいでRequiemの音量が足りていないこと、最初に適当にホールド突っ込んだせいでせっかくのウルトラマンが見えなくなってしまったことです。二度とこんなことやらないつもりですが、一応反省点として記憶に残しておきます。

ちなみにこの手の譜面投稿イベントに投げた譜面としては実に初回クソフマスぶりの特殊機能(lrc,attack,lua)なしでの譜面になります。だからどうした。

 

2. Requiem of the sky / MAX

MAX(大嘘)

 テーマは「神秘感」。いや何も神秘を感じませんが……

上の動画では乱数の関係で実現できてないですが、1フレーズ目後半(0:13~)に合わせて腕が広がりラスボス (not真ボス) らしい神々しさを感じさせるように回転速度が調整してあります。また3フレーズ目 (0:25~) の頭に合わせて弾が画面下端に来るくらいに撃ち始めています。

弾幕としては

・ORIGINALでは6本、MANIACでは8本、ULTRAでは10本の腕から

・顔の中心に向けて0.375秒 =22.5frameごとに

・ORIGINALでは2way、MANIACでは3way、ULTRAでは4way

の弾を撃つようにしています。way弾の角度は±30°(のはず)。なのでウルトラモードでもせいぜい40/0.375 = 107発/秒程度で、元の真アキの1/7程度の弾幕しかない計算になります*1

一応作者自身でのULTRAの勝率が50%を超えるくらいに調整してあります。STGはそんなにうまくなくて、せいぜいiPhone虫姫さまをULTRA(NORMAL)で真アキ撃破・ULTRA(HARD)で最終面到達くらいの実力です。

 

さて肝心のluaの話です。ツイートにもあるように、370行に収まっていて、DDFSやU SAiDのように1000行超えの長大luaを生成しがちな自分にしてはかなり短くまとまっています。

f:id:paraphrohn:20200402180135p:plain

腕は上腕と前腕がそれぞれ独立の角度phi1、phi2(これはbeat依存で増大します)に毎フレーム更新されるようになっています。

で、このActorFrame (arm.lua) を

f:id:paraphrohn:20200402180226p:plain

こんな感じで難易度依存のnum_arm個だけ別のActorFrame (aki.lua) に導入しています*2。難易度依存での数値の拾い方はkaiさんのブログを参考にして、数値+1を2倍しています。これでPapasitoが完成です。

 

f:id:paraphrohn:20200402180450p:plain

同じ方法で別のActorFrame (bullets) に1024枚の手の画像を保存しておいて、配列aki_bullets内に格納します。

で、defualt.luaとは別のActorFrame (bullets_script.lua) 内でのUpdateCommandで……

f:id:paraphrohn:20200402180622p:plain

配列aki_bullets内から、画面外にいる画像を探してきて、その画像の動きを停止→腕の位置に移動させて顔の中心に向けて発射させています。

ここで、ax, ayがPapasitoの中心座標、psi1、psi2はphi1、phi2にPapasitoの腕の向きを足した角度*3、velは難易度依存で変化する時間 = 弾の速度になっています。num_bulはway数。

2~4行目が手の画像をPapasitoの腕の先端に移動する命令、5行目が速度の指定、6, 7行目が移動先を指定する命令ですね。

 

自機の移動は土管シーフォと同じなので無視して、当たり判定の実装ですが、これはdefault.luaのUpdateCommandで

f:id:paraphrohn:20200402181017p:plain

配列aki_bullets内のすべての画像に対して、XY座標を取得して、自機との距離が8pixel以内なら死亡としています。簡単ですねえ!

死んだあとは爆発する画像であるaki_expを自機の位置に移動させて再生させているだけです。

 

全体として突貫で作ったのでまだまだ詰められるところはあると思いますが、それなりの長さに収まったのは我ながら評価点だと思います。まあnotITG移植できないんですけど。

やりたかったけどいろんな理由で実装できなかったのは

・敵HP&攻撃機

テストプレイ時に最大弾数を2048にしたらSM5落ちたことがあって、これ以上Actor増やすとまずいかなと思って実装しませんでした。実装自体はそんなに難しくないです。

・死んだときにボイス再生

君ならできるよ(笑)を流したかったんですが、このゲーム他の音が爆音過ぎるんですよ……

・Papasitoの爆発をもう少し派手に

爆発用のspriteをランダムに10枚くらい再生させればいい感じになったと思うんですが、もう時間無かったです。

 

次回は流石にまじめな譜面作ります。何で最近ゴミしか作ってないの?そういうイベントだから……

*1:もともとway数が1ずつ多かったんですが、難易度調整で減らしたみたいです

*2:これはSM5.0.12くらいから使えるようになった書き方らしく、oITG非対応です

*3:つまりどれか特定の腕の角度に等しい