目次

留意点

  • 本記事は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)
  }
}
  • 途中式に出てくる 2993 4800 25000 3300 7500 68000 8500 0.004 1.174241 0.12 0.001 はすべて実測で確認したキャラクター非依存の固定定数で、これで式は閉じている。

  • 検算する場合の注意: XR の計算は途中で毎回 float32(単精度、有効桁約7桁)に丸められている。一般的な電卓やExcelなどのdouble精度でそのまま計算すると、まれに最後の位が1だけずれることがある(後述の検証例でも1ULP=最小単位1個分のずれが数件ある)。バフ点数自体(trunc 後の整数)は基本的に一致する。

  • 変数の意味は次の表のとおり。G0G7 は解析中に便宜的に付けた通し番号で、キャラクター内部の同じ float32 ブロック(P)に並んでいる8個の値。

変数意味
INT_SIMULATOR装備シミュレーター上の知能
INT_BUFF_BUILDバフ面での適応知能
BUFF_POWERG5装備シミュレーター上のバフ力
BUFF_POWER_BUFF_BUILDG6バフ面でのバフ力(BUFF_POWER とは別経路で更新される、独立した値)
G0勇猛の祝福:知能側のバフ点数係数
G1勇猛の祝福:攻撃力側のバフ点数係数
G2真覚醒:知能のバフ点数係数
G3INT_ARCHANGEL_BLESSING大天使の祝福による知能上昇量(PTメンバー分)
G4常に 0.120000005。用途不明の固定係数
G7実測では常に 0
  • 上の式の構造上のポイントは以下の2点。
    • INT_BUFF_BUILDX → Y を経由して UV両方に効く。
    • INT_SIMULATORBUFF_POWERM にしか入らず、MM * G2 の形でしか結果に届かない。つまり G2(真覚醒の知能倍率)が0のとき、INT_SIMULATORBUFF_POWER はバフ点数に一切影響しない
    • バフスキルを何も習得していない状態(G0G3G6G7 が全部0)では、装備や知能に関係なく バフ点数 = 391 に縮退する。これは実際に0装備・12装備の両方で確認済み。

G0 / G1:勇猛の祝福の係数

  • 勇猛の祝福の実効スキルLvSL。表示Lv + 17 が目安だが固定オフセットではなく、装備・パッシブによるスキルLv上昇込みの値)を使うと、次の閉じた式でビット単位一致した。
G0 = 1.016 * (11 * SL + 150)   // 知能側
G1 = 1.016 * 1.8 * (SL + 20)   // 攻撃力側
  • 知能を上げる装備を付けても G0 / G1 はまったく動かない。動くのはスキルの実効Lvだけで、知能ステータス自体には依存しない。

G2:真覚醒の係数とクラクス・オブ・ヴィクトリア

  • G2 も同じく「スキルLv別テーブル参照 → 定数倍」という構造だが、参照先が2段になっていて少し複雑。
  • 真覚醒の実効LvL_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)。
LD2LD2LD2LD2LD2
152215461029948243218205734700
278816493230986044227405835620
31058175258311078045236605936540
41332185588321170046245806037460
51610195922331262047255006138380
61892206260341354048264206239300
72178216602351446049273406340220
82468226948361538050282606441140
92762237298371630051291806542060
103060247652381722052301006642980
113362258010391814053310206743900
123668268372401906054319406844820
133978278738411998055328606945740
144292289108422090056337807046660

計算例(勇猛の祝福 Lv5、12装備)

  • 実際に手計算で追える例として、INT_SIMULATOR = 8614INT_BUFF_BUILD = 8802G0 = 398.272003G1 = 76.809601G2 = 0G3 = 0G5(BUFF_POWER) = 227194G6(BUFF_POWER_BUFF_BUILD) = 238553.688G7 = 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_POWERG5)は装備シミュレーター上のバフ力で、0装備で7,553、12装備で227,194という実測値がある。装備1点あたりの寄与や上限は未確認。
  • BUFF_POWER_BUFF_BUILDG6)は BUFF_POWER とは独立したフィールド。装備を変えても片方しか動かないケースが実測で確認できており、常に連動するとは限らない。
  • INT_ARCHANGEL_BLESSINGG3)は大天使の祝福によるPTメンバーへの知能上昇量で、式の中では他の項のような乗算係数ではなく、単純な加算項として +1あたり+0.0155点の線形寄与になる(G2=0 のとき)。
  • 「勇猛の祝福」はスキル説明上「PTメンバーの知能と攻撃力を上昇させる」効果だが、実測ではバッファー自身の INT_SIMULATOR(装備シミュレーター上の知能)は変化しない。動くのは INT_BUFF_BUILD 側であり、INT_SIMULATOR はあくまで自分の装備シミュレーター値として独立している。

検証結果

  • 同一キャラクターでの装備・スキル構成違い11状態、別キャラクターでの3状態、合計14状態すべてで上記の式から計算した点数が実測値と一致した。
  • 下表の INT_SIMULATORG7 をそのまま計算式に代入すれば、誰でも「バフ点数」の列を再現できる(G4 は常に 0.12 として式に組み込み済みなので列を省略している)。
ケース概要INT_SIMULATORINT_BUFF_BUILDG0G1G2G3G5(BUFF_POWER)G6(BUFF_POWER_BUFF_BUILD)G7バフ点数
A 0装備バフスキルなし基準35103711275.33656.6928520.9330075537930.6490745
B 1装備(知能+15)知能装備1点追加35253726275.33656.6928520.9330075537930.6490745
C 12装備フル装備93349538454.15285.95361451.30312227194238553.688034822
D 12装備+知能+15Cから知能装備1点追加93499553454.15285.95361451.30312227194238553.688034885
E 12装備・スキル削除バフスキル未習得の下限値86140000022719400391
F 勇猛の祝福 Lv1実効SL=1886148802353.56869.494400227194238553.68809531
G 勇猛の祝福 Lv2実効SL=1986148802364.74471.323200227194238553.68809973
H 勇猛の祝福 Lv4実効SL=2186148802387.09674.980800227194238553.688010888
I 勇猛の祝福 Lv5実効SL=2286148802398.27276.809600227194238553.688011360
J Lv5+知能+15Iから知能装備1点追加86298817398.27276.809600227194238553.688011383
K 全解除・スキル削除Eと同じ下限値306000000755300391
L 別キャラ・真覚醒実効7クラクス実効331061310613510.03295.09761768.70318362968.813362968.8130104399
M 別キャラ・真覚醒実効6クラクス実効3395329532442.97684.12481438.68312302474302474050777
N 別キャラ・真覚醒実効5クラクス実効3395329532442.97684.12481426.06312302474302474050523
  • バフスキル未習得時の 391点(ケースE・K)は、装備状態にまったく依存しない下限値であることも確認できた(G2=0 のときは INT_SIMULATOR を0〜99999まで振っても結果は変わらない)。
  • ケースA/BとC/Dのように、知能装備を1点変えても G0/G1/G2 はまったく動かない(前述のとおりスキルの実効Lvにしか依存しないため)。動くのは INT_SIMULATORINT_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を組んだ際に他メンバーへ実際にどう反映されるかまでは検証できていない。あくまで自分のクライアント上で見えているバフ点数の内部計算の記録として残す。