IDOLY PRIDE ゲームシステム解析

前書き

この記事は初心者向けのゲームシステム紹介ではなく、ある程度ゲームになじんでいる人向けの考察文です。
文章の中のデータの出所はほとんど逆コンパイルによるゲームマスターデータの復号化と通信トラフィック解析から得たもの。一部の計算式は逆コンパイルから得たものだがスコア計算に関する計算式は統計学分析から得た結論なので必ず正確ではない。

なお、データや計算式などゲーム考察に関する異論とディスカッションは大歓迎だが、マスターデータとトラフィック解析に関する質問とリクエストは悪用防止のため一切返答しかねます

Please be aware that any questions or requests relate to decryption of master database and traffic will be ignored unconditionally.

1. キャラクター能力値

このチャプターはキャラクターの能力値、Da Vo Vi St に関する情報を紹介する。

1.1 マスター値

マスター値は、ユーザーの進行状態など外部の要因の影響を受けない全員一致のシステム上の設定値である。後ほどのユーザー値やデッキ値などは全部この値から派生されたものなので、自分はベース値とも呼んでいる。
この値の計算式は以下のとおり

Vbase=VpamPpam1000Pbns1000\boxed{V_{base} = \lfloor \lfloor V_{pam} \cdot \frac {P_{pam}} {1000} \rfloor \cdot {P_{bns} \over 1000} \rfloor} VbaseV_{base} は、Da Vo Vi St の中任意の一つである。 VpamV_{pam} は、ゲームのマスターデータの中に格納された固定の整数である。

例として、以下はデータの一部抜粋:

id level value staminaValue
card-param-01 1 250 1000
card-param-01 10 1333 1022
card-param-01 100 31097 1649
id level value staminaValue
card-param-02 1 238 950
card-param-02 10 1266 971
card-param-02 100 29542 1567
id level value staminaValue
card-param-03 1 213 850
card-param-03 10 1133 869
card-param-03 100 26432 1402

上記のテーブルの中、value 或いは staminaValue は上記の VpamV_{pam}level はキャラクターのレベルのこと。id は該当するキャラクターの能力値の分類であり、現在の時点では 01~03 の3種類パターンがある。VpamV_{pam} だけを見れば、01 は全面的に 02 より優れていて、02 は全面的に 03 より優れている。

ちなみに初期☆5のカードは全員グループ01に分類されていて、☆4は02、☆3は03になっている。

PpamP_{pam} は、マスターデータの中に格納されたカードごとに設定されていた千分率である。

例えば☆5初期さくらの場合は

vocalRatioPermil danceRatioPermil visualRatioPermil
420 310 270

に設定されている。千分率だけど、この三つの値の総和は必ずしも 1000 ではない。つまり同じグループに分類されていても、カードの三つの能力値の総和は必ずしも同じではない
スタミナの Permil は現在のところ全員およそ 1000 の近くに設定されている。

PbnsP_{bns} は、カードのレアリティボーナスである。これもマスターデータの中に格納されていて、以下のとおりになっている。
rarity parameterBonusPermil
1 1000
2 1050
3 1100
4 1150
5 1200
6 1250
7 1300
8 1350
9 1400

rarity はカードの現在のレアリティである。ご覧の通り☆を一つ上げればステータスは 5% 上がる。

例:☆9初期さくらの Vocal 値を例として、グループ01 Lv.180 の VpamV_{pam} は 119850、PpamP_{pam} は上記の 420、☆9なので PbnsP_{bns} は 1400。この時のベース値は

119850420100014001000=70471\lfloor \lfloor 119850 \cdot \frac {420} {1000} \rfloor \cdot \frac {1400} {1000} \rfloor = 70471

である。

1.2 ユーザー値

ユーザー値は、マネージャーのみなさんが毎日でも開いてるゲームのアイドル詳細画面で表示された値である。間違われがちなんだがアイドル詳細画面の値はベース値ではない。この値自体に実は意味がないが一番確認されやすいので一応紹介する。
この値の計算式は以下のとおり

