キャプチャした試合から撃墜の瞬間だけを切り取ってクリップを自動で作成する #スマブラAdventCalendar2019

この記事は、#スマブラAdventCalendar2019の19日目の記事です。

まずはじめに

この記事を開いてくださり、ありがとうございます。好きなオルタはBLACK ROSES赤Bの高速オルタ、豚平です。

今回の記事の執筆にあたり、こんなものを作りました。


自動抽出された撃墜集

やたらスピード感のある撃墜集をご覧になったと思います。

元動画はこちら。


フレンド戦_191006_02

スマブラAdventCalendarの発起人であり友人の寝椅子くんたちとの試合をキャプチャしたものです。

今回、対戦中の動画からバーストシーンを自動で切り取るプログラムを作成しました。

25分程度の動画から、バーストシーンを特定して切り出し、(スペックによりますが)合成までおよそ3分で出来上がります。 バーストの何秒前から切り取るか、何秒後まで切り取るかも設定可能です。まるで衝撃があったときに保存するドライブレコーダー

動機

  • ハイライト動画をできるだけ楽に作りたい

  • 来るスマブラビッグデータ時代(?)に備え、データ収集のスキームを作りたい

  • コードベースでの、プリミティブな動画編集方法の体得 本当はffmpegAPIを叩いて編集をしてみたかったのですが、時間が足りず、今回はffmpegの実行ファイルに頼りました。 ffmpegのビルドに悪戦苦闘した部分がこの記事の大部分を占める予定でしたが、これはまた別の記事にまとめます。(ビルド自体は成功しました)

以下、技術的な説明になるので、とりあえず使ってみたい方は使ってみるへどうぞ。

今回のソースコードこちら。そのまま実行できるように、ビルド済の実行ファイルも残してあります。コンパイル用のコマンドも.batで残してあります。実装の詳細については、こっちを見たほうがわかりやすいかと。

アプローチ

このプログラムは、3つのモジュールで構成されています。

  1. ソースの入出力 後続の処理がしやすくなるように、入出力を制御します。 今回は、「動画ファイル」をソースとします。

  2. 編集点検索 入力されたソースから、編集すべき箇所がどこなのかを検索します。 今回は、「バーストの瞬間」を検索するモジュールを作成します。

  3. 具体的な編集 得られた編集点から、ソースに対してどのようなアクションを行うのか定義します。今回は、「編集点の前後数秒を切り取り、つなぎ合わせる」編集を行います。

動画を扱う準備

FFmpegの実行ファイルの準備

CLIで動画をいじるならこいつ。

ここから(LinkingはstaticでOKです)ダウンロードして、ffmpeg.exeを作業用のディレクトリに置きます。

これで準備OK。

編集用コマンドの発行と実行を行うクラスの作成

入力ファイルのパス(必須)と、切り取り時間のオフセット(オプション)を引数に、FFmpeg.exeに実行してもらうコマンドを準備、実行まで行うEditerクラスを定義します。詳しくはコードを参照してみてください。

void Editer::exec_trimming()
{
    deque<string> command_list;
    deque<string> file_list;
    int index = 1;

    if(edit_points.empty())
    {
        throw string("Error:Edit points is empty");
    }

    for(auto p : edit_points)
    {
        stringstream ss;
        ss << index++;
        string dst = "output/cut" + ss.str() + ".mp4";

        string cmd = "ffmpeg -ss " + get_offset_as_string(p) + " -i " + src + " -y -t " + get_duration_as_string() + dst;
        cout << cmd << endl;
        command_list.push_back(cmd);

        string file;
        file = "file " + dst;
        file_list.push_back(file);
    }

    ofstream fout;
    fout.open("edit_list.txt");
    for(auto f : file_list)
    {
        fout << f << endl;
    }
    fout.close();

    for(auto c : command_list)
    {
        const char* cmd_as_char = c.c_str();
        std::system(cmd_as_char);
    }

    exec_concat();

}

こんな感じで、edit_pointsに含まれる編集点(単位は秒)の数だけ、FFmpegに切り取りをお願いするコマンドを作成していき、まとめて実行します。

最後にexec_concat();で、切り取った動画をつなぎ合わせ、"00_output.mp4"として出力します。

Editerクラスの使い方はこんな感じです。main関数内を抜粋。

