目次
バフ点数の計算式(女クルセ)
留意点
- 本記事はAIによって書かれています。
- この記事は、女クルセイダーの「バフ点数」の内部計算式を特定した記録。
- 以下に出てくる
INT_SIMULATORなどの識別子は、内部データ構造の調査で見つかったメモリ上のフィールドに解析者が便宜的に付けた名前。ゲーム内表示名との対応は文字列リソース等で直接確認したものではなく、推定を含む。 - ステータスID
1/4の正式名称など、一部は実測から強く推定しているだけで確定していない項目もある(後述)。
バフ点数とは
- 装備シミュレーターやPT申請画面などに表示される、バッファーとしての性能を1つの数値にまとめたスコア。
- 内部的にはバフ点数を計算する関数呼び出し直後、戻り値レジスタにそのままバフ点数が入っている。ここをアンカーに内部処理の流れを遡って計算式を特定した。
結論: 計算式
- 最後の
× 0.001以外はすべて float32(単精度)演算。最後だけ double に上げて0.001を掛け、0方向へ切り捨てる。
X = INT_BUFF_BUILD / 2993 + 1
Y = X * (2 + BUFF_POWER_BUFF_BUILD / 4800)
U = Y * G0 * (1 + 0.12) + 25000
V = Y * G1 * (1 + 0.12) + 3300 + G7
M = (INT_SIMULATOR / 7500 + 2) * ((68000 + BUFF_POWER) / 8500 + 1) + INT_SIMULATOR / 7500 + 1
R = ((M * G2 + U + INT_ARCHANGEL_BLESSING) * 0.004 + 1) * V
R = R * 1.174241 // 実測範囲では常に適用される
バフ点数 = trunc(R * 0.001) // ここだけ double 演算
export interface BuffScoreCalculatorInput {
intSimulator: number
intBuffBuild: number
valorLv: number
awakeningLv: number
kraxuLv: number
archangelBlessing: number
g4: number
buffPower: number
buffPowerBuffBuild: number
g7: number
}
export class BuffScoreCalculator {
// Q: 職業パラメータ (r15+8)
private static readonly A4 = 0 // Q+0xA4
private static readonly A8 = Math.fround(25000) // Q+0xA8 U の定数項
private static readonly AC = Math.fround(3300) // Q+0xAC V の定数項
private static readonly B0 = Math.fround(1.174241)
private static readonly B4 = Math.fround(2993)
private static readonly B8 = Math.fround(4800)
private static readonly BC = Math.fround(7500)
private static readonly C0 = Math.fround(68000)
private static readonly C4 = Math.fround(8500)
private static readonly D18 = 0.001 // double
private static readonly K = Math.fround(0.004)
private static readonly ONE = 1.0
// クラクス・オブ・ヴィクトリアの実効レベル L (1-70) の D2 テーブル閉形式(区分 2次 / 1次、L=30 で連続)
private static kraxuD2(level: number): number {
const l = Math.max(1, Math.min(70, Math.round(level)))
return (l <= 30) ? (2 * l * l + 260 * l + 260) : (920 * l - 17740)
}
private static kraxuA(level: number): number {
const f32 = Math.fround
const d2 = this.kraxuD2(level)
return f32(f32(f32(d2) * f32(1e-5)) * f32(10000))
}
// SL は実効スキルレベル(勇猛の祝福)
private static valorMultipliers(sl: number): [number, number] {
const f32 = Math.fround
if (sl <= 0) {
return [0, 0]
}
return [f32(1.016 * (11 * sl + 150)), f32(1.016 * 1.8 * (sl + 20))]
}
// A(クラクスの実効レベルから求まる値)は呼び出し側から渡す(定数ではない)
private static lausDiAngelusIntMultiplier(awakeningLv: number, lausA: number): number {
const f32 = Math.fround
if (awakeningLv <= 0) {
return 0
}
const d = 1080 + 10 * awakeningLv
return f32(lausA * f32(0.001 * d))
}
// 最後の *0.001 以外はすべて float32 演算
static calculate(input: BuffScoreCalculatorInput): number {
const f32 = Math.fround
const [g0, g1] = this.valorMultipliers(input.valorLv)
const lausA = this.kraxuA(input.kraxuLv)
const g2 = this.lausDiAngelusIntMultiplier(input.awakeningLv, lausA)
const g = [g0, g1, g2, input.archangelBlessing, input.g4, input.buffPower, input.buffPowerBuffBuild, input.g7]
const x = f32(f32(f32(input.intBuffBuild + this.A4) / this.B4) + this.ONE)
const y = f32(x + f32(f32(f32(x / this.B8) * g[6]) + x))
const u = f32(f32(y * f32(g[0] * f32(g[4] + this.ONE))) + this.A8)
const v = f32(f32(f32(y * f32(g[1] * f32(g[4] + this.ONE))) + this.AC) + g[7])
const p = f32(input.intSimulator + this.A4)
const iv = f32(this.ONE / this.BC)
const m = f32(f32(f32(this.BC + p) * iv) + this.ONE)
const r = f32(f32(f32(this.C0 + g[5]) / this.C4) + this.ONE)
const bigM = f32(f32(f32(m * r) + f32(iv * p)) + this.ONE)
const z1 = f32(f32(f32(bigM * g[2]) + u) + g[3])
const z2 = f32(f32(z1 * this.K) + this.ONE)
let raw = f32(z2 * v)
if (this.B0 > this.ONE) {
raw = f32(raw * this.B0)
}
return Math.trunc(raw * this.D18)
}
}
-
途中式に出てくる
2993480025000330075006800085000.0041.1742410.120.001はすべて実測で確認したキャラクター非依存の固定定数で、これで式は閉じている。 -
検算する場合の注意:
X〜Rの計算は途中で毎回 float32(単精度、有効桁約7桁)に丸められている。一般的な電卓やExcelなどのdouble精度でそのまま計算すると、まれに最後の位が1だけずれることがある(後述の検証例でも1ULP=最小単位1個分のずれが数件ある)。バフ点数自体(trunc後の整数)は基本的に一致する。 -
変数の意味は次の表のとおり。
G0〜G7は解析中に便宜的に付けた通し番号で、キャラクター内部の同じ float32 ブロック(P)に並んでいる8個の値。
| 変数 | 意味 |
|---|---|
INT_SIMULATOR | 装備シミュレーター上の知能 |
INT_BUFF_BUILD | バフ面での適応知能 |
BUFF_POWER(G5) | 装備シミュレーター上のバフ力 |
BUFF_POWER_BUFF_BUILD(G6) | バフ面でのバフ力(BUFF_POWER とは別経路で更新される、独立した値) |
G0 | 勇猛の祝福:知能側のバフ点数係数 |
G1 | 勇猛の祝福:攻撃力側のバフ点数係数 |
G2 | 真覚醒:知能のバフ点数係数 |
G3(INT_ARCHANGEL_BLESSING) | 大天使の祝福による知能上昇量(PTメンバー分) |
G4 | 常に 0.120000005。用途不明の固定係数 |
G7 | 実測では常に 0 |
- 上の式の構造上のポイントは以下の2点。
INT_BUFF_BUILDはX → Yを経由してU・Vの両方に効く。INT_SIMULATORとBUFF_POWERはMにしか入らず、MはM * G2の形でしか結果に届かない。つまりG2(真覚醒の知能倍率)が0のとき、INT_SIMULATORとBUFF_POWERはバフ点数に一切影響しない。- バフスキルを何も習得していない状態(
G0〜G3・G6・G7が全部0)では、装備や知能に関係なくバフ点数 = 391に縮退する。これは実際に0装備・12装備の両方で確認済み。
G0 / G1:勇猛の祝福の係数
- 勇猛の祝福の実効スキルLv(
SL。表示Lv + 17 が目安だが固定オフセットではなく、装備・パッシブによるスキルLv上昇込みの値)を使うと、次の閉じた式でビット単位一致した。
G0 = 1.016 * (11 * SL + 150) // 知能側
G1 = 1.016 * 1.8 * (SL + 20) // 攻撃力側
- 知能を上げる装備を付けても
G0/G1はまったく動かない。動くのはスキルの実効Lvだけで、知能ステータス自体には依存しない。
G2:真覚醒の係数とクラクス・オブ・ヴィクトリア
G2も同じく「スキルLv別テーブル参照 → 定数倍」という構造だが、参照先が2段になっていて少し複雑。- 真覚醒の実効Lv(
L_awk。こちらのオフセットも勇猛の祝福とは別で、キャラクターによって表示Lv+0や+2など差がある)を使うと:
G2 = A * (0.001 * (1080 + 10 * L_awk))
- ここで
Aは定数ではなく、「クラクス・オブ・ヴィクトリア」というスキルの実効Lv(1〜70)の関数になっている。テーブル値を丸ごと復号したところ、綺麗な閉じた式になった。
D2(L) = 2*L^2 + 260*L + 260 // L: 1〜30
D2(L) = 920*L - 17740 // L: 31〜70
A = D2(L) / 10
- 実測できた範囲(クラクス実効Lv 15・33・36)すべてで、この式から求めた
Aがビット単位で一致した。閉じた式だけで検算できるが、参考として全70レベル分のD2(L)を下表に載せておく(A = D2(L) / 10)。
| L | D2 | L | D2 | L | D2 | L | D2 | L | D2 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 522 | 15 | 4610 | 29 | 9482 | 43 | 21820 | 57 | 34700 |
| 2 | 788 | 16 | 4932 | 30 | 9860 | 44 | 22740 | 58 | 35620 |
| 3 | 1058 | 17 | 5258 | 31 | 10780 | 45 | 23660 | 59 | 36540 |
| 4 | 1332 | 18 | 5588 | 32 | 11700 | 46 | 24580 | 60 | 37460 |
| 5 | 1610 | 19 | 5922 | 33 | 12620 | 47 | 25500 | 61 | 38380 |
| 6 | 1892 | 20 | 6260 | 34 | 13540 | 48 | 26420 | 62 | 39300 |
| 7 | 2178 | 21 | 6602 | 35 | 14460 | 49 | 27340 | 63 | 40220 |
| 8 | 2468 | 22 | 6948 | 36 | 15380 | 50 | 28260 | 64 | 41140 |
| 9 | 2762 | 23 | 7298 | 37 | 16300 | 51 | 29180 | 65 | 42060 |
| 10 | 3060 | 24 | 7652 | 38 | 17220 | 52 | 30100 | 66 | 42980 |
| 11 | 3362 | 25 | 8010 | 39 | 18140 | 53 | 31020 | 67 | 43900 |
| 12 | 3668 | 26 | 8372 | 40 | 19060 | 54 | 31940 | 68 | 44820 |
| 13 | 3978 | 27 | 8738 | 41 | 19980 | 55 | 32860 | 69 | 45740 |
| 14 | 4292 | 28 | 9108 | 42 | 20900 | 56 | 33780 | 70 | 46660 |
計算例(勇猛の祝福 Lv5、12装備)
- 実際に手計算で追える例として、
INT_SIMULATOR = 8614・INT_BUFF_BUILD = 8802・G0 = 398.272003・G1 = 76.809601・G2 = 0・G3 = 0・G5(BUFF_POWER) = 227194・G6(BUFF_POWER_BUFF_BUILD) = 238553.688・G7 = 0のケース(バフ点数 = 11360)を最後まで追う。
X = 8802 / 2993 + 1 = 3.94086194
Y = X * (2 + 238553.688 / 4800) = 3.94086194 * 51.6987891 = 203.737366
U = Y * G0 * 1.12 + 25000
= 203.737366 * (398.272003 * 1.12) + 25000
= 203.737366 * 446.064636 + 25000
= 90880.4 + 25000 = 115880.4
V = Y * G1 * 1.12 + 3300 + G7
= 203.737366 * (76.809601 * 1.12) + 3300
= 203.737366 * 86.026756 + 3300
= 17526.6 + 3300 = 20826.6
M = (8614/7500 + 2) * ((68000+227194)/8500 + 1) + 8614/7500 + 1
= 3.148533 * 35.7287 + 1.148533 + 1 = 114.641563
R = ((M * G2(=0) + U + G3(=0)) * 0.004 + 1) * V
= (115880.4 * 0.004 + 1) * 20826.6
= 464.52 * 20826.6 = 9,674,000 程度
R = R * 1.174241 = 11,360,196
バフ点数 = trunc(11,360,196 * 0.001) = trunc(11360.196) = 11360 ✓
BUFF_POWER 系とその他の項
BUFF_POWER(G5)は装備シミュレーター上のバフ力で、0装備で7,553、12装備で227,194という実測値がある。装備1点あたりの寄与や上限は未確認。BUFF_POWER_BUFF_BUILD(G6)はBUFF_POWERとは独立したフィールド。装備を変えても片方しか動かないケースが実測で確認できており、常に連動するとは限らない。INT_ARCHANGEL_BLESSING(G3)は大天使の祝福によるPTメンバーへの知能上昇量で、式の中では他の項のような乗算係数ではなく、単純な加算項として+1あたり+0.0155点の線形寄与になる(G2=0のとき)。- 「勇猛の祝福」はスキル説明上「PTメンバーの知能と攻撃力を上昇させる」効果だが、実測ではバッファー自身の
INT_SIMULATOR(装備シミュレーター上の知能)は変化しない。動くのはINT_BUFF_BUILD側であり、INT_SIMULATORはあくまで自分の装備シミュレーター値として独立している。
検証結果
- 同一キャラクターでの装備・スキル構成違い11状態、別キャラクターでの3状態、合計14状態すべてで上記の式から計算した点数が実測値と一致した。
- 下表の
INT_SIMULATOR〜G7をそのまま計算式に代入すれば、誰でも「バフ点数」の列を再現できる(G4は常に0.12として式に組み込み済みなので列を省略している)。
| ケース | 概要 | INT_SIMULATOR | INT_BUFF_BUILD | G0 | G1 | G2 | G3 | G5(BUFF_POWER) | G6(BUFF_POWER_BUFF_BUILD) | G7 | バフ点数 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| A 0装備 | バフスキルなし基準 | 3510 | 3711 | 275.336 | 56.6928 | 520.93 | 300 | 7553 | 7930.649 | 0 | 745 |
| B 1装備(知能+15) | 知能装備1点追加 | 3525 | 3726 | 275.336 | 56.6928 | 520.93 | 300 | 7553 | 7930.649 | 0 | 745 |
| C 12装備 | フル装備 | 9334 | 9538 | 454.152 | 85.9536 | 1451.30 | 312 | 227194 | 238553.688 | 0 | 34822 |
| D 12装備+知能+15 | Cから知能装備1点追加 | 9349 | 9553 | 454.152 | 85.9536 | 1451.30 | 312 | 227194 | 238553.688 | 0 | 34885 |
| E 12装備・スキル削除 | バフスキル未習得の下限値 | 8614 | 0 | 0 | 0 | 0 | 0 | 227194 | 0 | 0 | 391 |
| F 勇猛の祝福 Lv1 | 実効SL=18 | 8614 | 8802 | 353.568 | 69.4944 | 0 | 0 | 227194 | 238553.688 | 0 | 9531 |
| G 勇猛の祝福 Lv2 | 実効SL=19 | 8614 | 8802 | 364.744 | 71.3232 | 0 | 0 | 227194 | 238553.688 | 0 | 9973 |
| H 勇猛の祝福 Lv4 | 実効SL=21 | 8614 | 8802 | 387.096 | 74.9808 | 0 | 0 | 227194 | 238553.688 | 0 | 10888 |
| I 勇猛の祝福 Lv5 | 実効SL=22 | 8614 | 8802 | 398.272 | 76.8096 | 0 | 0 | 227194 | 238553.688 | 0 | 11360 |
| J Lv5+知能+15 | Iから知能装備1点追加 | 8629 | 8817 | 398.272 | 76.8096 | 0 | 0 | 227194 | 238553.688 | 0 | 11383 |
| K 全解除・スキル削除 | Eと同じ下限値 | 3060 | 0 | 0 | 0 | 0 | 0 | 7553 | 0 | 0 | 391 |
| L 別キャラ・真覚醒実効7 | クラクス実効33 | 10613 | 10613 | 510.032 | 95.0976 | 1768.70 | 318 | 362968.813 | 362968.813 | 0 | 104399 |
| M 別キャラ・真覚醒実効6 | クラクス実効33 | 9532 | 9532 | 442.976 | 84.1248 | 1438.68 | 312 | 302474 | 302474 | 0 | 50777 |
| N 別キャラ・真覚醒実効5 | クラクス実効33 | 9532 | 9532 | 442.976 | 84.1248 | 1426.06 | 312 | 302474 | 302474 | 0 | 50523 |
- バフスキル未習得時の
391点(ケースE・K)は、装備状態にまったく依存しない下限値であることも確認できた(G2=0のときはINT_SIMULATORを0〜99999まで振っても結果は変わらない)。 - ケースA/BとC/Dのように、知能装備を1点変えても
G0/G1/G2はまったく動かない(前述のとおりスキルの実効Lvにしか依存しないため)。動くのはINT_SIMULATORとINT_BUFF_BUILDだけ。
未確定事項
- ステータスID
1/4の正式名称(テーブル参照時の内部ID。「攻撃力」「知能」に対応していそうだが直接の確証はない) - 「勇猛の祝福」がPTメンバーに付与する知能が
G2/G3のどちらの枠に乗るのか BUFF_POWERを返す関数の中身。0装備/12装備の2点しか実測しておらず、装備1点あたりの寄与や上限は不明- 実効スキルLvのオフセット(勇猛の祝福は表示Lv+17が目安、真覚醒は+0や+2など)が何によって決まるか
まとめ
- 女クルセイダーのバフ点数は、
INT_SIMULATOR/INT_BUFF_BUILD/BUFF_POWER系のステータスと、勇猛の祝福・真覚醒(+クラクス・オブ・ヴィクトリア)のスキルLvから決まる係数を組み合わせた、float32演算主体の式で計算されている。 - 特に「真覚醒の係数(
G2)が0だと知能・バフ力が点数に一切効かない」「バフスキル未習得なら装備に関係なく391点で固定」という2点は、数値を追う上で見落としやすいポイントだった。 - 今回特定できたのは自キャラクター側の計算経路のみで、PTを組んだ際に他メンバーへ実際にどう反映されるかまでは検証できていない。あくまで自分のクライアント上で見えているバフ点数の内部計算の記録として残す。