Vusr=Vbase(1+Pyell1000)+Vbns\boxed{V_{usr} = \lfloor V_{base} \cdot (1 + {\sum P_{yell} \over 1000}) \rfloor + \sum V_{bns}} VbaseV_{base} は `#1.1` のマスター値。 PyellP_{yell} はユーザーが持っているカードの乗算エールボーナス。 VbnsV_{bns} はユニオンのスタッフ育成の値とユーザーが持っているカードの加算エールボーナス(現在のところそんなカードはいないんですが)の総和である。

例:同じく☆9初期さくらの Vocal 値を例として、VbaseV_{base}#1.1 で得た 70471、自分が所持している全カードのボーカルエールボーナスは 9.5%、スタッフ育成はLv.42 の 8477、代入すると

70471(1+951000)+8477=85642\lfloor 70471 \cdot (1 + \frac{95} {1000}) \rfloor + 8477 = 85642

である。
アイドル詳細画面で確認してみると
image
計算結果と一致している。

1.3 デッキ値

デッキ値は、カードがユニット編成された時の値である。
この値の計算方法は #1.2 のユーザー値の計算方法とほぼ完全一致であるが、違いはデッキ値はアクセサリーやフォトの属性ボーナスも入っているところだけ。
計算式は以下のとおり

Vdeck=Vbase(1+min(Pbnsyell, accs., photos1000,1000))+Vbnsstaff, accs., photos\boxed{V_{deck} = \lfloor V_{base} \cdot (1 + \min({\overbrace{\sum P_{bns}}^{\text{yell, accs., photos}} \over 1000}, 1000)) \rfloor + \overbrace{\sum V_{bns}}^{\text{staff, accs., photos}}} VbaseV_{base} は `#1.1` のマスター値。 PbnsP_{bns} はエール、アクセサリー、フォトの乗算ボーナスの総和。このボーナスの最大値は 1000 に制限されている。 VbnsV_{bns} はアクセサリー、フォトの加算ボーナス、ユニオンのスタッフ育成のボーナス値の総和である。

デッキ値はライブ中のベース値にもなっている。つまりライブ中カードのすべてのステータスはデッキ値を基準に変動する

1.4 メンタルとテクニック

メンタルとテクニックはカードやレベル問わず全員一致で初期値は 100 である。ライブ外でこの二つの値を変えられるのは現在のところエール、スタッフ育成、アクセサリー、フォトのみになっている。計算の仕方は四つの値を加算すれば OK なのでわざわざ書かなくても問題ないかと思う(本音は書くのめんどい)。

2. スコア計算式

最初に説明する。アイプラのスコア計算はすべてサーバー側で行っているのでクライアント側のアセンブリをいくら解析してもライブスコアの計算式を見つからなかった。故に #2.2 ~ #2.3 の計算式は全部機械学習と統計学分析と仮定と妄想による実戦データを最尤推定と回帰モデルを用いて導かれた結論である。あくまでも統計学分析の結論なので必ずしも正確ではない。もし異論がある場合は是非教えてください。異論は大歓迎です。

2.1 スコアボーナス

スコアの計算式を紹介する前に、先ずはスコアに影響する 5 種類のスコアボーナスを理解しなければならない。

2.1.1 Combo ボーナス

以下のとおり

Pcmb=(Pmap1000)(1+Pbns1000)1000\boxed{P_{cmb} = \frac {(P_{map} - 1000) \cdot (1 + \frac {P_{bns}} {1000})} {1000}} PmapP_{map} はコンボ数をマスターデータの中にあるコンボボーナス表にマッピングした結果。
comboCount advantagePermil
10 1050
20 1100
30 1150
40 1200
50 1250
70 1300
100 1500
PbnsP_{bns} はスキルによるコンボスコアボーナス(小悪魔渚など)。

2.1.2 オーディエンスボーナス

オーディエンスボーナスは、来場ファン数に応じて得られるスコアボーナス。
このボーナスはユニット全体ではなく、来場したアイドル個人のファン数に応じてその個人に影響を与える(DDは現在認められていない)。来場ファン数とスコアボーナスのマッピング表はマスタデータの中に事前に定義されていて、以下は一部抜粋