...
    try
    {
        Editer e;
        if (argc == 2)
        {
            e = Editer(argv[1]);
        }
        else if(argc == 4)
        {
            e = Editer(argv[1], atof(argv[2]), atof(argv[3]));
        }
        else
        {
            throw string("Usage:client.exe [input video filename] [offset_front(default=5.0) offset_back(default=2.0)]");
        }
        
        
        deque<double> edit_points;
        search_edit_points(e.get_input_filename() ,&edit_points);
        e.set_edit_points(edit_points);
        e.exec_trimming();

        cout << "INFO:Edit Finished" << endl;
    }
...

edit_pointsへの編集点の登録はsearch.cpp内の関数search_edit_points()で行います。詳しくは次の章で。

編集点検索

OpenCVの準備

画像処理するならやっぱりこいつ。

ここからダウンロードして、任意のフォルダに展開します。

必要なのは、includeフォルダ、opencv_world412.lib、opencv_world412.dll、opencv_videoio_ffmpeg412_64.dllです。libファイルはlibフォルダに、.dllファイルは実行ファイルと同じディレクトリに置きます。(.dllへのPATHを通してもOKです)

今回は説明の簡略化のために必要なライブラリやヘッダファイルをすべてリポジトリに入れてます。(ライセンス表記は書いたから大丈夫なはず。。。)

テンプレートマッチング

認識方法についてはあまり複雑なことはやらずに、テンプレートマッチングで行きます。

今作は1on1だと残りストックが画面上に大きく出てくれるので、大変やりやすい。

・・・とりあえずという気持ちと、実装に充てられる時間の少なさでハードコーディングモリモリの大分お行儀の悪いコードになってしまいました。いずれリファクタリングします。

テンプレートとして用意する画像はこれ。

f:id:tonpeidon:20191217213521p:plain

自キャラの紫パルテナです。色も見ます。

このアイコンはそれっぽいワードで検索したらでてきます。リポジトリには検証用の紫パルテナとデフォルトネスの画像しかつけていませんので、あしからず。

検索用のコードがこちらです。

#include "searcher.h"

void search_edit_points(string src, deque<double> *edit_points)
{
    //open
    VideoCapture cap(src);
    if(!cap.isOpened())
    {
        throw "Error:File can not open:" + src;
    }
    double framerate = cap.get(CAP_PROP_FPS);
    cout << "INFO:Frame rate is " << framerate << " fps" << endl;
    Mat frame;
    Mat resized_frame;

    Mat icon = imread("icon.png");
    resize(icon, icon, Size(20, 20));

    int number_of_frame = 0;
    int last_detected = -framerate * 3;

    cout << "INFO:SEARCH START. It may take time." << endl;
    while (cap.read(frame))
    {
        resize(frame, resized_frame, Size(640, 360));
        Mat cropped_frame(resized_frame, Rect(75, 170, 500, 30));
        Mat matching_result;
        matchTemplate(cropped_frame, icon, matching_result, TM_CCOEFF_NORMED);

        Mat match_mask = Mat::zeros(matching_result.size(), CV_8UC1);
        match_mask.setTo(1, matching_result > 0.60);
        int stock = sum(match_mask)[0];
        if (stock > 0 && (number_of_frame - last_detected > framerate * 3))
        {
            double timestamp = number_of_frame / framerate;
            edit_points->push_back(timestamp);
            cout << "INFO:BURST DETECTED AT " << timestamp << " sec." << endl;
            last_detected = number_of_frame;
        }
        ++number_of_frame;
    }
    cout << "INFO:SEARCH COMPLETED" << endl;
}

・・・うーんきれいじゃない。時間ができたらきれいにしたい。。。

撃墜時にストックが表示される中央部分に絞ってマッチングを行っています。

意図しない連続検出を避けるために、一度ストックの変化を検出できたら以降3秒は検出しないようにしています。

edit_pointsに編集点のリストが出来上がるので、Editerのメンバ変数に渡してあげます。

        e.set_edit_points(edit_points);

これで編集点が登録されました。あとは前述のとおりEditerのexec_trimming()を呼べば編集が実行される仕組みです。

使ってみる

例えば、下の元動画にたいして


フレンド戦_191006_03

client.exe test.mp4

と実行すると、以下のような動画が出来上がります。(デフォルトでは、バースト前5秒、バースト後2秒です。)


抽出結果 1

最初にご覧いただいた動画は以下のようにオフセットを明示的に指定して、バースト前後の時間を短くしています。小数点以下の指定にも対応です。

