黒毛和牛モモバラ切り落し100g298円

iPhoneアプリを作ってます。リリースノートとか用ブログです。

ラノベル 1.1.21 をリリースしました

先日の小説詳細画面の日時が表示されなくなった問題を受けまして、バグ修正リリースを行いました。
こっそり Handsoff(Bluetooth 経由でラノベルで開いてる小説を Mac とかのブラウザで見れる多分それほど嬉しくない機能)対応も行っております。

リリース後、何件か不具合のご連絡を受けており調べておりますが、プログラムの問題は見つかっておらずラノベル側の不具合なのか他の原因なのか現時点では判別できておりません。
挙動におかしい点を見つけられた方はご連絡を頂けると助かります。

Vainglory Advent Calendar 2016 19日目: ダメージ計算したいやでー

この投稿は pchw さん主催の Vainglory Advent Calendar 2016 19日目の記事です。
昨日は nakazu225 さんHow to start VG streaming-これからVG配信を始めたい初心者の為の入門書- でした。

普段ほぼ大乱闘モードしかしてないのでハルシオンフォルドの皆様初めましてという感じなのですが、Vainglory のダメージ計算についてさっくりまとめてみようと思います。

先週 Vainglory 2.0.0 がリリースされ先ほど 2.0.1 を確認しましたが、さすがにちょっと追いかけ切れませんでしたので一部 1.24.0 ベースの話になっておりますがご了承ください。

TL;DR

  • Vainglory の計算式を色々まとめてみるよ
  • 手計算めんどくさいんで Google Spread Sheet 作ってみたよ

Vainglory の計算式まとめ

以下の計算式については全部元ネタサイトの式そのままです。計算するのに不便なので単位とか若干変えているものもあります。

参照元のサイトの方が情報は多いですし、こちらの認識不足等で間違ってるものもあるかもしれませんので、英語の分かる方は元ネタサイトも見て頂いた方が良いかなと思います。

基本攻撃によるダメージの計算

基本攻撃によるダメージ計算は以下のようになっています。
元ネタは http://www.vaingloryfire.com/vainglory/guide/complete-guide-to-vainglorys-hidden-stats-and-calculations-by-an-engineer-4311 です。

武器威力 = ヒーロー武器威力 + アイテム武器威力
基本攻撃ダメージ = 武器威力 / (1 + 敵のアーマー力 / 100)
貫通ダメージ = (アーマー貫通% / 100) * 武器威力 + (1 - (アーマー貫通% / 100)) *
         基本攻撃ダメージ
クリティカルダメージ = 貫通ダメージ * (150 + アイテムクリティカルダメージ)
期待ダメージ = 貫通ダメージ * (1 - クリティカル率% / 100) +
        クリティカルダメージ * (クリティカル率% / 100)

クリティカル率が > 0 の場合、クリティカル率に応じてクリティカルダメージが発生します。クリティカル率が 0 の場合、クリティカルダメージは発生しませんので貫通ダメージがヒーローのダメージとなります。

例として、レベル12 Vox (武器威力149) が Sorrowblade、Tyrant's Monocle、Piercing Spear を装備し、レベル12 Ardan(アーマー96) に攻撃する場合は以下のようになります。

武器威力 = 149 + (150 + 50 + 15)
        = 364
基本攻撃ダメージ = 364 / (1 + 96 / 100)
        = 185.71428571428572
貫通ダメージ = (8 / 100) * 364 + (1 - 8 / 100) * 185.71428571428572
        = 199.97714285714287
クリティカルダメージ = 199.97714285714287 * ((150 + 20) / 100)
        = 339.9611428571429
期待ダメージ = 199.97714285714287 * (1 - 40 / 100) + 339.9611428571429 * (40 / 100)
        = 255.97074285714288

セレス等一部のヒーローは、クリスタル力に応じて追加ダメージが発生します。
クリスタルダメージの計算は、以下のアビリティと同じですのでここでは省略しますが、青ダメージはシールドでダメージが軽減されるようですので、相手に応じて防具を積む必要があります。

また、武器ダメージについては7日目の Kengo_vg さんThe comprehensive weapon build guid が詳しいのでそちらをぜひご覧ください。

攻撃1回あたりに必要となる時間

