彦星師匠の漂流記

星屑のまにまに。

【雑記】敵対心・ターゲット抽選処理の話

騎空士各位

 

 どうも、彦星です。

  

 敵対心とかターゲット抽選の処理に関して、少しネットでも調べてはみたのですが、なかなか記事にまとめてくれてる人がいなくて、某攻略サイトなんかは、敵対心系のアビリティも普通に検証して「敵対心〇%アップ」とか普通に書いてあるけど、なんだかよくわからない人も少なくないと思います。

 

 そもそも被攻撃対象ってどうやって選ばれてるの?

 敵対心…即ち「確率で狙われやすくなる / 狙われにくくなる」というのはどういう事なのか?

 

 このあたりのイメージをまとめていこうと思います。

 

■基底のターゲット抽選処理について

 こういった抽選処理というものについて、プログラムに触れた事のある人とそうでない人では、ぱっとどんな処理をしてるかのイメージの付きやすさに差があるかと思います。

 

 僕もゲーム作ったことはないし、ゲームプログラムの解析もしたことがないので、実態どういった手法がメジャーかは定かではないですが、オーソドックスな抽選処理っていうと、下記の感じだと思います。

 

f:id:master_hikoboshi:20170709105209p:plain

 

 厳密には乱数の生成方法によって偏りが生じる場合もありますが、基本的には各キャラが均等に25%ずつターゲットされ、100%の確率で4人のうち誰かがターゲットされる(※)状態です。

※注釈:当たり前だけど、基底の抽選処理として必ず誰かがターゲットに選ばれなければならないので、PT全体のタゲ率が100%を超えることも100%を下回ることもありえません。⇒敵対心の話につながるのでここはしっかり押さえて読み進めてください。

 

 

■敵対心による操作

 ではここに敵対心という概念が加わった場合どうなるでしょうか。

 難しい、という人も多いでしょうかね。

 

 上で「100%の確率で4人のうち誰かがターゲットされる状態」という表現を使いましたが、大事なのは、誰かのターゲット率が上昇するという事は、他のキャラのターゲット率が減少するという事です。

 

 問題はこの計算をどのようにして行っているか。そして、それによってまた結果も変わってきます。

 

 たとえば、「キャラCの敵対心が30%上昇する」という効果があったとしましょう。

 この敵対心という概念が、額面通りキャラCのターゲット率に加算される(基底の抽選処理内に盛り込まれる)と仮定した場合、以下の様なイメージになります。

f:id:master_hikoboshi:20170709115711p:plain

f:id:master_hikoboshi:20170709132235p:plain

 ↑画像はクリックで拡大できます。

 

 帳尻合わせ配分、そしてそれを適用乱数の幅に再設定するのが結構面倒ですね。

 ここにさらにキャラDのタゲ率が10%下がって、キャラBは20%タゲ率が上がりました、って言ったら計算はどんどん複雑化していき、実際に処理が動いたときに最終的な値が「どういう計算の結果そうなったのか」が、作った側としてもわかりにくくなりますよね。

 

 もっと単純な作りにしておかないと、バグった時の原因特定や、追加機能の改修があったとき大変になります。

 

 

 じゃあ単純な処理というとどんなやり方があるか?

 少なくとも機能単位で切り離して考える様な作りにしているとした場合、

 

 ①敵対心判定

    ↓ ターゲットが選ばれなかった

 ②基底の抽選処理

 

 という風に段階的な処理にすることが考えられます。

 

 特に、こういった「バフやスキルに影響を受ける確率」の判定処理については、連続攻撃の判定が

 

 ①トリプルアタックの発生有無判定

       ↓ 発生しない場合

 ②ダブルアタックの発生有無判定

       ↓ 発生しない場合

 ③確定シングルアタック発生

 

 と行われているのは有名な話ですし、同様の考え方で実装されている可能性はアリ寄りのアリだと思います。

 

 わかりやすくさっきの「キャラCの敵対心が30%上がった場合」を例にもう一度見てみます。

 今回は上昇分の敵対心を元に、「30%の確率でキャラCがターゲットになるかどうか」を、基底の抽選処理の前段階で判定します。つまりこう。

 

 ①キャラCがターゲットになるかどうか(30%)判定

     ↓ ターゲットにならなかった

 ②基底の抽選処理

 

 「実際のターゲット率」の計算の仕方は以下です。

f:id:master_hikoboshi:20170709135746p:plain