client.exe test_long.mp4 1.0 1.0

オフセットを長くすれば立ち回りを勉強するときに使えるし、短くすれば疾走感のある動画が出来上がります。

注目したいキャラを変更したいときには、自分の使っているキャラのアイコンを用意して、icon.pngを書き換えてください。

対戦動画がフルスクリーンでない、L字の配信枠がついているような動画は現状うまく認識できないので、ご了承ください。

対戦情報を乗っけるオーバーレイぐらいだったらOKだと思います(未確認)。

???

「豚平さん、スマブラSPって何スト制でよく遊ばれてるっけ」

「ええと・・・3ストックだね」

「このプログラムで1試合当たりにとれる最大のバーストシーンの数は?」

「4つだね」

「もひとつ質問いいかな」

「”GAME SETの瞬間”、どこへ行った?」

「・・・君のような勘のいいガキは嫌いだよ」

ッアー

終わりに

作成した検出器と編集内容を複雑なものに入れ替えれば、今後以下のような動画も生成できるでしょう。

  • 100%以上ダメージが溜まっていてガケに捕まったとき、スローにして再生する

  • 動画のクローラと組み合わせて、特定の選手の撃墜集を作る

  • シールドが割れる直前に、"To be continued..."の差し込みを入れる

アドベントカレンダーらしく、ちょっと技術的なことするか!と思い立ったはいいけども、心の怪盗業務が忙しくて結局ギリギリになってしまいました。何とか形になってよかった。。。

今回はコード量も比較的少なめだし、Visual Studio2019をインストールしていればリポジトリをCloneしてそのまま開発ができるようになっています。時間の都合でガバガバになってしまった撃墜認識を(今回実装しきれなかったGAME SETの瞬間の検出も)、ぜひ強い方、改善してください。待ってます🙏

github.com

プログラムに関する改善提案歓迎です。「このキャラ試したけど動かなかった!」みたいな報告をたくさんいただければ、腰を上げて改善に取り組もうと思います。シモンのNBマサカリは投げないでください。

最後までご覧いただき、ありがとうございました。よきスマブラ動画ライフを。

データを眺めながらmatixxを振り返る【Guiter Freaks】

明日(2018/09/12)からEXCHAIN稼働ということで、matixxを簡単に振り返ってみたいと思います。

初めてしっかりプレイして

初めてきちんを目標を持ってプレイしたシリーズとなりました。初めは赤ネーム目標でプレイしていましたが、スキル7040.35と最終的には銅ネームに到達することができました。アドバイスをたくさんくれたギターウマイオニイサンたち、本当にありがとうございました。最近は少し階段や複数押しと単押しの複合に悩まされているので、次回作ではこの壁を乗り越えられるといいなと思います。

フレーズコンボによって達成率に変化はあったか

私は本作からのプレイだったので特段の意識はなかったのですが、フレーズコンボ導入によって達成率の計算が大きく変わりました。結局、導入によってスキル値は上がったのかどうか確認してみました。確認には、いつかに作成したGF Trainerで保存してあった値を用いています(あの記事の続きほったらかしだ・・・・・・・)

というわけで、簡素ですがプロットドン。

f:id:tonpeidon:20180911200057p:plain

このプロットはスキル対象曲(だったものも含む)のコンボによる達成率を描画したものになります。

横軸がMax Comboによる達成率(フルコンボで5%)、縦軸がPhrase Comboによる達成率(全部達成で10%)です。直線より下にある点は、REVOVE以前の計算式の方が達成率が高い曲、直線より上にある点は、フレーズコンボ導入によって従来より達成率が高くなった曲を示しています。

これをみるとよくわかりますね。フレーズコンボ導入によって達成率が全体的に高くなっていることがわかります。

スキル対象曲の内訳

続いて、スキル対象曲の難度値分布を出してみました。ドン。

f:id:tonpeidon:20180911200708p:plain

うおー正規分布チック。ここまできれいなお山ができるとオラワクワクすっぞ。一番右のはずれにあるのはIMIです。Driven Shooterと並んで私のスキル稼ぎ頭です。次回作では9.85に上方修正されるそうで、やったね!

平均値は7.73、中央値は7.7でした。

達成率もプロットしてみましたが、、、

f:id:tonpeidon:20180911200942p:plain

