本節ではレベルアップについて説明する。 最初にレベルアップの詳細がレベルアップ構造体と呼ばれる型のオブジェクトで決定されるものであることを示し、 それからレベルアップに必要となる経験値や、仲間キャラクターの属性値の変動量、習得コマンド決定処理手順を解説する。 ここで示した型の配列データは CSV として 付録 B データ に収録してある。
レベルアップ構造体とは、サイズが #$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 よりも大きいとしても意味があることに注意を要する。
まずレベル区間とは何かを説明する。 初項がレベル 1 で末項がレベル上限値の数列を考える。 この数列を最大 7 個の部分区間に分割したものを考え、本節ではそれぞれをレベル区間と呼ぶことにする。 このレベル区間は下限値と上限値とで表現することができるが、隣接するレベル区間の下限値と上限値は一致するので、どちらか一方でレベル区間の代表すれば十分だ。 この属性は、そのようなレベル区間を上限として値に持つものだ。
例えば主人公のレベルアップオブジェクトではレベル区間上限 0 の値は 5 だ。 これは「到達レベルが 2 から 5 までのレベルアップにおいては、 必要経験値が経験値計算用引数 0 属性値で決定される」ことを意味する。
経験値計算用引数とは、レベルアップに必要な経験値を計算するためのパラメーターだ。詳しくは後で述べる。
これらの各属性値は、このレベルアップ規則が適用される仲間キャラクターのレベルが 1 のとき、 各レベル区間上限属性値のとき、そして上限値のときの対応するキャラクター属性値の標準値を指定する。 それ以外のレベルにおける標準値については、そのレベル値を含む区間両端点の定める標準値から線形補間して得る。
習得コマンド k とは、このレベルアップ規則が適用される仲間キャラクターが規定のレベルに達すると習得するコマンドがあって、そのコマンドを指定する値を取る属性だ。
ただし、型はコマンド ID ではなく、コマンドウィンドウ内の項目位置を指示するオブジェクト配列の添字という、馴染みのないものになっている。
このオブジェクトはアドレス $FFC96D
にある配列の要素であり、
構造としてはコマンド ID の値、移動コマンドウィンドウでの項目位置、戦闘コマンドウィンドウでの項目位置の三つ組の配列とみなせる。
詳しくは 付録 B データ のデータを参照して欲しい。
この属性値が #$9A
であれば、それは空き項目であることを意味する。
習得レベル k とは、このレベルアップ規則が適用される仲間キャラクターがこのレベルに上がることにより、 もしその時点で未習得ならば、習得コマンド k を習得するということを指定する属性だ。
属性値が 99 であるものは、それは空き項目であることを意味する。
レベル上限とは、このレベルアップ規則が適用される仲間キャラクターが達し得るレベルの上限値を指定する属性だ。 主人公などのメインメンバーは 99 に設定されている。
ここでのレベルアップ処理は次のようなものだ。
対象の仲間キャラクターに対応するレベルアップオブジェクトを取得する
レベルアップオブジェクトに基づいて、キャラクターの次のレベルが必要とする総経験値を計算する
現在の経験値と比較し、レベルアップでなければ処理を終了する
キャラクター属性値それぞれの増加量を計算する
習得コマンドを決定する
職業補正を行う
このうちの総経験値を計算する処理、属性値の増加量を計算する処理、習得コマンドを決定する処理は後で述べる。
サブルーチン $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
であるために必要な経験値だ。
どの属性値についてもサブルーチン $C444BC
で増加量を決定する。
基本的には、新レベルを含むレベル区間の両端における属性値標準値の差分に対して、
区間下限と新レベルとの差に対するレベル区間の長さとの割合に応じた値を増加量とする。
レベルアップオブジェクトの習得レベル列に対して新レベル値を逐次探索する。
その添字を習得コマンド列に適用すれば、習得コマンドがコマンド表示ウィンドウ位置の値で得られる。
具体的に言えば三つ組オブジェクトの配列 $FFC96D
の添字だ。
ただし値が #$9A
のものは無効値なので、それが現れた時点で処理を打ち切る。
配列 $FFC96D
については 付録 B データ のデータを参照して欲しい。