誰も止めないので書けるだけ書く

読みやすくするように頑張ります

EZ2ON(略) レポート 付録

Ashrmです。この記事は前回の「EZ2ON REBOOT : R レポート」とゆるく関連していますが、特にこのゲームに関する情報追加ではありません。舞台裏でやや苦労したので自慢してもいいだろうということです。

前回の記事でExcelで作ったグラフを2つ示しましたが、これは自分の成績を容易に管理できるように難易度表Excelファイルを作った副産物のようなものでした。この表は下の画像のようなものです。

f:id:Ashrm:20220331182004p:plain

以前DJMAX(PS4版)でも同様の表を作っておりました。PS4版では難易度順ソートが存在せず、手元に難易度表が欲しかったという理由で作ったのだと記憶しております。が、一応フルコンしたかどうかと精度%を書き込む機能も付加し、フルコンは「条件付き書式」を用いて難易度表記の背景色を変更し*1、精度は「条件付き書式」を用いて棒グラフのように可視化し、ついでに難易度分布やBPM分布などの統計を取ることもできる…

Excelのいいところは自己満足のための機能が充実していることですね。

EZ2ONでは難易度順ソート機能があるのでその点は便利なのですが、成績管理にやはりExcelが便利であること、先の記事でも挙げた「全曲選択からそれぞれの曲がどのフォルダに入っているのかわかりにくい」という問題点を自分で解消することなどを理由としてここでも曲データベース(のようなもの)を作りました*2

ただ、今回はDJMAXの時とは少し違ったアプローチをとりたいと思い、曲データの入力にVBAのユーザーフォームを用いることにしました。VBAのユーザーフォームとかExcelの提供する自己満足の典型じゃないですか。「本当のソフトウェアみた~い!」みたいな。

で、できたのがこれです。

f:id:Ashrm:20220331221118p:plain

まるでゼロ年代のオフィスワーク。

例として、1stフォルダにあるFunny Funkyという曲の2022年3月31日のアップデート以前のデータを入力した場合を示しています。難易度は1~20の数字になっていますが、6KのSHD譜面、8KのEZ、NM、HDの譜面はこのとき存在しなかったため、0と入力することにしました。このように入力して「Enter」ボタンを押すことで、4K、5K、6K、8Kのシートにフォルダ・曲名種別・BPM・各譜面の難易度と、各譜面のデータが書かれている行のG列のセルに「0」が記入され、フォルダ名を入力する欄以外がクリアされるという代物です。これは1つのフォルダの曲データをまとめて入力するのに役立つ配慮であり、この種の配慮をすればするほど自己満足度合いが上がっていきます。

そして、この.xlsmファイルには各キーの難易度表のほかに「base」というシートが存在します。ここにもフォルダ・曲名・BPMがまとめられるのですが、ここにはD列のセルに「Edit Song」と書かれており、このセルをダブルクリックするとその曲データを編集できるという機能があります*3。このゲームはまだ開発中であり、譜面の作り直しなどが進行しているようなので、難易度や譜面の変更・追加などがまだまだ行われることを見越しての機能です。なお、譜面そのものが変更されることを考えて、編集した譜面の成績はクリアされるようになっています。

f:id:Ashrm:20220331222040p:plain

2022年3月31日のアップデートでおよそ全曲の半分にわたり700譜面以上が作りなおされたり追加されたりしたため、これは役に立つことになります。

 

さて、ユーザーフォームを使わずに難易度表データ表を作成する場合、私はおそらくこのような方法をとると思います。すなわち、まずEZ2ONのゲーム上で曲をアルファベット順にソートしたうえで*4

 

I. まず「4K」「5K」「6K」「8K」のシートを作成する。

 

