カテゴリー別アーカイブ: Heroes of the Storm

HotS のミニマップみようツールの作成(5)

前回インストーラを作ってみて「今の実装だとインストーラで作った実行ファイルは起動できない」という現実を知ってしまったので、今回はとりあえずアプリが落ちないように調整します。
私は知っている、こういう自分の知ってる知識で作れる機能は集中して数日のうちに実装を終えてしまった方がいいことを…

まぁ、そんな数日集中できるほど元気はないので、少しずつやりましょう。集中すると疲れるし。

今回やろうと思っていることは

  • 効果音があるパスなどを格納する設定ファイルを作って Document に配置されるようにする。
  • 効果音がなくてもアプリが起動するようにする。
  • 視線検出デバイスが動作してなくてもアプリが起動するようにする。

です。
そして、今回変更したコミットはこれです。

https://bitbucket.org/satofumi/hots_tools/commits/b7c44a5412623a506adbcd65c0be3f139fdce322

オチとしては、アプリが起動しなかった理由は Tobii の tobii_stream_engine.dll がインストーラに含まれてなかったせい、でした。もっと早く気づきたかった。

ともあれ、アプリとしては適切に動作しませんが、インストールしたアプリが落ちないようにはなりました。

いい感じです。

HotS のミニマップみようツールの作成(4)

ぶっちゃけ、とりあえず最低限の動作をするようになってから進捗がないのもよくないなと思ったので、今回はインストーラを作ります。とはいえ、Visual Studio Installer のプロジェクトを作るだけです。ライセンスとかのファイルも次回以降に配置しようと思います。

https://bitbucket.org/satofumi/hots_tools/src/d237a3e83f476ff09e505db6b03ccbdda98f0840/hots_minimap_instructor/?at=default

そして、インストーラを作ってインストールできるのが確認できたところまでが、これです。インストールしたアプリを実行してみて気づいたことは

  • 見てね効果音、見たね効果音を指定がないとアプリが落ちる。
  • Tobii アイトラッキングのデバイスが起動してないとアプリが落ちる。

うん。
使ってみると実装がまだ全然終わってないことを実感できて良いですね。
次回はこのインストールしたアプリが落ちなくなる調整をしようと思います。

進捗があるの、大事。
いい感じだと思います。

HotS のミニマップみようツールの作成(3)

今回は、視線検出した結果に基づいてミニマップを見てないときに警告音を出力するあたりを実装します。

で、実装したメインのロジックはこのあたり。

        private void UpdateWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            int nextAudioPlayMsec = NoCheckMsec;
            var noCheckElapsed = new System.Diagnostics.Stopwatch();
            noCheckElapsed.Start();

            var previousGameState = state;
            while (!updateWorker.CancellationPending)
            {
                System.Threading.Thread.Sleep(20);
                
                if (IsLookingMinimap)
                {
                    if (nextAudioPlayMsec != NoCheckMsec)
                    {
                        okSound.Play();
                    }

                    noCheckElapsed.Restart();
                    nextAudioPlayMsec = NoCheckMsec;
                }
                else if (noCheckElapsed.ElapsedMilliseconds > nextAudioPlayMsec)
                {
                    warningSound.Play();
                    nextAudioPlayMsec += 2000;
                }
                ...
             }
        }

抜粋でないソースコードはこちら。 https://bitbucket.org/satofumi/hots_tools/src/cf889c6dc2389ea045709e29c03e4e7bf9093a75/hots_minimap_instructor/hots_minimap_instructor/MainWindow.xaml.cs?at=default&fileviewer=file-view-default

このコードでは、定期的に視線がミニマップの中にあるかをチェックした結果の IsLookingMinimap プロパティを利用して、「見てないね効果音」や「見たね効果音」を鳴らしてる。
定期的にポーリングしてるのが微妙によくないけど気にしないことにしたい。イベントトリガをがんがん使ったコードは私には読みにくいので。

で、ここまででとりあえずゲームで使えるレベルのツールにはなったので利用していこうと思う。
次回は、ゲームのロード中か死んでないかを判断するための処理をスクリーンショットから取得するあたりのコードを作成していこうと思う。

いい感じです!

HotS のミニマップみようツールの作成(2)

今回は Tobii Eye Tracking 4C から視線位置を取得するあたりを実装します。
で、作ったのがこれです。作ってみるとわかる。私は C# の勉強が不足している。 理解が Thread までで止まってて少し恥ずかしい。
https://bitbucket.org/satofumi/hots_tools/src/8548dbecc7af809faf053d7d173b2d73ce3afecf/hots_minimap_instructor/hots_minimap_instructor/EyeTracking.cs?at=default&fileviewer=file-view-default

まぁ、とりあえずこれで動くので良いことにする。気になったらまた修正すればいい。
次回は、この得られた視線情報を用いてミニマップの領域を見ているかどうかで警告音を鳴らすあたりを実装します。

HotS のリプレイを可視化するツール(1)