うーんまばら。平均値は89.26で、中央値は89.88でした。90%近くとらないといけないということで、次回作ではしっかりコンボを繋げることがスキルを伸ばすキーになりそうです。。。

最後に

フレーズコンボの導入によって、達成率が全体的に底上げされたことがわかりました。スキル対象は7.7が平均ということで、次回作稼働したら7.00後半ランセレ等でいい曲と出会ってみたいと思います。

ライバル枠はまだ空いているので、銅ネ前後の方ぜひライバルに。。。お待ちしております。

それでは次回作も頑張っていきましょう。楽しみです。

最近思うこと 2018/06/19号

今日のトピック:スマブラ、オクトエキスパンション、GF Trainer、就活

ブログに1記事にするには薄いけど、Twitterだと少し長かったり、考えをまとめておきたいトピックをいくつか挙げてみる。

文字に起こすことで頭の整理にもなるかも・・・しれない。

毎月更新したいと前の記事でいってたのに、危うく宣言坊主になるところだった。危ない危ない。

スマブラSP体験会の感想

行ったぜ幕張

6月17日にRAGE2018Summerで行われたスマブラSP国内初プレイアブル出展ブースに行って体験してきた。2バトル保障で、2回目のバトルに勝った人は2回戦に進むことができ、最大4回戦5バトル遊べるシステムである。キャラは迷ったが、いろいろ強化されたとTwitterで話に上がっていたマイキャラのカービィを選んだ。プレイが始まって、技の確認がしたかったが、乱闘なのでそんな余裕がないことと勝ちたいあまりにやることがスマッシュをブンブンするか高く上がってストーンで落ちるかのカービィ初心者ムーブでいろいろな技を振りそこねてしまった。反省。ただ吸い込みは出来た。後スキがだいぶ小さくなって使っていける場面が増えたなと感じた。結果は2位。途中までトップを走っていたが、最後の最後でアイクにまくられてしまった。GG。

筋肉もりもり、マッチョマンのガノンさん

その後、再度整理券をゲットして挑んだ第二戦。乱闘ならこれっしょと選んだのは早くなったともっぱらの噂のガノンドロフ。場所は新ステージのタチウオパーキング。練習では見事に2点差をつけて勝利。いける!そう確信したが、2分半後にわからされることになる。クッパの空後に復帰阻止を何回されたことか・・・。無念の4位。でも投げから空Nが繋がったときはなんだか快感だったし、このイベントのビルドでは貴重な新ステも遊べたりで充実した対戦だった。GG。

イベント自体の話

会場の様子等の話をすると、有名なプレイヤーが並んでいるのを確認したり、裏切りマンキーコングの両名が登壇しているのを間近で見ることが出来たり、良いプレイに歓声を上げたり・・・。発売前のワクワクとアドリブ性が生み出す波乱の展開をあの場にいた人たちで体験し、共有できたのは幸せだった。

私の概算では参加者は1日でのべ3000人程度。整理券システムだったので必要以上に並ぶ必要がなかったのは嬉しかったし、スタッフの多さも相まってほぼオンタイムに進行していた。感服である。負けるとおしまいだったので勝ちを狙いにいって新キャラを触わらなかったが、次はリドリーを触ってみたい。一回下Bをもろに食らって40%くらいもってかれた。あれやりたい。

オクトエキスパンションをプレイして

やりごたえばっちり

Splatoon2の有料DLC、オクトエキスパンションをプレイした。全てクリアするのに6時間はかかっただろうか。ヒーローモードより一回り二回り上の難易度で、コンティニューを連打したステージも少なくなかった。ストーリーも今までとはちょっと趣が違った感じで、キャラのいろんな側面や、バックボーンを知ることが出来たのは良かった。ラストに向けての演出も凝っていて、ぜひネタバレなしで演出を楽しんでもらいたいと思った。

公開することの難しさ

公開することへの責任

GF Trainerの公開準備を進めているのだが、個人で使うときには気にしなかったエラーハンドリングだったり、動かなくなったときの復帰方法だったり、作者として責任が生じる部分が投げやりになっていたことに気づき、難航している。わかる人にだけ使ってね、ってので終わりでも別にいいが、それでは少し癪なので。

Ver. 2での目論見