II. 4Kのシートに曲名を書き込む。

  1. まず1行目(各列の見出し)を書く。
  2. 各フォルダについて、下の1~4の要領でフォルダ・曲名・BPMを書く。
    1. 書き込まれていない最初の行のB列のセルにフォルダ名を書き、フォルダ内の曲を辞書式に並べて最初に来る曲名をその行のC列のセルに書く。
    2. そのままフォルダ内の曲の名前をC列のセルに順番に書く*5
    3. フォルダ内の最後の曲までいったところで、B列のフォルダ表記を2.でフォルダ内の曲名を書いた行すべてのB列のセルにコピーする。
    4. フォルダ内の曲のBPMを対応する曲名のE列のセルに書く。
  3. すべてのフォルダ・曲名・BPMを書き終わったら、これらのデータをすべてコピーする。
  4. 曲データが書かれているすべての行のD列のセルに「EZ」と書き、これらセルに書式を設定する。ここに4K EZ譜面の難易度・成績が書き込まれることになる。
  5. 3.でコピーしたデータを書き込まれていない最初の行以降に貼り付け、貼り付けられたすべての行のD列のセルに「NM」と書き、これらセルに書式を設定する。ここに4K NM譜面の難易度・成績が書き込まれることになる。
  6. 同様にして、3.でコピーしたデータを用いて4K HD譜面、4K SHD譜面の難易度・成績を書き込む行を作る*6
  7. ユーザー設定の並び替えを用いて、第一に曲名の昇順、第二にEZ、NM、HD、SHDの譜面種別の順にリストを並べ替える。
  8. A列(難易度が入る)・G列(精度を記録する)に条件付き書式を設定する。

III. 得られたフォルダ・曲名・BPM・譜面種別のリストを5K、6K、8Kのシートに写す。

IV. 各キー数の各曲の譜面について、難易度をゲームから書き写す。このとき、該当する譜面が存在しない場合はその行を削除する。

 

ユーザーフォームを使って入力するのにかかる時間とこの方法で入力するのにかかる時間は大きくは変わらないと思います*7。ユーザーフォームを作るための勉強時間や実際の制作時間を考えるとむしろユーザーフォームを使用するほうが時間がかかったかもしれません。DLCが追加されるごとにこうした追加入力作業を行うことになると思いますが、まあ上のような複雑な手順を頭の中で意識せずにユーザーフォームに1曲ずつすべてのデータを入力する方が気楽ではあるかもしれませんね。曲数が多いと集中が切れて、次に何をすべきかわからなくなったりしますし。いずれにしても、こうした個人的な趣味でのVBAの使用は自己満足なので、ちゃんとできればOKと思います。

こうしたExcelでのデータ管理の大きな利点として、埋め作業のモチベが高い状態で保てるというのがあります。All Coolを示す青背景の難易度表示が並んだ画面は達成感を生み出します。また、「pathway」というシートがあり、ここには各キーのレベル別の「譜面数に対する精度%の合計の割合」、未プレイ譜面数、All Combo数、All Cool数がまとめられています。こうしたデータ整理はモチベ維持に大きく役立つわけですね。

f:id:Ashrm:20220331223305p:plain

低難易度ばかり埋めていますが、レートは少しずつ上がります。
レートの伸び記録が左側にまとめてあります。

さて、これらで気をよくした私は、成績データの入力もある程度自動化できるんじゃね?と思い、ディスプレイ2つ使用していることをいいことに「メイン画面でリザルト画面が表示されているときに、サブ画面のExcel上の4K、5K、6K、8Kの各シート上の該当する譜面の曲名の書かれたセルをダブルクリックすると、スクショが自動で取られ、そのスクショ画像のある部分を調べ、All ComboまたはAll Coolのランプデータと精度%を自動で入力する」ものを構想しました*8。私はこの一見単純なものを実際に作るのにのべ10時間以上にわたる虚しいGoogle検索を要しました。主な理由は、私がこの手の自動化をやったことがなく、APIなるものをよく知らなかったことといった、知識不足のほか、そもそもVBAは画像を解析するためのものではなく、表計算とデータの入力を効率よく行うためのものであったということが大きいと考えられます。

まずEZ2ONのスクショを取得するためにアクティブウィンドウをexcelからEZ2ONに変更しようとさんざん悪あがき*9をした末にそれが困難であることを悟って画面全体をスクショしてからサブ画面部分だけ切り取ることにしました*10。自動でスクショをとるために、keybd_eventを用いてPrint Screenを押そうとしたのですが、インターネット上のサンプルコードとは異なりPrint Screenを押してから放すまでにしばらく待たなければ正しくスクショが取れないらしい。カス

f:id:Ashrm:20220331230023p:plain

ほとんどの人こういう画面設定にしてないと思うんですけど