Heroes of the Storm のリプレイファイルを可視化したいなと思っている。
X 軸に時間、Y 軸に各ヒーローのマップ上の Y 位置をプロットしたグラフを作ったらリプレイの雰囲気がわからないかな? と思ったので作って試してみる。

最終的には Web ページでグラフを表示できればいいと思うけど、まずは CSV ファイルにデータを出力して、それを外部ツールで表示して雰囲気を確認しようと思う。

Heroes of the Storm のリプレイファイルの解析には
https://github.com/Blizzard/heroprotocol
この heroprotocol という Blizzard 提供の Python ライブラリを利用します。

で、ヒーロー位置のマウスの位置とかから計算しないといけない、気がする。
よくわからない。次は、もう少しデータを読みこむあたりをやろうと思う。

ただ、MinionXP, CreepXP, StructureXP, HeroXP は定期的に出力されているので、これをグラフ化するのは簡単そうだ。

HotS のミニマップみようツールの作成(1)

Heroes of the Storm というゲームが好きだ。好きだけど上手くない。
なので、上手くなるためのツールを作ろうと思う。
ゲーム画面のミニマップを見るのが重要だけど見てないことが多いので、ミニマップを5秒ほど見なかったら音を出して警告するツールを作る。

使うのは視線検出デバイスの Tobii Eye Tracking 4C で、.NET で C# なアプリケーシンを実装する。

仕様としては

  • ゲーム中にミニマップを5秒見ないことを検出したら警告音を数秒おきに鳴らす。
  • ミニマップを見ない状態からミニマップを見たら、いいね音を鳴らす。
  • ゲーム中とはゲームが開始して死んでない状態とする。

くらい。

まずは簡単なあたり、ゲームが始まったかどうかを検出するあたりから実装する。

最初の実装内容は

  • HotS のゲームが開始しているかを Path.Combine(Path.GetTempPath(), “Heroes of the Storm\\TempWriteReplayP1”) フォルダの有無で監視する。
  • ゲームが開始したら Tobii Eye Tracking 4C からの視線位置の取得を開始する。

を実装する。

で、とりあえずフォルダがあるかどうかを検出して状態遷移をし始めるあたりまで実装した。

https://bitbucket.org/satofumi/hots_tools/src/2a980fbeb6d7bec4c1ce739d84d4591b23390ec9/HotsMinimapInstructor/HotsMinimapInstructor/MainWindow.xaml.cs?at=default&fileviewer=file-view-default

いい感じだ。
次は、視線位置に基づいて音を再生するあたりを実装したい。

Heroes of the Storm での Rank Match (2017-09-21)

Infernal Shrines で Azmodan 使って勝った。 火球が敵の Nazeebo や Kaelthas に命中すると逃げていくのが楽しい。
ただ、終盤は最初の Talent に Sieging Wrath を選んだせいで Azmodan の攻撃力がバーストせずに存在意義が減っていくのが体感できた。短い時間で終わるゲームだと Azmodan が大活躍しそうなのはわかった。

ゲーム終了時に「あなたのヒーローダメージは同じようなプレイヤーに比べて、このくらい多かった」って表示されるのが地味に嬉しい。

そう、勝って当たり前じゃないんだ。勝ったら楽しい気分になろう。

瀕死になっても逃げなかったり、どこまでも追撃するヒーローが多い今のランク帯では、Azmodan みたいに距離関係なく中ダメージを与えられるのは特に有効なのかもしれないと思った。

Heroes of the Storm やってます

のんびり Rank 戦をやってます。(今のランクは Silver 1)  ぶっちゃけていうと私は下手ですが、上手になるように思ったことを書き出していこうと思います。

まず、私のいる Silver 1 のランク帯は、なんだかんだ言ってみんな下手です。 もちろん私も下手です。(えっへん!)

検討内容

マップ: Tomb of the Spider Queen, Rank 戦 (solo)
味方: Murky, Kel’Thuzad, Stitches, Malfurion, Raynor(私)
相手: Malthael, Sonya, Brightwing, Abathur, Johanna
結果: Victory

ゲームの流れ

・ほぼ同じくらいか、少しレベル負けした状態でゲームが進んだ。
・中盤は相手 Malthael と Sonya が無双して集団戦で少し負け気味だった。
・後半は、味方が5人いるのに相手が個別に特攻してきたのを狩れたのと、レベル 20 になった Kel’Thuzad と Raynor で押し切って集団戦で全勝した。

リプレイを見ながら思ったこと

・Raynor(私)は、Malthael の E スキル(Death Shroud)を横に避けてかわそう。
・Mid のレーンで 3 vs 2 なのは別にいいけど、Bot の Murky が Help Ping 出したら誰か寄ってあげた方が良かった。(Top は Raynor)

反省点

・序盤、味方 Murky の Help Ping には、自分が行けないなら “some one go bot, plz” くらいは言うべきだった。
・このマップはオブジェクト参加の強制力が弱いので、相手が Abathur でレーン戦で1人数が多い有利を活かしつつ、Abathur の Locust Strain を優先的に倒しさえすれば EXP 負けせずに有利になるはず、と思ったんだけど、そう思い通りにはいかなかった。
・中盤、殺しにきた相手の Sonya, Malthael に、タイマンでの殴り合いで Raynor が勝てたりはしない。逃げよう

 