audienceAmount advantagePermil
10 1001
100 1010
1000 1100
10000 1500
50000 2000

そして肝心の来場ファン数の計算方法についてなんだが、ここにはゲームの中で言及されていない隠しパラメータが存在している。
解析から得た結論を言うと、ファンはライト層、ミドル層、ヘビー層の3種類に分かれている、三種の総和はアイドルの総ファン数となる。そしてライブの来場ファン数はキャラ1人につき、この三種の数とそれぞれの重みによって決められる。

Naud=lightFan×5%+middleFan×20%+heavyFan×50%\boxed {N_{aud}' = \text{lightFan} \times 5\% + \text{middleFan} \times 20\% + \text{heavyFan} \times 50\%}

さらに会場には座席が制限されているので実際の場合キャラ1人につきボーナスの計算に影響できるファン数は上限がある

Naud=min(capacity5, Naud)\boxed{N_{aud} = \min(\frac {\text{capacity}} {5},\ N_{aud}')} capacity\text{capacity} は会場の座席数である。

ここで得た来場ファン数を上記の表にマッピングして最終的にアイドル個人のオーディエンスボーナスの値を得られる。

2.1.3 エールボーナス

ユーザーが所持しているすべてのカードのエールの総和のこと。
ライブ詳細で簡単に確認できるので言うべきことは特にないと思う。

2.1.4 フォトボーナス

ユニット編成でカードに装備されていたフォトのスコアボーナスの総和のこと。
これも簡単に確認できるので全部加算すれば OK。

2.1.5 クリティカルボーナス

クリティカルボーナスの初期値は 50%。それをエール、フォト、クリティカル係数アップスキルと加算して最終の値を得られる。

Pctb=500+Pyell+Pphoto+Pskill1000\boxed{P_{ctb} = \frac {500 + \sum P_{yell} + \sum P_{photo} + \sum P_{skill}} {1000}}

2.2 ビートスコア

計算式を投げる

Sbeat=λVbaseNbeat(1+Pphoto+Pyell+Pskill1000)(1+Paud1000)(1+Pcmb1000)(1+Pctb1000)(1+α)+Sfin,α[0.05,0.05]\boxed{S_{beat} = \frac {\lambda \cdot V_{base}} {N_{beat}} \cdot (1 + \frac {P_{photo} + P_{yell} + P_{skill}} {1000}) \cdot (1 + \frac {P_{aud}} {1000}) \cdot (1 + \frac {P_{cmb}} {1000}) \cdot (1 + \frac {P_{ctb}} {1000}) \cdot (1 + \alpha) + S_{fin}, \quad \alpha \in [-0.05, 0.05]} λ\lambda は整数 8 に近い変数である。この値はライブごとに最大 $\pm0.4$ くらい変動するが 8 として認識するのは特に問題はないと思われる。(多分この変動は何らかの規律性があると思われるのですが調べ不足のせいで今のところまだ解明していません) VbaseV_{base} はアイドルの能力値とライブごとに設定されていた能力値の重みから計算できる。計算方法は Vbase=da,vo,viVlivePwgt1000V_{base} = \sum_{da, vo, vi} \frac {V_{live}P_{wgt}} {1000} VliveV_{live} はライブ中アイドルの Da Vo Vi のうち一つ。 PwgtP_{wgt} はライブごとに設定されていた `beatDanceWeightPermil`、`beatVocalWeightPermil`、`beatVisualWeightPermil` のうち一つである。

例:ライブ中アイドルのステータスは Da128760, Vo209540, Vi85853、そのライブに設定されたステータスの重みは Da250, Vo600, Vi150、VbaseV_{base}

Vbase=128760×2501000+209540×6001000+85853×1501000=170791V_{base} = \frac {128760 \times 250} {1000} + \frac {209540 \times 600} {1000} + \frac {85853 \times 150} {1000} = 170791

一言付け加えると、PwgtP_{wgt} の総和は必ずしも 1000 ではない、1500 や 2000 の場合もある。そういうライブをライブ詳細で確認する時は「ビートスコア 1.5 倍」などのヒントが見られる。

NbeatN_{beat} は、そのライブの総ビート数。A、SP はこちらに含まれていない。 Pphoto, Pyell, Paud, Pcmb, PctbP_{photo},\ P_{yell},\ P_{aud},\ P_{cmb},\ P_{ctb} は `#2.1.1` ~ `#2.1.5` の値。クリティカル発生しなかった場合 PctbP_{ctb} は 0。 PskillP_{skill} はスコアアップ、ビートスコアアップなどのスキル効果値。 α\alpha は範囲 [0.05, 0.05][-0.05,\ 0.05] で離散一様分布する乱数である、間隔は 0.001。 SfinS_{fin} はフォトやエールなどのスコアへの固定値ボーナス。

2.3 A、SP、P スキルスコア

A、SP、P のスキル計算式は同じ

Sact=VlivePratePwgt1000(1+Pphoto+Pyell+Pskill1000)(1+Paud1000)(1+Pcmb1000)(1+Pctb1000)(1+α)+Sfin,α[0.05,0.05]\boxed{S_{act} = V_{live} \cdot P_{rate} \cdot \frac {P_{wgt}} {1000} \cdot (1 + \frac {P_{photo} + P_{yell} + P_{skill}} {1000}) \cdot (1 + \frac {P_{aud}} {1000}) \cdot (1 + \frac {P_{cmb}} {1000}) \cdot (1 + \frac {P_{ctb}} {1000}) \cdot (1 + \alpha) + S_{fin}, \quad \alpha \in [-0.05, 0.05]} VliveV_{live} はそのレーンの色に応じたライブ中アイドルの Da Vo Vi のうち一つの値。 PrateP_{rate} は発動する A、SP、P スキルのスコア倍率。 PwgtP_{wgt} はライブごとに設定された A、SP、P スコアの重み。普通は 1000 であるが 1500、2000、3000 の場合もある、そういう場合はライブ詳細画面で「Aスキルスコア 1.5 倍」などのヒントが確認できる。 Pphoto, Pyell, Paud, Pcmb, PctbP_{photo},\ P_{yell},\ P_{aud},\ P_{cmb},\ P_{ctb} は `#2.1.1` ~ `#2.1.5` の値。クリティカル発生しなかった場合 PctbP_{ctb} は 0。 PskillP_{skill} はスコアアップ、A スコアアップなどのスキル効果値。 α\alpha は範囲 [0.05, 0.05][-0.05,\ 0.05] で離散一様分布する乱数である、間隔は 0.001。 SfinS_{fin} はフォトやエールなどのスコアへの固定値ボーナス。

3. スキル

スキルに関する検証はすでにこちらのスプシ(Author: やるキ士)でほぼ検証済みなのでリンク先を参照してください。

補足すると、以下の表はマスタデータとトラフィックの解析から得られたスキル効果に関する情報です。が、value の部分は驚くにマスタデータの中に格納されていないのでその部分は LiveResult のトラフィックを解析して valuegrade\frac {\text{value}} {\text{grade}} の形から得られた値です。ですがこのゲームの小数は千分位以下切り捨てされてしまうので割り切れない場合は段階数を変えて検証を繰り返さなければならない、そのあたりはなまじめんどいのでやってなかった。

でかいので折りたたんでおいた。

[Click Me] 詳細表
SkillEfficacyType enum value1 value2 maxGrade 備考
Unknown 0
ScoreGet 1
FixScoreGet 2
ScoreGetByMoreFanAmount 3
ScoreGetByLessFanAmount 4
ScoreGetByMoreFanEngage 5
ScoreGetByMoreStamina 6
ScoreGetByLessStamina 7
ScoreGetByMoreComboCount 8
ScoreGetByStrengthEffectCount 9
ScoreGetByTrigger 10
StaminaConsumptionReduction 11 50 20
ComboContinuation 12
DanceUp 13 50 20
VocalUp 14 50 20
VisualUp 15 50 20
ScoreUp 16 25 20
BeatScoreUp 17 100 20
ActiveSkillScoreUp 18 50 20
CriticalRateUp 19 50 20
CriticalBonusPermilUp 20 50 20
AudienceAmountIncrease 21 50 5.4くらい 10 9段階48
StaminaRecovery 22
FixStaminaRecovery 23
WeaknessEffectRecovery 24
StrengthEffectCountIncrease 25
StrengthEffectValueIncrease 26
CoolTimeReduction 27
AudienceAmountReduction 28 50 3.7くらい 10 8段階29
SkillImpossible 29
DanceDown 30 50 20
VocalDown 31 50 20
VisualDown 32 50 20
StaminaConsumptionIncrease 33 50 20
SpecialSkillScoreUp 34 30 20
TargetStaminaRecovery 35
ScoreGetByStatusEffectTypeGrade 36
SkillSuccessRateUp 37 50 37.5 10
TensionUp 38 50 15 10
ScoreGetBySkillActivationCount 39
WeaknessEffectPrevention 40
ComboScoreUp 41 100 20
PassiveSkillScoreUp 42 100 20
ScoreGetByMoreStaminaUse 43
WeaknessEffectInversion 44
StrengthEffectMigrationBeforeActiveSkill 45
StrengthEffectMigrationBeforeSpecialSkill 46
ScoreGetByDeckSupporter 47
ScoreGetByDeckBuffer 48
StaminaConsumption 49

3.1 スキル発動順番

スキルの発動について、基本的に以下のフローチャートのように行われる。

flowchart LR
    subgraph pre ["ユニット内"]
    direction LR
        preindex("〇〇前発動 P スキル")
        preindex -. "メンタル順" .-> preindex
    end
    
    subgraph muin ["ユニット内"]
    direction LR
        after("無印 P スキル")
        after -. "メンタル順" .-> after
    end

    subgraph photo ["ユニット内"]
    direction LR
        pab("フォトスキル")
        pab -. "メンタル順" .-> pab
    end

    start["ビート開始"]
    endd["ビート終了"]
    beat{{"ビート & A & SP\n(スコア精算)"}}
    endd["ビート終了"]
    
    start --> pre --> beat --> muin --> photo --> endd

ただし

  • ライブ開始最初の2ビートのみ、無印スキルはスコア精算の前に発動する。
  • 同じキャラが持つ複数のパッシブスキルは同時に使える場合、それらのスキルのインデックスに沿って1ビートに一つのスキルのみ発動していく。

ちなみにライブ中全ての行為はオーダーが付いてる、そのオーダー順に従って全ての行為が順次に効果を発揮する。

4. ライブバトル

ライバに関する検証もこちらの素晴らしいスプシで完璧に検証されているのでリンク先を参照してください。補足することは何もないです。

5. その他

5.1 スキル発動成功率(メンタル)

メンタル要求:特大

この二文字を見ると胃が痛くなるのは自分だけじゃないはずだと信じている。
ライブスキル成功率は以下のように計算される

rate=min(1, PocpmentalmentalThresholdPprs1000)\boxed{\text{rate} = \min(1,\ \frac {P_{ocp} \cdot \text{mental}} {\text{mentalThreshold} \cdot \frac {P_{prs}} {1000}})} PocpP_{ocp} は会場座席全体の埋め率。 mentalThreshold\text{mentalThreshold} はライブごとに設定されていたメンタルの閾値。 PprsP_{prs} はそのライブのプレッシャーに見合った千分率である。 PprsP_{prs} と千分率のマッピング表は以下のとおり
id name weightPermil
quest_pressure-0 1
quest_pressure-1 143
quest_pressure-2 普通 999
quest_pressure-3 1571
quest_pressure-4 1857
quest_pressure-5 特大 2500

5.2 フォトについて

フォトの品質は現在 200 まで用意されているがゲームの中では MAX 155 の制限がかかっている。
品質が同じの場合☆5のフォトは全面的に☆4のフォトより強い。平たく言うと☆4とそれ以下のフォトは全部ゴミ。


今のところ得た結論は以上。また何か思いついたらその時追加する。

 Comments
Comment plugin failed to load
Loading comment plugin