↑画像はクリックで拡大できます。

 

 仮説っぽい言い方をしましたが、実際には検証の結果そうだと考えている、あるいは確信を持っている先達の検証人の方々もこういう処理をしている前提で「敵対心〇%アップ」と言っていると思うので、今までどうやって計算していいかわからなかったって人は、ぜひ実際に記載の確率を当てはめて計算してみてください。「〇人PT時〇%」というのが併記されていれば、それと比較してみると計算が合う事も確かめれると思います。

 

■ここからもっと難しい話

 すでに結構おなかいっぱいだよ~って人はあんま無理せずブラウザバックしてくださいねw

 ここまでが理解できればそんな困らないです。

 と言うのも、この敵対心、ターゲット抽選の話は、何千何万という試行を重ね、誤差の範囲を狭め、どんなに正確な値を検証しても、それが実戦で生きる事はほぼ無いと言っても過言ではない分野です。

 

 普通に考えて、一戦闘あたりの総被弾数なんてのはそもそもが二桁程度ですから、千万単位の試行でやっと収束する程度の確率って、この単位で考えるとめっっっちゃくちゃブレるんですよね。

 

 この辺の検証する意味の無さみたいのが、この分野の検証が他と比べ進んでない大きな要因なのかな~とか思ってたりもしますが。

 

 余談はそんなもんで。。。

 

 ここまでで解決してないのが、

 ・じゃあ複数キャラの敵対心が上昇している場合はどうなるのか?

 ・一人のキャラに複数の敵対心バフがついてる場合の扱いは?

 ・あと敵対心ダウンの判定って、それだと出来なくない?

 って部分。

 

 特に敵対心ダウンに関しては僕も実際に検証してみてわかったのですが、実際のターゲット率が小さくなるせいか、正確な値の検証には試行1万5000回とか、それ以上を要求されるって所で「この分野でそこまで労力をかける事にいったい何の意味があるのか…」と心が折れて、推測でしか話せないのでありますが…

 「この世界の真理をただ突き止めたいー」

 そんな鋼の意志を持った生粋の錬金術師の方の一助になればと思い、僕の考えを一応記載しておきます。

 

〇ターゲット抽選処理の流れ

f:id:master_hikoboshi:20170709201653p:plain

↑画像はクリックで拡大できます

 

 簡単に説明します。

 

〇敵対心アップ分の判定

 ここでは、上昇分の敵対心について、その確率を元に対象がターゲットになるかどうかを判定します。

 そしてこの計算の単位についてですが、この計算がキャラ単位ではなく、1キャラの中でも所謂「枠」ごとに判定してるかもしれない、というのはこちらの検証結果から思った事です。

 白虎杖の効果量が35%、リミボ敵対心アップ(大)の効果量が20%という検証結果が正しいとした時、

 試行2000回では、これらが加算の関係であれば64.1%~68.3%、乗算の関係であれば58.8%~63.1%の間にサンプルが現れる可能性が高い中で、実測が60.3%だったためそう判断した次第です。

 

 大元の白虎杖やリミボの敵対心アップの結果が、偶然大きくブレてしまっている可能性も考えると微妙な所ですし、そこが加算か乗算かの違いを一戦闘単位で実感する事はないと思うので、まぁそういうのもあるのかー程度にとどめておいてください。きっとこの辺は錬金術師の方がいずれ解明してくれるでしょう(他力本願)。

 

〇敵対心ダウン分の判定

 ここは予想になります。

 段階処理の一つとして組み込もうと思うとこれしかないんじゃないかな~というレベルでものを言ってます(

 敵対心アップの時の判定とは違い、その確率に基づいて何か判定を行ったとしても、その時点ではターゲットは確定していません。じゃあどうやってそこから確定させるのか?って言った時に、基底の抽選処理に流してフラットに判定させるのが自然な流れだろうという事で、そう書きました。

 例えば、4人PTでキャラDの敵対心が40%下がってました、といった場合、40%の確率でキャラA~キャラCまでの3人で抽選処理を行うイメージです。

 

 〇基底の抽選処理

 対象が一人なら100%、二人なら50%ずつ、三人なら33%ずつ(一人だけ34%?)、四人なら25%ずつになるような判定を行います。

 

 

■最後に

 今一歩踏み込みきれない深い深い検証沼であります。

 僕も別に検証人というわけではないので、ほんまもんの検証人の方からしたら鼻で笑われるかもしれませんが、これ以上の検証をやること自体に意義を感じないので、予想も含めたふわっとした感じの記事になりました。

 実戦レベルでは、この記事くらいの当たらずとも遠からずな認識で、雰囲気を掴めてれば問題ないかと思います。

 

 

 では皆さん、良き空の旅を。