4.20. レベルアップ

4.20.1. 構造体 $FFB6C2: レベルアップ
4.20.2. サブルーチン $C441C2: レベルアップ処理
4.20.3. サブルーチン $C440D2: 指定レベルであるための必要経験値を計算する
4.20.4. サブルーチン $C444BC: 仲間キャラクター属性値増量分を計算する
4.20.5. サブルーチン $C44509: 習得コマンドを決定する

本節ではレベルアップについて説明する。 最初にレベルアップの詳細がレベルアップ構造体と呼ばれる型のオブジェクトで決定されるものであることを示し、 それからレベルアップに必要となる経験値や、仲間キャラクターの属性値の変動量、習得コマンド決定処理手順を解説する。 ここで示した型の配列データは CSV として 付録 B データ に収録してある。

4.20.1. 構造体 $FFB6C2: レベルアップ

レベルアップ構造体とは、サイズが #$B1 バイトであり、オブジェクトのメモリレイアウトが次の表で示されるような構造体だ。 この型のオブジェクトがアドレス $FFB6C2 から 27 個直列している。

表 4.88 構造体 $FFB6C2

オフセット 属性
#$00 #$FFFF レベル 2 の必要経験値
#$02 #$00FF
#$03 #$00FF レベル区間上限 0
#$04 #$00FF レベル区間上限 1
#$05 #$00FF レベル区間上限 2
#$06 #$00FF レベル区間上限 3
#$07 #$00FF レベル区間上限 4
#$08 #$00FF レベル区間上限 5
#$09 #$00FF 経験値計算用引数 0
#$0A #$00FF 経験値計算用引数 1
#$0B #$00FF 経験値計算用引数 2
#$0C #$00FF 経験値計算用引数 3
#$0D #$00FF 経験値計算用引数 4
#$0E #$00FF 経験値計算用引数 5
#$0F #$00FF 経験値計算用引数 6
#$10 #$00FF さいだい HP 標準値 0
#$12 #$00FF さいだい HP 標準値 1
#$14 #$00FF さいだい HP 標準値 2
#$16 #$00FF さいだい HP 標準値 3
#$18 #$00FF さいだい HP 標準値 4
#$1A #$00FF さいだい HP 標準値 5
#$1C #$00FF さいだい HP 標準値 6
#$1E #$00FF さいだい HP 標準値 7
#$20 #$00FF さいだい MP 標準値 0
#$22 #$00FF さいだい MP 標準値 1
#$24 #$00FF さいだい MP 標準値 2
#$26 #$00FF さいだい MP 標準値 3
#$28 #$00FF さいだい MP 標準値 4
#$2A #$00FF さいだい MP 標準値 5
#$2C #$00FF さいだい MP 標準値 6
#$2E #$00FF さいだい MP 標準値 7
#$30 #$00FF ちから標準値 0
#$32 #$00FF ちから標準値 1
#$34 #$00FF ちから標準値 2
#$36 #$00FF ちから標準値 3
#$38 #$00FF ちから標準値 4
#$3A #$00FF ちから標準値 5
#$3C #$00FF ちから標準値 6
#$3E #$00FF ちから標準値 7
#$40 #$00FF すばやさ標準値 0
#$42 #$00FF すばやさ標準値 1
#$44 #$00FF すばやさ標準値 2
#$46 #$00FF すばやさ標準値 3
#$48 #$00FF すばやさ標準値 4
#$4A #$00FF すばやさ標準値 5
#$4C #$00FF すばやさ標準値 6
#$4E #$00FF すばやさ標準値 7
#$50 #$00FF かしこさ標準値 0
#$52 #$00FF かしこさ標準値 1
#$54 #$00FF かしこさ標準値 2
#$56 #$00FF かしこさ標準値 3
#$58 #$00FF かしこさ標準値 4
#$5A #$00FF かしこさ標準値 5
#$5C #$00FF かしこさ標準値 6
#$5E #$00FF かしこさ標準値 7
#$60 #$00FF みのまもり標準値 0
#$62 #$00FF みのまもり標準値 1
#$64 #$00FF みのまもり標準値 2
#$66 #$00FF みのまもり標準値 3
#$68 #$00FF みのまもり標準値 4
#$6A #$00FF みのまもり標準値 5
#$6C #$00FF みのまもり標準値 6
#$6E #$00FF みのまもり標準値 7
#$70 #$00FF かっこよさ標準値 0
#$72 #$00FF かっこよさ標準値 1
#$74 #$00FF かっこよさ標準値 2
#$76 #$00FF かっこよさ標準値 3
#$78 #$00FF かっこよさ標準値 4
#$7A #$00FF かっこよさ標準値 5
#$7C #$00FF かっこよさ標準値 6
#$7E #$00FF かっこよさ標準値 7
#$80 #$00FF 習得コマンド 00
#$81 #$00FF 習得コマンド 01
#$82 #$00FF 習得コマンド 02
#$83 #$00FF 習得コマンド 03
#$84 #$00FF 習得コマンド 04
#$85 #$00FF 習得コマンド 05
#$86 #$00FF 習得コマンド 06
#$87 #$00FF 習得コマンド 07
#$88 #$00FF 習得コマンド 08
#$89 #$00FF 習得コマンド 09
#$8A #$00FF 習得コマンド 0A
#$8B #$00FF 習得コマンド 0B
#$8C #$00FF 習得コマンド 0C
#$8D #$00FF 習得コマンド 0D
#$8E #$00FF 習得コマンド 0E
#$8F #$00FF 習得コマンド 0F
#$90 #$00FF 習得コマンド 10
#$91 #$00FF 習得コマンド 11
#$92 #$00FF 習得コマンド 12
#$93 #$00FF 習得コマンド 13
#$94 #$00FF 習得コマンド 14
#$95 #$00FF 習得コマンド 15
#$96 #$00FF 習得コマンド 16
#$97 #$00FF 習得コマンド 17
#$98 #$00FF 習得レベル 00
#$99 #$00FF 習得レベル 01
#$9A #$00FF 習得レベル 02
#$9B #$00FF 習得レベル 03
#$9C #$00FF 習得レベル 04
#$9D #$00FF 習得レベル 05
#$9E #$00FF 習得レベル 06
#$9F #$00FF 習得レベル 07
#$A0 #$00FF 習得レベル 08
#$A1 #$00FF 習得レベル 09
#$A2 #$00FF 習得レベル 0A
#$A3 #$00FF 習得レベル 0B
#$A4 #$00FF 習得レベル 0C
#$A5 #$00FF 習得レベル 0D
#$A6 #$00FF 習得レベル 0E
#$A7 #$00FF 習得レベル 0F
#$A8 #$00FF 習得レベル 10
#$A9 #$00FF 習得レベル 11
#$AA #$00FF 習得レベル 12
#$AB #$00FF 習得レベル 13
#$AC #$00FF 習得レベル 14
#$AD #$00FF 習得レベル 15
#$AE #$00FF 習得レベル 16
#$AF #$00FF 習得レベル 17
#$B0 #$007F レベル上限
#$B0 #$0080 (未使用)