一方で、Ver. 2でどのような機能を実装するか考えている。目玉は結果の画像化。ikaWidget2のようにアプリの通信を読めばeamu内に保存されている画像データをとってこれるのではないかと目論んでいる。セッションハイジャックまがいなことをするのでいよいよ怒られそうだけど、もし出来たら(こっそり)報告する予定である。

就職活動を終えて

何はともあれ

6月に入り、一番最初の活動から実に半年間の就職活動にケリがついた。活動中にであったリクルーター、先輩社員、同じ立場の学生、友人全てに感謝している。向こう10年、20年の自分のあり方を決める重圧と不安に滅入ることもあったが、自分がやりたかったことに正直になった結果選んだので、後悔はしないはずだ。早く動いた分、自己分析もじっくり行えたこともスムーズな就活を手伝っていると思う。好きな曲の歌詞を借りるならば、「生まれたままの感情を隠さないで」だ。

GITADORAの成長の可視化をしてみた話① そもそもの動機

可視化がしたい

以前の記事でも触れたが、成長を可視化するということはモチベーション及びやりがいを感じるために重要な要素だ。記憶が古くなったあとに、当時の記録を振り返って成長したなあと感じる瞬間は、ゲームのみならず様々なアクティビティで言い表せない深い達成感を与えてくれる。

そんな背景のもと、技術的興味と実利的側面が重なってツールを作ってみることにした。対象ゲームは今自分の中でモチベーションが特に高いギターフリークス

要求は以下の通り。

  • プレイ後にスキル対象曲に更新があれば、その結果を自動でつぶやく
  • 一日の終わりにその日どれくらいスキルが伸びたかを通知
  • 以上のことをクラウド上でスケジューリングして実行しつづける

結論から言うと、ツールは無事完成し、私のTwitterで稼働中である。

それっぽくハッシュタグなんか使っているが、このツールはGF Trainerと名付けてある。そのまんま。

心配だった長時間稼働によるトラブルも稼働丸5日の時点でトラブルはなく、順調にツイートしてくれている。

f:id:tonpeidon:20180521201528p:plain ↑9:00~24:00の間で動いてるのが確認できる

というわけで、数記事に渡って完成までの苦労話と、工夫したところなどを綴っていこうと思う。公開に向けた準備も進めており、コマンドラインがたたける人なら扱えるように実行方法もできるだけ詳しく説明する予定だ。

次回、「どうにかして自動でログインさせたかった」に続く。

最近思うこと 2018/05/17号

ブログに1記事にするには薄いけど、Twitterだと少し長かったり、考えをまとめておきたいトピックをいくつか挙げてみる。

文字に起こすことで頭の整理にもなるかも・・・しれない。
このシリーズで4記事続いたら自分を褒めよう。

Xperia Ear duoを買った

話題のデュアルリスニング機。使い心地は良好で、耳を塞がずに音楽を楽しめる。ジャズとかを流してると非常に作業が捗る。自動音量調整機能もあって街を歩くときにもグッド。

iOSではアシスタント機能が使えないので普通のワイヤレスイヤホン以上のことが出来ない。デュアルリスニング機構を備えた有線の安価版が最近発表されたので、iPhoneユーザで気になる人はこっちから試してみてもいいかも。Android端末が欲しい今日このごろ。

www.sony.jp

BBTAGの体験版の感想

BBTAGの体験版をSwitchでプレイ。友人とオンライン対戦を数十戦やってみた。難しいなんて絶対言わせない勢いの親切設計。リバサも空中ダッシュも全部1入力で出る。これだけ簡単ならプラットフォームがスマホでも遜色なく遊べそう(マネタイズはともかくとして)。

バランス的な話だと、全体的なコンボの火力が高いのと1本勝負なのが相まって1試合が大分短いなと感じた。キャラで言うとルビーちゃんがすごいストライク。Amazonでレンタルやってるので、今度RWBY見てみることにする。

シンフォギアXDに復帰したい

なかなかシンフォギアXDに食指が動かない。シンフォギアライブでXDの曲がフル尺で歌われた以上、次のライブでも歌われる可能性は大なので、しっかり追っておきたいとこではあるが、いかんせんイベントを走るモチベーションがわかない。歌いながら痛快にメチャクチャをやるのがシンフォギアのスピリットだと私は思っているので、どうしてもテキストベースで話を読み進めるとアニメみたいな痛快感を得るまでには達しにくい。金の針はフルボイス。頼むぜブシモ。