そして、文字の解析には何らかのOCR(なる代物)を用いようと思ったのですが、しばらく調べてどうやら難しそうなので、「どうせ決まったサイズの決まったフォントの数字しか見ないのだから適当な位置の点を選んで色を調べれば読める」という、非常に原始的な手段に頼らざるを得なくなりました。そして、ただ単に「スクショのビットマップの特定の点の色を調べる」だけでもVBAでやろうとするとAPIから様々な関数を引かなければなりませんでした。まずクリップボードの画像を取り扱えそうな形式に格納するために質問サイトにあった関数を丸写ししたところStdPictureなる型の何かが得られ、目的のものと思しきGetPixel関数を使うにはhdcなる得体の知れないものを使用しなければならないとかいろいろありましたが、見様見真似でやったらなんとかなりました。そして、「適当な位置の点のリスト」を作るとか、あらかじめ作ってあった「適当な位置の点を赤く表示した画像」と比較するとかいろいろエレガント(笑)っぽい方法をやろうとしていろいろ調べていたのですが、たった1つの画像を取り扱うのにさんざん苦労しているのにあと10個も画像を取り扱えるわけがないしそれができたとしても時間的コストに見合わなさすぎると判断し、結局If-Thenの間に調べるすべての点の色がらみの条件をAndでつなぐことになりました*11。かっこわるい。

f:id:Ashrm:20220331234002p:plain

絶対これもっといいやり方があるよ~

まあ結果的にこの自動成績入力を作るのにほぼ2日つぶれたわけですが、これ以降のEZ2ONのプレイはこのツールから益が得られるということで、たぶんこのツールを用いることによってこれ以降削減される手間をすべて合わせてもこれを作るのにかかった手間に全然見合わないとは思うんですが、まあなんかすごいことができたということで、これも自己満足です*12。でも本当にVBAはそういうことするためのものじゃない。画像分析関係は非常に遠回りをしたような気がしますし、直感的に作れていない感じがしました。こういうことはVBAよりはPythonを使うべきだったような気がします。

 

最後に、3月31日のアップデートの結果変化した譜面難易度分布を示します。このアップデートでは特に8Kの譜面が大幅に*13増加しましたが、譜面増加は低難易度を中心にしつつ、難易度分布をある程度調整しているのがわかります。増加分は主に存在していなかったEZ~HD譜面の補充だったため低難度の増加は理解できます。

f:id:Ashrm:20220401173504p:plain

 

ここまでお読みいただきありがとうございました。誰に向けての記事なのか全くわかりませんが、苦労自慢なので書きました。

*1:手入力の利便性のため、当該譜面のデータのF列に「1」と記入してあれば難易度表記の背景色を黄色くする、という方法をとっておりました。

*2:ところでデータベースのためにはMicrosoft Accessというソフトがあるらしいですね。なにそれ

*3:正確には「ありました」。実は、アプデに伴う難易度編集作業中にゲーム・公式の変更まとめ表・編集するExcelファイルの3つを開いて作業する際に不便を感じたため、曲データ編集は曲名の書かれたセルのダブルクリックによって行うように変更しました

*4:なお、実際の私はDJMAXの時などは単に愚かで非効率的な方法を用いてしまうこともありました。

*5:ExcelではEnterキーで直下のセルに移動するので、各曲の曲名・BPMをわざわざ列を反復移動しながら書くより、曲名だけ書いてEnterキーで送った方が早いと思うため。

*6:なお、私が各難易度に用いた書式は、EZ...緑背景に黒文字、NM...水色背景に白文字、HD...山吹色背景に黒文字、SHD...赤背景に白文字。

*7:後者は主にコピペ作業の手間が余計にかかりはしますが、でもコピペ作業だしそんなに時間かからないと思います。

*8:さすがに曲名を自動で読み取るのは危うそうだと思ったらしい。PDFの機械読み取りにおいて、空白文字が予期しない入り方をすることが多いのを見て、「読み取った文字が曲名と完全に一致しないことが多くありそう」と思ったのだと考えます。

*9:必死のgoogleはほとんどの時間悪あがきだったのでは?

*10:動けばいいんですが、できそうなことができないままだとやっぱり不満ですよね。

*11:GetPixelは遅いといわれ、よりよい方法として別のAPIを用いたさらに作るのに時間のかかりそうな方法を別の質問サイトで提案され、…このときは解決すべき問題の優先順位とすべき妥協が見えておらず、非常に要領の悪い行動をとっていたといえます。

*12:その後、この自動化なしでは考えもしなかった「記録更新ログ」をつけるようになるなど、一応良かったと思います。

*13:794譜面から1057譜面に