4.10. 職業解析

4.10.1. 解析
4.10.1.1. 構造体 $C41C3E - 職業構造体
4.10.2. TODO リスト

職業データの解析を行う。 ここでは、職業データがアドレス $C41C3E に存在することが判明してからの解析作業の解説に絞る。 なお、職業データのアドレスを特定するには、ダーマの神殿でのやりとりを解析していく等すれば、 比較的容易にできる。

4.10.1. 解析

職業構造体へのアクセスは、以下のように行われることが多い。 だから、各メンバをどのように参照しているのかを調べるために、 grep "LDA $C400" して、検索結果周辺のサブルーチンを解析する必要がある。

C4/70FB:    BF0226C4    LDA $C42602,X       // 職業構造体へのポインタ
C4/70FF:    8D1E4A      STA $4A1E
C4/7102:    AA          TAX 
C4/7103:    E220        SEP #$20
C4/7105:    BF6900C4    LDA $C40069,X       // 職業構造体内部

$C42602 はポインタの配列のような感じになっている。 例えば$C41D2Cから、職業構造体せんしのオブジェクトが格納されている。

C4/2601:    C4    // DB
C4/2602:    3E1C  // 00: なし
C4/2604:    B51C  // 01: 本来の自分
C4/2606:    2C1D  // 02: せんし
C4/2608:    A31D  // 03: ぶとうか
C4/260A:    1A1E  // 04: まほうつかい
C4/260C:    911E  // 05: そうりょ
C4/260E:    081F  // 06: おどりこ
C4/2610:    7F1F  // 07: とうぞく
C4/2612:    F61F  // 08: まものつかい
C4/2614:    6D20  // 09: しょうにん
C4/2616:    E420  // 0A: あそびにん
C4/2618:    5B21  // 0B: バトルマスター
C4/261A:    D221  // 0C: まほうせんし
C4/261C:    4922  // 0D: パラディン
C4/261E:    C022  // 0E: けんじゃ
C4/2620:    3723  // 0F: レンジャー
C4/2622:    AE23  // 10: スーパースター
C4/2624:    2524  // 11: ゆうしゃ
C4/2626:    9C24  // 12: ドラゴン
C4/2628:    1325  // 13: はぐれメタル
C4/262A:    8A25  // 14: なし

4.10.1.1. 構造体 $C41C3E - 職業構造体

構造体一個あたりのデータ格納レイアウトを以下に示す。 なお、丸かっこ内の数字は各データが占有するバイト長を示す。

表 4.25 $C41C3E 職業構造体 メモリレイアウト

Byte:Bit 80 40 20 10 08 04 02 01
00 職業名文字列 ID (2)
01
02 オフセット (2)
03
04 マスク (3)
05
06
07 シフトビット (2)
08
09 職業経験値の最大値 (2)
0A
0B 職業経験値 熟練度 2 (2)
0C
0D 職業経験値 熟練度 3 (2)
0E
0F 職業経験値 熟練度 4 (2)
10
11 職業経験値 熟練度 5 (2)
12
13 職業経験値 熟練度 6 (2)
14
15 職業経験値 熟練度 7 (2)
16
17 職業経験値 熟練度 8 (2)
18
19 職業熟練度 1 のランク名文字列 ID (2)
1A
1B 職業熟練度 2 のランク名文字列 ID (2)
1C
1D 職業熟練度 3 のランク名文字列 ID (2)
1E
1F 職業熟練度 4 のランク名文字列 ID (2)
20
21 職業熟練度 5 のランク名文字列 ID (2)
22
23 職業熟練度 6 のランク名文字列 ID (2)
24
25 職業熟練度 7 のランク名文字列 ID (2)
26
27 職業熟練度 8 のランク名文字列 ID (2)
28
29 呪文・特技習得経験値[00] (2)
2A
2B 習得する呪文・特技 表示用[00] ID (1)
2C 呪文・特技習得経験値[01] (2)
2D
2E 習得する呪文・特技 表示用[01] ID (1)
2F 呪文・特技習得経験値[02] (2)
30
31 習得する呪文・特技 表示用[02] ID (1)
32 呪文・特技習得経験値[03] (2)
33
34 習得する呪文・特技 表示用[03] ID (1)
35 呪文・特技習得経験値[04] (2)
36
37 習得する呪文・特技 表示用[04] ID (1)
38 呪文・特技習得経験値[05] (2)
39
3A 習得する呪文・特技 表示用[05] ID (1)
3B 呪文・特技習得経験値[06] (2)
3C
3D 習得する呪文・特技 表示用[06] ID (1)
3E 呪文・特技習得経験値[07] (2)
3F
40 習得する呪文・特技 表示用[07] ID (1)
41 呪文・特技習得経験値[08] (2)
42
43 習得する呪文・特技 表示用[08] ID (1)
44 呪文・特技習得経験値[09] (2)
45
46 習得する呪文・特技 表示用[09] ID (1)
47 呪文・特技習得経験値[0A] (2)
48
49 習得する呪文・特技 表示用[0A] ID (1)
4A 呪文・特技習得経験値[0B] (2)
4B
4C 習得する呪文・特技 表示用[0B] ID (1)
4D 呪文・特技習得経験値[0C] (2)
4E
4F 習得する呪文・特技 表示用[0C] ID (1)
50 呪文・特技習得経験値[0D] (2)
51
52 習得する呪文・特技 表示用[0D] ID (1)
53 呪文・特技習得経験値[0E] (2)
54
55 習得する呪文・特技 表示用[0E] ID (1)
56 呪文・特技習得経験値[0F] (2)
57
58 習得する呪文・特技 表示用[0F] ID (1)
59 職業レベル最大時のさいだいHP加算ポイント (2)
5A
5B 職業レベル最大時のさいだいMP加算ポイント (2)
5C
5D 職業レベル最大時のちから加算ポイント (2)
5E
5F 職業レベル最大時のすばやさ加算ポイント (2)
60
61 職業レベル最大時のかしこさ加算ポイント (2)
62
63 職業レベル最大時のみのまもり加算ポイント (2)
64
65 職業レベル最大時のかっこよさ加算ポイント (2)
66
67 ちから倍率 (1)
68 未使用 (1)
69 すばやさ倍率 (1)
6A 未使用 (1)
6B みのまもり倍率 (1)
6C 未使用 (1)
6D かしこさ倍率 (1)
6E 未使用 (1)
6F かっこよさ倍率 (1)
70 未使用 (1)
71 さいだいHP倍率 (1)
72 未使用 (1)
73 さいだいMP倍率 (1)
74 未使用 (1)
75 (Unknown) (1)
76