コンシューマーゲームでやれるだけのポテンシャルはあると思うので、プラチナゲームズないしコーエーテクモと組んで無双ゲーとか作って欲しい。欲言えばアークスと組んでUnreal Engineで格ゲーをば・・・。

ひなビタ♪ライブでみたアニメイベントの未来

最近はlive2Dを使ったコンテンツがまたブームになっている。そんな中3月に日向美ビタースイーツ♪のARライブに参加してきた。ちゃっかり前から2列目。

基幹技術はlive2Dで、バックバンドの生演奏に合わせてキャラクターも演奏する。予想以上に指の動きやタム回しが細かくて驚いた。生歌はなかったが、バンドによる生演奏は聴き応えがあり、十分に楽しめた。演出も2次元ならではの多彩な表現で、走れメロンパンのイブが最高だった。これマジ。

ライブ特有の観客と演者のインタラクションはまだ難しく、観客が流れを汲み取って反応する形になっていた。口パクをさせる以上、リアルタイムで声優が声を当てるのは難しい。マイク入力→処理系→live2Dへの反映及び音声再生みたいに、一旦音源を何かしらのシステムを介して同期させればうまくいくかなと思った。そのへんはこれからの技術進歩に期待。Hotな分野なのでそういった開発も力が入ってくるだろう。楽しみである。

このシリーズ、月1くらいで更新できればいいな。

ギターフリークスにハマった理由を考える

今回の記事はタイトル通り、何故自分がギターフリークスにどっぷり浸かったかを主にシステム面からセルフ考察してみるものです。

きっかけ

ゲーセンに行く頻度が全盛期に比べ減っていた3ヶ月前、友人と3人でギタドラをやりました。1人はドラム、私ともう1人はギターでセッションプレイです。ギターフリークス自体はTri-boost時代に十数クレ入れた程度で、当時は難度値4後半のクリアも危うい腕前でした。

セッションプレイが殊の外楽しかったことに加え、昔よりもずっとミスが減っていたんですよね。推測ですが、昔はピッキングの動作をネックボタンを抑えるよりも早く行ってしまい、ミスが連発していたんだと考えられます。

「なんかやってて楽しいし、スキル埋めてみたらそこそこいくんじゃないか?」

久しぶりに集中してやってみたいと思えた私は、向こう三ヶ月全盛期を凌駕する勢いでゲーセンに通いつめ、ピッキングを行うのでした。

ココ最近の進捗

日付 進捗
1月21日 とりあえずスキルを50曲埋める
1月24日 青ネーム
1月26日 青グラ
2月4日 紫ネーム
2月27日 紫グラ
3月17日 赤ネーム
4月21日 赤グラ

3ヶ月みっちりやったおかげか、赤グラまで到達することが出来ました。ここからの道が険しいことは熟知している・・・はずです。

モチベーションが保てた理由

ここまでやる気になったのは、私自身がずっと楽しいと思えて遊べたからなのですが、そこにはギタドラのゲーム設計が要因として存在していると思っています 。その理由をいくつか。

統一目標に対するアプローチの広さと、見えることによる実感

ご存知の通り、ギタドラには腕前の指標としてスキルという概念があり、スキルを伸ばしていくことがこのゲームの大きな目標の1つです。腕前の指標としてはレート、ボルフォース、jubilityといった名前で様々なゲームで見かけるようになりました。

昔から指標として用いられてきたのは段位認定ですが、スキル形式での指標と、いわゆる段位形式での指標の大きな違いは、選曲の自由にあると考えています。「避けて通れない道」が存在しないことは、ゲームプレイに制約を与えず、プレイヤーに義務感を生じさせにくいです。100人いれば100人が違う得意曲で、同じ目標を目指せるというのは、スキル形式の大きな利点だと思います。

加えて、ギタドラでは1曲ごとのスキルを公式に確認することができます。他の多くのゲームでは曲ごとの指標は内部値とされ、確認することができません(有志による検証により計算は可能になっているゲームも多いですが)。曲別スキルが確認できることにより、自分の目標のスキルに到達するためにはどの難度値で何%の達成率を得ればよいのかといった指針を立てることが出来ます。同時に、明確な値が出ることによって情報の共有も行いやすいです。成長の実感も確認しやすいですね。データの可視化によるモチベーション向上は、内部データ可視化のwebサイトやスクリプトがよく作成されていることにも裏付けられていると思います。

コストパフォーマンスと自然な選曲