攻撃クールダウンは次の攻撃が可能になるまでの時間で、ヒーローとアイテムの攻撃速度と、各ヒーロー固有の基本攻撃クールダウン、攻撃ディレイ、ノースタッターステップペナルティ、攻撃スピードモディファイアから求められます。
元ネタは http://forums.vainglorygame.com/index.php?threads/109570/ です。フリッカーの数字は無かったのでこちらで出してます。

まず各ヒーロー固有の数値を挙げます。

ヒーロー 基本攻撃クールダウン 攻撃ディレイ ノースタッターステップペナルティ 攻撃スピードモディファイア
Adagio 0.8 0.25 0.2 100
Alpha 0.8 0.25 0.2 100
Ardan 0.8 0.23 0.2 100
Baron 1 0.5 0.2 60
Blackfeather 0.8 0.3 0.2 100
Catherine 0.8 0.3 0.2 100
Celeste 0.8 0.3 0.2 100
Fortress 0.8 0.3 0.2 100
Glave 0.8 0.3 0.2 100
Gwen 0.8 0.3 0.2 100
Flicker 0.8 0.3 0.2 100
Joule 0.8 0.23 0.2 100
Kestrel 0.8 0.3 0.2 100
Koshuka 0.8 0.3 0.2 100
Krul 0.7 0.29 0.2 100
Lance 0.9 0.5 0.2 50
Lyra 0.7 0.3 0.2 100
Ozo 0.8 0.3 0.2 100
Petal 0.8 0.3 0.2 100
Phinn 1.05 0.3 0.2 100
Reim 0.8 0.3 0.2 100
Ringo 0.8 0.3 0.2 100
Rona 0.5 0.29 0.2 100
Samuel 0.8 0.3 0.2 100
SAW 0.8 0.3 0.2 100
Skaarf 0.8 0.3 0.2 100
Skye 0.8 0.29 0.2 100
Taka 1.1 0.29 0.2 100
Vox 0.8 0.3 0.2 100

攻撃クールダウンにかかる時間は以下のように求められます。
各攻撃には 0.2 秒のスタッターステップ可能時間があり、スタッターステップを行うとクールダウンを短縮することができます。

攻撃クールダウン = 基本攻撃クールダウン /
        (ヒーロー攻撃速度% + アイテム攻撃速度% * 攻撃スピードモディファイア%)
攻撃クールダウン秒 = 攻撃クールダウン + 攻撃ディレイ
攻撃クールダウン秒 (スタッターステップ) = 攻撃/秒 - 0.2

例として、レベル12 Vox (攻撃速度 151) がトルネードトリガーを装備した場合以下のようになります。

攻撃クールダウン = 0.8 / ((151 + 75 * (100 / 100)) / 100)
        = 0.3539823008849558
攻撃クールダウン秒 = 0.3539823008849558 + 0.3
        = 0.6539823008849558
攻撃クールダウン秒 (スタッターステップ) = 0.6539823008849558 - 0.2
        = 0.4539823008849558

1攻撃あたりの期待ダメージとクールダウンが分かれば DPS 計算ができます。(例は省略)

DPS = 期待ダメージ / 攻撃クールダウン秒

アビリティ攻撃によるダメージ計算

クリスタルによるアビリティ攻撃のダメージ計算は以下のようになっています。
元ネタは武器ダメージと同じく http://www.vaingloryfire.com/vainglory/guide/complete-guide-to-vainglorys-hidden-stats-and-calculations-by-an-engineer-4311 です。

2016/12/19 20:30 追記 以下間違いがあったので修正しています 1. アビリティの武器威力はアイテム武器威力のみです 2. アビリティのアイテム武器威力によるダメージは赤(アーマー防御)です

クリスタル力 = アイテムクリスタル力 * (1 + クリスタル増幅% / 100)
武器威力 = アイテム武器威力
アビリティ力 = 基本ダメージ + クリスタル力 * クリスタル率% +
        武器威力 * 武器率%
アビリティダメージ = アビリティ力 /
        (1 + シールド / 100) * (1 + クリスタルダメージ増幅% / 100)
貫通ダメージ = (シールド貫通% / 100) * アビリティ力 +
        (1 - (シールド貫通% / 100)) * アビリティダメージ

例として、レベル 12 Blackfeather が Shattergrass と Broken Myth を持っていて レベル 5 の B スキルで、Aegis を装備したレベル 12 Ardan に対して攻撃した場合は以下のようになります。