各メンバの意味は以下の通りである。

職業名文字列 ID

職業名を表す文字列(本来の自分、せんし、ぶとうか、etc.)の ID である。

オフセット

その職業の職業経験値が、キャラクターの職業経験値データ格納アドレスの 先頭から何バイト目(の途中)から始まるのかを意味する値である。

マスク

キャラクターの職業経験値を、上記オフセット位置から取得するときに 使うマスク値である。

シフトビット

その職業の職業経験値が、キャラクターの職業経験値データ格納アドレスの オフセットバイト目の何ビット目から始まるのかを意味する値である。

職業経験値の最大値

その職業でいるときの職業経験値の上限。 職業経験値熟練度 8 の値に等しくなるように設定されている。

職業経験値 熟練度 N (N = 2..8)

職業経験値に対応する熟練度を計算するための数列である。

職業熟練度 N のランク名文字列 ID (N = 1..8)

職業熟練度に対応するランク名称(しゅぎょうちゅう、しんかん、しさい、etc.) を表す文字列の ID である。

習得する呪文・特技 表示用 ID

キャラクターの職業経験値がこのバイトの直後にある 1 バイト以上であるとき、 習得しているはずの呪文・特技のウィンドウ表示用 ID である。 構造体 $FFC96D 配列の ID である。

呪文・特技習得経験値

このバイトの直前 2 バイトにある呪文・特技を習得するのに必要な職業経験値である。 職業経験値が上がるときに、新たな呪文・特技を習得するかを判定するルーチンがあるのだが、 このルーチンは、この習得経験値バイトに #$9A が格納されていることを検知すると、 判定を中断する。

職業レベル最大時のさいだいHP加算ポイント

職業熟練度が最大のときに、 キャラクターのさいだいHP補正サブルーチンがこの値を加算のために用いる。

職業レベル最大時のさいだいMP加算ポイント

職業熟練度が最大のときに、 キャラクターのさいだいMP補正サブルーチンがこの値を加算のために用いる。

職業レベル最大時のちから加算ポイント

職業熟練度が最大のときに、 キャラクターのちから補正サブルーチンがこの値を加算のために用いる。

職業レベル最大時のすばやさ加算ポイント

職業熟練度が最大のときに、 キャラクターのすばやさ補正サブルーチンがこの値を加算のために用いる。

職業レベル最大時のかしこさ加算ポイント

職業熟練度が最大のときに、 キャラクターのかしこさ補正サブルーチンがこの値を加算のために用いる。

職業レベル最大時のみのまもり加算ポイント

職業熟練度が最大のときに、 キャラクターのみのまもり補正サブルーチンがこの値を加算のために用いる。

職業レベル最大時のかっこよさ加算ポイント

職業熟練度が最大のときに、 キャラクターのかっこよさ補正サブルーチンがこの値を加算のために用いる。

ちから倍率

キャラクターのちから補正サブルーチンが用いる値である。 そのキャラクターの通常のちからに乗ずる値 * 128 である。 ただし、このバイトに #$FF が格納されているときは * 2.0 とみなす。

すばやさ倍率

キャラクターのすばやさ補正サブルーチンが用いる値である。 値の使い方はちから倍率と同様である。

みのまもり倍率

キャラクターのみのまもり補正サブルーチンが用いる値である。 値の使い方はちから倍率と同様である。

かしこさ倍率

キャラクターのかしこさ補正サブルーチンが用いる値である。 値の使い方はちから倍率と同様である。

かっこよさ倍率

キャラクターのかっこよさ補正サブルーチンが用いる値である。 値の使い方はちから倍率と同様である。

さいだいHP倍率

キャラクターのさいだいHP補正サブルーチンが用いる値である。 値の使い方はちから倍率と同様である。

さいだいMP倍率

キャラクターのさいだいMP補正サブルーチンが用いる値である。 値の使い方はちから倍率と同様である。

習得する呪文・特技 ID は表示用 ID を保持する構造体 $FFC96D のそれである。 この構造体については、ソニタウンの解析資料 [URL2] に記述がある

別の項で改めて解説する予定だが、上に述べた、ちから、 すばやさ等の各パラメータの補正は以下の順に行われる。

  1. キャラクターの素のパラメータポイントを取得(構造体 $7E4025 配列)

  2. 職業に就いていれば、職業に応じたポイントに倍率を適用する

  3. 職業熟練度が最大であれば、ポイントを加算する

  4. キャラクターの装備品を考慮する

  5. ここまでの補正結果がゼロだったら 1 にする

  6. ここまでの補正結果がそのパラメータポイントの上限値を超えていたら、上限に丸める

4.10.2. TODO リスト

  • 職業構造体 [75, 77) の意味特定