ギタドラはスタンダードプレイでは通常3曲、アンコールステージに入って4曲、プレミアムアンコールステージに入ると5曲まで遊べます。おおむね100円3曲の他のゲームよりもコスパがいいです。

アンコールステージに入るための条件はアンコールゲージを100%貯めることです。内部的にはSS=12,S=8,A=7,B=6,C=4ポイント換算で、3曲で23ポイント貯めればOKです。S、S、Aランクを取れば進出できます。進出出来なかった場合は、1ポイントずつ必要ポイントが減少していきます。1度必要ポイントが減少したら、減少した分は日をまたぐまで有効です。

このシステムの大きなメリットは、「特攻しすぎることを抑える」ことにあると思います。ギタドラはクリア自体は難しくないゲームですが、ゲージがなくなるギリギリのプレイだとCランクに終わることがほとんどです。1度Cランクをとってしまうと、そのクレジットでのアンコールステージは非常に厳しくなります(SSランクは1切りでも達成できないこともあるくらいシビアです)。そのため、過剰な特攻が自然となくなり、適正な難易度の譜面を自発的に選択するようになります。これが成長によい影響を与えると考えています。アンコールステージでは思う存分チャレンジできるので、挑戦のバランスが良いです。

インタフェースのとっつきやすさ

選曲画面での操作のしやすさ、ノーツバランスの表示、たくさんのオプションなど、インゲーム以外でのプレイのしやすさは随一だと思います。他のゲームもできるだけ操作しやすいように工夫されていますが、十字キーとスタートボタンの操作のしやすさにはなかなか及びません。全てのゲームに操作インタフェースとして十字キーとスタートボタンはつけて欲しいくらいです。

まとめると

  • 成長が実感しやすい!
  • コスパいい!
  • 遊びやすい!

一番は成長が実感しやすい、これに尽きます。

最後に

私がギターフリークスにハマった理由を自分でまとめてみました(あんまりまとまってない)

未プレイの方、まずは50曲埋めてみることを目標に知ってる曲から遊んでみてはいかがでしょう。曲のジャンルも結構広いですよ。曲に迷ったら自分にあった難易度でランダムセレクトに任せるのもあり。

経験者の方、ライバルを募集していますのでスキル±1000くらいの方是非!自分のスキルに大いに参考にさせてもらいます(´つヮ⊂)

と (@10npeidon) | Twitter

第8回gitchallengeに参加してきました #mixi_git

 2018年2月3日にmixiさんにて行われたgitchallengeに参加してきました.この記事はこの日の振り返りと感想です.次回以降の参加に興味がある方へ参考になれば幸いです.

参加までの経緯

 このイベント自体を知ったのは研究室の先輩からの紹介でした.そのときは参加できなかったんですが,そのとき参加した同期からもいいイベントだったとの情報を聞いていたのもあり,逆求人で知り合った人事部の方からのご招待もいただいたので,参加することを決意しました.

競技が始まるまで

 強烈な寒さも一段落したような気温の中,会場である渋谷ファーストタワーに向かいました.この時期は渋谷駅周辺で工事が行われていて,方向感覚が鈍ったのを覚えています.会場につくと自分のチームと座席場所を案内されました.交通費の精算を済ませると(そうです交通費がでます.私は関東圏からだったので今回の交通費のほとんどを賄うことができました.遠方の方でも半額は補助がいただけるとのことです.),チームメイトとなる参加者が隣に座られました.軽い自己紹介を済ませた所で,オープニングへ.

 まずキーノートから.mixi内でのgitの活用事例についてお二人のエンジニアの方からご紹介いただきました.どちらも,非エンジニア職の方もGit/GitHubを利用しているというお話が印象に残りました.これをもしモンストのエンジニアの方がみていらっしゃれば,「クリア済のクエストで,間違ったチームで入ってしまったときに初手を打つ前だったらクエスト自体をキャンセル出来る」みたいな機能が欲しいので,ご検討のほどよろしくお願いいたします(勝手な要望).

 キーノートのあと,競技のチュートリアルが行われました.懇切丁寧に行われ,無事正解するころにはちょっと緊張が解けた気がしました.

 競技前にお昼ごはん.曰く,毎回開催日にちなんだものが出てくるとのことで,節分の日らしく巻きずし弁当が出てきました(写真は社員の方が撮影されたもの).