クリスタル力 = (150 + 70) * (1 + 0 / 100)
        = 220
武器威力 = 160
アビリティ力 = 240 + 220 * (180 / 100) + 160 * (100 / 100)
        = 796
アビリティダメージ = 796.0 / (1 + 211 / 100) * (1 + 0 / 100)
        = 255.9485530546624
貫通ダメージ = (10 / 100) * 796 + (1 - (10 / 100)) * 255.9485530546624
        = 309.9536977491962

また上記に加え Blackfeather が Clockwork と Broken Myth のスタックを 7 持つ場合、クリスタル力増幅とクリスタルダメージ増幅が加わり以下のようになります。

クリスタル力 = (150 + 70) * (1 + 30 / 100)
        = 286
武器威力 = 0
アビリティ力 = 240 + 286 * (180 / 100) + 0 * (100 / 100)
        = 754.8000000000001
アビリティダメージ = (754.8000000000001 / (1 + 211 / 100))
        = 242.70096463022512
貫通ダメージ = ((10 / 100) * 754.8000000000001 + (1 - (10 / 100)) * 242.70096463022512) * (1 + 35 / 100)
        = 396.7796720257236

なおクレイグのBやケストレルのA/C等の一部のアビリティや武器率による計算には武器ダメージが発生します。 武器ダメージが発生する場合、ダメージ軽減はシールドではなくアーマーが使用されるようです。
(青ダメージはシールド、赤ダメージはアーマーということのようで、武器ダメージのクリスタル率は青ダメージになるが、クリスタルダメージの武器率も青ダメージになるようです。全ヒーローのアビリティについて検証してないので若干怪しいですが。)

アビリティクールダウン時間

アビリティクールダウン時間は各ヒーローのアビリティごとに固有の値(ゲーム中で見れるので省略します)と、アイテムのクールダウン速度から以下のように計算されます。
元ネタは http://forums.vainglorygame.com/index.php?threads/4385/ です。

クールダウン秒 = アビリティクールダウン * (1 / (1 + アイテムクールダウン速度% / 100))

例として、レベル 12 Blackfeather が Clockwork を購入した場合のレベル 5 の B スキルのクールダウン秒は以下のようになります。

クールダウン秒 = 3.5 * (1 / (1 + 40 / 100))
        = 2.5

計算用 Google Spread Sheet

簡単にダメージ計算できる用に Google Spread Sheet を作ったのでリンクを貼っときます。ヒーローとレベル、アビリティレベルとアイテムを選択したらダメージが出るようになっています。一応セルにメモを付けていますが何が何やらやらになっている部分も多いので上の計算式まとめと併用ください。

一部対応していない項目については未対応シートに記載しております。体力喪失系や反射ダメージ、追加ダメージ等のスプレッドシートだとちょっと厳しい項目は入れていません。

docs.google.com

セルの保護とかもしてますし、マスターのファイルは別にありますので好きに使って頂いて構いませんが、共有ドキュメントになっておりみんなで同時に書き込める状態になっていますのでじっくり使いたい場合はコピーして使ってください。

なお、こちらの解釈間違いや検証漏れ転記漏れ等々で数字が間違っている場合はあると思います。申し訳ありませんが間違ってたらすみません。

Spread Sheet はバージョン 1.24.0 のデータが元になっています。ヒーローの細かい数字とかもちょいちょい変わってるようですので最新版の数字が欲しい方はコピーして編集してください。
Spread Sheet 中の App Script についてはスクリプトを作る Python スクリプトを Gist に置いてますので編集する際はこちらもどうぞ。

mkscript.py · GitHub

最後に

アビリティについては単純に計算できない項目も多く、ヒーロー固有の能力も大きく影響しますのでダメージ計算だけで強さを測れるものでもないですが、知ってると色々便利かなーと思います。

本題と関係ありませんが、手元に(もっと簡単な計算しかしてませんでしたけど)OpenOffice のドキュメントがあったので Google Spread Sheet に変換して機能追加したらすぐできるかなと思ってネタを決めたのですが、思っていたより大変だったので普通に Web アプリでも作っとけば良かったかなと言う感じです。

本当はスプレッドシートだけでうまいことやりたかったのですが、なかなか計算がややこしく結局 JavaScript 使うハメに陥ってしまいました。中身もぐっちゃらぐっちゃらなので公開する前に整理しようかなと思ってたのですが、2.0.0 がリリースされて色々変えるところも多いのでとりあえず諦めました。