以下に各属性の概要を記す。

レベル 2 の必要経験値

レベル 2 の必要経験値とは、このレベルアップ規則が適用される仲間キャラクターのレベルが 2 であるために必要な経験値を指定する属性だ。 この属性値は、たとえそのキャラクターの最低レベル(仲間になる時点でのレベル)が 2 よりも大きいとしても意味があることに注意を要する。

レベル区間上限 k

まずレベル区間とは何かを説明する。 初項がレベル 1 で末項がレベル上限値の数列を考える。 この数列を最大 7 個の部分区間に分割したものを考え、本節ではそれぞれをレベル区間と呼ぶことにする。 このレベル区間は下限値と上限値とで表現することができるが、隣接するレベル区間の下限値と上限値は一致するので、どちらか一方でレベル区間の代表すれば十分だ。 この属性は、そのようなレベル区間を上限として値に持つものだ。

例えば主人公のレベルアップオブジェクトではレベル区間上限 0 の値は 5 だ。 これは「到達レベルが 2 から 5 までのレベルアップにおいては、 必要経験値が経験値計算用引数 0 属性値で決定される」ことを意味する。

経験値計算用引数 k

経験値計算用引数とは、レベルアップに必要な経験値を計算するためのパラメーターだ。詳しくは後で述べる。

さいだい HP 標準値 k, さいだい MP 標準値 k, ちから標準値 k, すばやさ標準値 k, かしこさ標準値 k, みのまもり標準値 k, かっこよさ標準値 k