f:id:tonpeidon:20180204225934j:plain

 ちっちゃい弁当柄の中に沢山の品目.色が鮮やかで目でも楽しめる素晴らしいお弁当でした.古代米を使った太巻きは,紫蘇とはまた違ったピンクが出ていいですね.昼食中は社員の方とチームメイトの方と3人でお話をしながら食べました.研究の話等で盛り上がりましたね.  

いざ競技

 お昼も済ませ,いよいよ競技が開始しました.ゆったりとしたBGMとは裏腹に,みなさん集中して次々問題を解いていきます.解答をpushすると,ただちに採点が行われてSlackおよびweb上のスコアボードに結果が表示されます.その間わずか0.2,3秒歯向かう術はないまさに閃光10秒足らず.正解すると難易度に応じてポイントを獲得.まるでゲームです.この時点でなんだかワクワクしてきました.

 問題の詳細については箝口令が敷かれているので詳しく述べることは出来ませんが,問題の難易度は千差万別で,知っていれば数分で解けてしまうものから,難易度爆絶級のものまで.問題例はmixiさんの方で公開されているので,気になる人は試しに解いてみることをおすすめします. alpha.mixi.co.jp

 解答作成中にリポジトリがぐちゃぐちゃになってしまってL+R+A+STARTしたい!って状況になってしまったら,部屋の前においてあるボタンを押すとリセットをすることができます.ペナルティはボタンを押すと変な音がでて少し辱めを受けるくらいです.この再チャレンジまでのスピード感も好きでした.

 結果として,私は5問解くことに成功しました.自分の参加時のスキルと照らし合わせると,思った以上に出来たなというのが率直な感想です.ググり力大事.

競技が終了して

 終わってみると3時間半あっという間でした.脳の疲労が心地よかったです.結果発表の前に解答発表と,gitにまつわるtipsをご紹介いただきました..gitの中身は朧げには何が入っているか知っているつもりですが,改めて説明いただくと知らないことも沢山あって大変勉強になりました.

 続いてLT.XFLAGスタジオの解析チームのお方と自己紹介をいただき,モンストのデータ解析とかしてみたいなあ,絶対楽しいだろうなあと思いました.覇者の塔22階でバジリスクXにやられる事故率とか知りたい(完全に自己満足,私は4割ぐらい事故ります).最後に「Git本体にコミットするまでがGitchallenge」なる今日一のPowerWordをいただきました.

 そして競技の結果発表.なんと同率1位が3チーム(!)そして私達のチームDeltaも優勝,メダルを拝受しました.メダル貰ったのなんて何年ぶりでしょうか.本当にパートナーの方には感謝しています.ありがとうございました.副賞のオクトキャットのフィギュアは1チーム分しかなかったので争奪じゃんけん(個人戦)が行われましたが,敢え無く敗北.ただ私のパートナーがゲット出来ていたので,よかったなと.

 表彰のあと,お楽しみの懇親会です.  f:id:tonpeidon:20180204230856j:plain  メニューは野菜多めのヘルシーメニューで,普段野菜の摂取量が少ない男子学生にとって非常に嬉しかったです.バーニャカウダで食べるパプリカって甘くて美味しいです.白セロリと豚肉のわさびソース?だったかな,最初はセロリと気付かずに食べてて,メニュー表みたときに初めてこれセロリなんだ!って気付くくらいセロリのいやな感じがしなかったです(筆者はセロリが苦手です).今度からセロリは白セロリを推していきたいと思います.一つ一つメニューのレビューをするとキリがないのでこの辺で.飲食を楽しむと同時に,参加された学生さんや若手エンジニアさんとの交流も楽しみました.お仕事のお話をされているとき,非常に楽しそうだなという印象を抱きました.

 最後に記念撮影をして,解散の運びとなりました.心地よい疲労と充足感と共に,帰路につきました.

総括

 こういった技術系のイベントに参加するのが初めてだったので,始まる前は少し緊張もしていたのですが,終わってみると大変有意義なイベントでした.優勝目指すぜ!な方はもちろんのこと,前述の問題例が解けるくらいの能力を持っているのであれば,えいやっと挑戦してみると今後の大きなモチベーションになること間違いないと思います.

 最後に,このようなイベントを開催してくださったmixiさんに感謝の意を述べると共に,この記事をまとめたいと思います.ありがとうございました.

f:id:tonpeidon:20180204223222j:plain