来年初頭に API もリリースされるそうなのでツール作りは捗りそうな感じですね。

明日の Vainglory Advent Calendar 2016 は mirai64335 さん の「1年以上vaingloryを遊んできて今考えること」です。

ラノベル 1.1.19 をリリースしました

AppStore には一昨日ぐらいに出ていましたので既に更新された方もいらっしゃると思いますが、ラノベル 1.1.19 をリリースしました。 リリースノートにも書いていますが、修正点は以下の通りです。

  • クラッシュするバグを何種類か修正しました
  • ルビの優先度に関するバグを修正しました
  • 一部の小説を削除してもアプリのストレージ使用量が減らないバグを修正しました
  • ライセンス画面を変更しました
  • その他細かいバグも修正しています

アプリサイズが大きく小説を消してもてバックアップが出来ないとのご報告を頂いておりましたが、小説を消した際に画像も消すように変更しましたので解決しているかなと思います。 ライブラリを更新して不要な処理をいくつか消したのが原因かどうか分かりませんが、アプリのサイズがちょっと減ってるような気がします。

NSCachesDirectory と NSTemporaryDirectory に関するメモ

忘れそうなのでメモ。

それぞれがシステムから消されるタイミングは?

Apple のドキュメント File System Basics には、Caches ディレクトリは very low on disk space の時にシステムが消すことがあると書いてある。アプリが実行中には発生しないようなのでバックグラウンド起動中は発生するっぽい?

In iOS 5.0 and later, the system may delete the Caches directory on rare occasions when the system is very low on disk space. This will never occur while an app is running. However, be aware that restoring from backup is not necessarily the only condition under which the Caches directory can be erased.

同ドキュメントに Temporary ディレクトリの削除についても書いてあって、アプリが実行していない間に purge されると書いてある。

Use this directory to write temporary files that do not need to persist between launches of your app. Your app should remove files from this directory when they are no longer needed; however, the system may purge this directory when your app is not running.

Qiita とか stackoverflow だと、Caches はアプリ実行中に消されることがあって、Temporary は実行中に消されることは無いと書いてあることが多いんだけど、Apple のドキュメントを見る限り never occur while an app is running と when your app is not running なんで少なくともフォアグラウンド状態なら消されることは無いんじゃないですかね?

NSCachesDirectory ディレクトリのサブディレクト

Apple のドキュメント Accessing Files and Directories には、NSCachesDirectory の下に bundle_ID ディレクトリを作ってそこにファイル置いた方が良いと書かれている。

Use the Caches directory constant NSCachesDirectory, appending your <bundle_ID> directory for cached data files or any files that your app can re-create easily.

まったくもってその通りなんだけど、その辺適当にやってくれる便利メソッドあっても良いんじゃないですかねーという気が。ちなみに自分のアプリはこれやってたりやってなかったりで、ちょうどいじくってたアプリがやってなかったので OMG な感じでした。

なお bundle_ID は [[NSBundle mainBundle] bundleIdentifier] で取れる模様。

最後に全く関係ないですが、はてなブログMarkdown 使いにくいです。

追記

NSCachesDirectory の下に [[NSBundle mainBundle] bundleIdentifier] を作ると良いらしいと書いたが、実際のアプリには既にそのフォルダが存在している。何に使ってるか不明だが、そこには置かない方が良いようだ。

ブログのコメントの返信をしました

ブログに頂いたコメントについて、長い間返信していなかったのですが先ほどお返事させていただきました。
一応コメントの方は見ていましたのでラノベルに頂いたご要望はだいたい把握しておりましたが、あまり修正に割ける時間が無いもので「すぐできません」とお返事するのもアレな感じでスルーしておりました。どうも申し訳有りません。

返信したということは時間ができたのか?という話になると思いますが、そういう訳でも無かったりします。
ただiOS10対応とかそんなにすること無いやろうと思って放置してたら、今までに無いレベルでバグが出たので慌てて直したりしたのもあまりよろしく無いなーという感じでして、あと最近iPad買ったのでなろう見ようと思ったらいまいち使いにくいのでその辺なんとかしたいなーと思ってます。

そんな感じですのでアプリの更新ペースをがっつり上げれる感じでは無いのですが、ぼちぼちやっていきたいなと思ってますので気長に見守っていただければと思います。