「勝ったら実力、負けたら運」についての考察

ゲームで負けると悔しい。  何度やっても負け続けると、そのゲームではもう遊ばなくなってしまうだろう。 長く楽しめる要件として「負けたときの理由を自分以外に転嫁できる」は大事な要素だと思う。

多対多のゲーム(MOBA)の場合

そういう見方をしたときに、多対多の MOBA は「勝ったら実力、負けたら味方のせい」が成り立ちやすいと思う。 Heroes of the Storm を例に上げると Warrior x 1, Assassin x 3, Support x 1 という構成だったときに、

「Warrior が 仕事してなかった」
「Assassin が突撃して死にすぎた」「Support の回復が悪かった」
「集団戦で 1人だけ集まるのが遅くて 4 vs 5 で負けた」
「私が揃う前に集団戦を始めて 4 vs 5 で負けた」

など、各々の立場で他人への批判ができる。 1 人で敵5人の集団に突撃するようなクソ Assassin にさえ「味方がついてこないのが悪い」という言い訳が可能になる。

その批判が適切なことも当然あるし、20 分くらいのゲームにおいては各人が少しずつ批判されうるプレイングになるのも確かだ。

1対1のゲームの場合

負けたときの理由は「相手が強かった」「自分が弱かった」というのが実際のところで、言い訳としては「ユニット、戦略の相性が悪かった」などになる。

負けたときにリプレイを見て「よし、ここが悪かったから次はこうしよう」と切磋琢磨できる人や、相手を出し抜いて勝ったときの楽しさが忘れられない人が遊んでいるように思う。

1人でやるゲームの場合

ソシャゲに多いパズルゲームなんかを想定して書く。 こういうゲームは基本的にはプレイヤーが勝てるように、あるいは敗北がない設計になっているように思う。 それは、負けたときの言い訳が「自分が下手だった」「必要なアイテム、ユニットを持っていないのに挑戦した」くらいしかできないからだ。

実際には、プレイヤーが勝てるステージを何度もプレイできるようになっており、プレイするうちにユニットのレベルが上がって次のステージがクリアできるようになる、という設計で、ゲームの寿命を伸ばしているように思う。

ただ、何度も同じステージをプレイしていると飽きてしまうので、そのあたりの調整はすごく大変だと思う。

まとめ

負けたときに「下手だから負けた」以外の言い訳ができると、ゲームとしての寿命は長くできると思う。 作りたいゲームを考えるときには、こういうのを意識していこうと思った。

負けたときに他人のせいにしてしまうのは、「自分が他人に親切にしたことは覚えてるけど、親切にされたことは忘れがち」という心理も絡んでいるのかもしれない。

 

Heroes of the Storm 反省会(12/30)

Heroes of the Storm をプレイして思ったことを適当に書きます。上手くなるためのトピックとかは、ないです。

1戦目

モード: Quck Match
マップ: Infernal Shrines味方: Sonya, Artanis, Tyrael, Nova, Raynor(私)
敵: Murky, Nova, Arthas, Raynor, Abathur

えっと、味方の Sonya, Artanis, Tyrael が3人チームで参加してたんですけど「なんで3人とも Warrior なんだよ!」ってツッコミたいです。 とてもツッコミたいです。 Warrior が弱いってことはないけど、Assassin よりは攻撃力が伸びにくい。

最初のレーン分け

hots_2015_1230_only_nova

違う、そうじゃねぇ!
チームメイトといちゃいちゃしたいのはわかるけど、「mid の Nova が 1人で寂しそうでしょ!」って思った。 そもそも Artanis はいつまで Core にいるのか。動いて、動いてよ! AFK なの? ってハラハラしてた。 でも、まぁ、ある意味楽しい。

だめだ。 もっと自分のプレイを反省しようと思ってブログを書き始めたのに、負けたゲームのリプレイは見ててつらい。w

味方の反省点を箇条書きで書き出して終わりにしよう。

  • Sonya … 「攻撃したら回復するからw」って思ってるかもしれないけど、体力が2割になったら下がってほしい。
  • Artanis … 味方より敵の数が多いときに攻撃し始めないでほしい。
  • Nova … 茂みの中で待ち続けるんじゃなくて、もっと攻撃してほしい。
  • Tyrael … 普通だった。 ありがとう。
  • Raynor … Object 取り合い中は、敵ヒーローへの攻撃を優先しよう。

まとめ

Warrior が活躍して前半は押してたけど、後半までに Abathur に Split Push で削られたり Nova に私がやられたり、人数が少ないのに集団戦を始めて負けたりしてずるずると負けたゲームだった。

負けました!

2戦目

味方に「お前アホだわ!」って煽られて嫌な気分でプレイしたゲームだった。というか、レーンにやってきた戦車+メディックに対してどう対処すればいいのかわからん。

負けた。
味方にののしられながらプレイするゲームは最悪だった。