これらの各属性値は、このレベルアップ規則が適用される仲間キャラクターのレベルが 1 のとき、 各レベル区間上限属性値のとき、そして上限値のときの対応するキャラクター属性値の標準値を指定する。 それ以外のレベルにおける標準値については、そのレベル値を含む区間両端点の定める標準値から線形補間して得る。

習得コマンド k

習得コマンド k とは、このレベルアップ規則が適用される仲間キャラクターが規定のレベルに達すると習得するコマンドがあって、そのコマンドを指定する値を取る属性だ。 ただし、型はコマンド ID ではなく、コマンドウィンドウ内の項目位置を指示するオブジェクト配列の添字という、馴染みのないものになっている。 このオブジェクトはアドレス $FFC96D にある配列の要素であり、 構造としてはコマンド ID の値、移動コマンドウィンドウでの項目位置、戦闘コマンドウィンドウでの項目位置の三つ組の配列とみなせる。 詳しくは 付録 B データ のデータを参照して欲しい。

この属性値が #$9A であれば、それは空き項目であることを意味する。

習得レベル k

習得レベル k とは、このレベルアップ規則が適用される仲間キャラクターがこのレベルに上がることにより、 もしその時点で未習得ならば、習得コマンド k を習得するということを指定する属性だ。

属性値が 99 であるものは、それは空き項目であることを意味する。

レベル上限

レベル上限とは、このレベルアップ規則が適用される仲間キャラクターが達し得るレベルの上限値を指定する属性だ。 主人公などのメインメンバーは 99 に設定されている。

4.20.2. サブルーチン $C441C2: レベルアップ処理

ここでのレベルアップ処理は次のようなものだ。

  1. 対象の仲間キャラクターに対応するレベルアップオブジェクトを取得する

  2. レベルアップオブジェクトに基づいて、キャラクターの次のレベルが必要とする総経験値を計算する

  3. 現在の経験値と比較し、レベルアップでなければ処理を終了する

  4. キャラクター属性値それぞれの増加量を計算する

  5. 習得コマンドを決定する

  6. 職業補正を行う

このうちの総経験値を計算する処理、属性値の増加量を計算する処理、習得コマンドを決定する処理は後で述べる。

4.20.3. サブルーチン $C440D2: 指定レベルであるための必要経験値を計算する

サブルーチン $C440D2 は次に示す Python 風擬似コードのような処理を実行する:

level_work = 1
if next_level == level_work:
    return 0

level_upper_bound = UPPER_BOUND
if level_upper_bound < next_level:
    return 0xFFFFFFFF

exp_total = EXP_FOR_LEVEL_2
index = 0
exp_prev = 0
while True:
    level_work += 1
    if next_level == level_work:
        return exp_total

    while index < len(LEVEL_BOUNDS):
        if LEVEL_BOUNDS[index] > level_work:
            break
        index += 1

    delta = exp_total - exp_prev
    delta *= EXP_PARAMS[index]
    delta >>= 5
    exp_prev = exp_total
    exp_total += delta

ここで EXP_FOR_LEVEL_2, LEVEL_BOUNDS, EXP_PARAMS, UPPER_BOUND はぞれぞれレベル 2 の必要経験値、レベル区間列、経験値計算用引数列の各属性に対応し、 戻り値がレベル next_level であるために必要な経験値だ。

4.20.4. サブルーチン $C444BC: 仲間キャラクター属性値増量分を計算する

どの属性値についてもサブルーチン $C444BC で増加量を決定する。 基本的には、新レベルを含むレベル区間の両端における属性値標準値の差分に対して、 区間下限と新レベルとの差に対するレベル区間の長さとの割合に応じた値を増加量とする。

4.20.5. サブルーチン $C44509: 習得コマンドを決定する

レベルアップオブジェクトの習得レベル列に対して新レベル値を逐次探索する。 その添字を習得コマンド列に適用すれば、習得コマンドがコマンド表示ウィンドウ位置の値で得られる。 具体的に言えば三つ組オブジェクトの配列 $FFC96D の添字だ。 ただし値が #$9A のものは無効値なので、それが現れた時点で処理を打ち切る。

配列 $FFC96D については 付録 B データ のデータを参照して欲しい。