乱数
FC 版 DQ4 の 8 bit 乱数生成器は、16 bit 乱数生成器と 8 bit 乱数生成器(乱数生成回数)を組み合わせたものとなっており、以下のコード中の next() の処理と等価です。
参考: FC 版 DQ3、SFC 版 DQ5 も同一の 8 bit 乱数生成器を用いています。
struct DQ4FCRng {
DQ4FCRng(uint16_t x=0, uint8_t c=0) : x(x), c(c) {}
uint8_t next() {
uint32_t t = x ^ 0xffff;
for (int i = 0; i < 16; ++i) {
t <<= 1;
if (t & 0x10000) t ^= 0x11021;
}
x = t;
c += 1;
return (x + c) & 0xff;
}
uint16_t x;
uint8_t c;
};
(別箇所での乱数更新処理を考慮しない場合の)周期は以下となっており、いずれの状態でも乱数値 0〜255 は均等の頻度で出現します:
- x が (0x5FEA または 0xAFF5) ではない場合: 8388608
- x が 0x5FEA または 0xAFF5 の場合: 256
DQ4 では CPU がフレーム経過待ち状態となっている間は以下の処理が行われているため、乱数周期が極端に短い状態(x が 0x5FEA または 0xAFF5 の状態)を保ち続けることはありません。
;---------------------------------
; フレーム経過待ち状態での乱数更新処理
;---------------------------------
FF74 [3FF74] AD 0C 05 LDA $050C ; フレームカウンタ
FF77 [3FF77] EA NOP
FF78 [3FF78] EA NOP
FF79 [3FF79] E6 12 INC $12 ; (x の下位 8 bit) += 1 (繰り上がりは考慮しない)
FF7B [3FF7B] CD 0C 05 CMP $050C
FF7E [3FF7E] F0 F7 BEQ $FF77 ; 1 フレーム経過するまで更新し続ける
...
多くの場合、乱数 0〜(n-1) は (生成された 8 bit 乱数)×n/256 によって取得されます。
ソース
+
|
... |
;---------------------------------
; 8 bit 乱数取得処理
;---------------------------------
C891 [3C891] 98 TYA
C892 [3C892] 48 PHA
C893 [3C893] A9 FF LDA #$FF
C895 [3C895] 85 16 STA $16
C897 [3C897] 20 AD C8 JSR $C8AD
C89A [3C89A] A9 FF LDA #$FF
C89C [3C89C] 85 16 STA $16
C89E [3C89E] 20 AD C8 JSR $C8AD
C8A1 [3C8A1] EE 0D 05 INC $050D
C8A4 [3C8A4] 68 PLA
C8A5 [3C8A5] A8 TAY
C8A6 [3C8A6] A5 12 LDA $12 ; x 下位 8 bit
C8A8 [3C8A8] 18 CLC
C8A9 [3C8A9] 6D 0D 05 ADC $050D ; c
C8AC [3C8AC] 60 RTS
;---------------------------------
; F_2 係数 多項式剰余処理
;---------------------------------
C8AD [3C8AD] A0 08 LDY #$08
C8AF [3C8AF] A5 13 LDA $13
C8B1 [3C8B1] 45 16 EOR $16
C8B3 [3C8B3] 06 12 ASL $12
C8B5 [3C8B5] 26 13 ROL $13
C8B7 [3C8B7] 06 16 ASL $16
C8B9 [3C8B9] 0A ASL A
C8BA [3C8BA] 90 0C BCC $C8C8
C8BC [3C8BC] A5 12 LDA $12
C8BE [3C8BE] 49 21 EOR #$21
C8C0 [3C8C0] 85 12 STA $12
C8C2 [3C8C2] A5 13 LDA $13
C8C4 [3C8C4] 49 10 EOR #$10
C8C6 [3C8C6] 85 13 STA $13
C8C8 [3C8C8] 88 DEY
C8C9 [3C8C9] D0 E4 BNE $C8AF
C8CB [3C8CB] 60 RTS
|
呪文命中率
モンスター側 対象の場合
行動 |
耐性なし(×) |
弱耐性(△) |
強耐性(○) |
完全耐性(◎) |
ラリホーマ・ルカニ |
100.0 % (256/256) |
100.0 % (256/256) |
69.9 % (179/256) |
0.0 % (0/256) |
その他 |
100.0 % (256/256) |
84.8 % (217/256) |
40.2 % (103/256) |
0.0 % (0/256) |
ラリホーマ・ルカニ (ちからため後) |
100.0 % (256/256) |
100.0 % (256/256) |
100.0 % (256/256) |
0.0 % (0/256) |
その他 (ちからため後) |
100.0 % (256/256) |
100.0 % (256/256) |
80.1 % (205/256) |
0.0 % (0/256) |
味方側 対象の場合
行動 ID |
行動名 |
命中率(通常時) |
命中率(ちからため後) |
19 |
ザキ |
37.9 % (97/256) |
75.4 % (193/256) |
20 |
ザラキ |
37.9 % (97/256) |
75.4 % (193/256) |
23 |
ラリホー |
37.9 % (97/256) |
75.4 % (193/256) |
24 |
ラリホーマ |
75.4 % (193/256) |
100.0 % (256/256) |
25 |
マホトーン |
37.9 % (97/256) |
75.4 % (193/256) |
26 |
マヌーサ |
62.9 % (161/256) |
100.0 % (256/256) |
27 |
メダパニ |
25.4 % (65/256) |
50.4 % (129/256) |
31 |
ルカニ |
75.4 % (193/256) |
100.0 % (256/256) |
32 |
ルカナン |
75.4 % (193/256) |
100.0 % (256/256) |
83 |
あまいいき |
37.9 % (97/256) |
75.4 % (193/256) |
84 |
どくのいき |
37.9 % (97/256) |
75.4 % (193/256) |
85 |
やけつくいき |
12.9 % (33/256) |
25.4 % (65/256) |
86 |
おたけび |
37.9 % (97/256) |
75.4 % (193/256) |
115 |
まどろみのけん (敵 使用) |
37.9 % (97/256) |
75.4 % (193/256) |
補足:
- 「てんくうのよろい」を装備している場合、即死・混乱 を確率 128/256 で回避します。
- 「きんのかみかざり」を装備している場合、混乱 を確率 85/256 で回避します。(「てんくうのよろい」の効果とは重複せず、「てんくうのよろい」による回避処理が優先されます)
ソース
+
|
... |
;------------------------------------
; 命中判定
;------------------------------------
B718 [4F718] 20 6B B6 JSR $B66B ; A ← (命中値)
B71B [4F71B] 85 00 STA $00
B71D [4F71D] A5 00 LDA $00
B71F [4F71F] F0 09 BEQ $B72A ; 命中値が 0 の場合は命中しない
B721 [4F721] 00 1B 0F BRK ; A ← 乱数 0〜255
B724 [4F724] C5 00 CMP $00
B726 [4F726] F0 04 BEQ $B72C
B728 [4F728] 90 02 BCC $B72C
B72A [4F72A] 18 CLC
B72B [4F72B] 60 RTS
B72C [4F72C] 38 SEC ; (乱数値) <= (命中値) の場合
B72D [4F72D] 60 RTS
;------------------------------------
; 命中値 取得
;------------------------------------
B66B [4F66B] AD E7 72 LDA $72E7
B66E [4F66E] 29 02 AND #$02
B670 [4F670] AD E9 72 LDA $72E9
B673 [4F673] 30 05 BMI $B67A
B675 [4F675] 00 0E 1F BRK
B678 [4F678] 30 4F BMI $B6C9
B67A [4F67A] 00 03 1F BRK
B67D [4F67D] AA TAX ; 行動 ID
B67E [4F67E] AD 63 73 LDA $7363 ; 対象
B681 [4F681] 30 10 BMI $B693 ; 対象がモンスターの場合
; 味方側 対象
B683 [4F683] BD 0B B8 LDA $B80B,X
B686 [4F686] 29 E0 AND #$E0
B688 [4F688] C9 E0 CMP #$E0
B68A [4F68A] F0 3D BEQ $B6C9
B68C [4F68C] 20 CB B6 JSR $B6CB
B68F [4F68F] 20 DD B6 JSR $B6DD ; (何もしない)
B692 [4F692] 60 RTS
;
; モンスター 対象
;
B693 [4F693] BD 0B B8 LDA $B80B,X
B696 [4F696] 29 1F AND #$1F
B698 [4F698] AA TAX
B699 [4F699] BD 36 B7 LDA $B736,X
B69C [4F69C] E0 10 CPX #$10
B69E [4F69E] B0 2B BCS $B6CB
B6A0 [4F6A0] 48 PHA
B6A1 [4F6A1] AD 63 73 LDA $7363
B6A4 [4F6A4] 29 07 AND #$07
B6A6 [4F6A6] AA TAX
B6A7 [4F6A7] 68 PLA
B6A8 [4F6A8] 00 22 B3 BRK ; A ← 耐性値(0〜3)
B6AB [4F6AB] 48 PHA
B6AC [4F6AC] 00 03 1F BRK ; A ← 行動 ID
B6AF [4F6AF] A2 00 LDX #$00
B6B1 [4F6B1] C9 18 CMP #$18 ; 0x18: ラリホーマ
B6B3 [4F6B3] F0 04 BEQ $B6B9
B6B5 [4F6B5] C9 1F CMP #$1F ; 0x1f: ルカニ
B6B7 [4F6B7] D0 02 BNE $B6BB
B6B9 [4F6B9] A2 04 LDX #$04
B6BB [4F6BB] 86 00 STX $00
B6BD [4F6BD] 68 PLA
B6BE [4F6BE] 18 CLC
B6BF [4F6BF] 65 00 ADC $00
B6C1 [4F6C1] AA TAX
B6C2 [4F6C2] BD 03 B8 LDA $B803,X
B6C5 [4F6C5] 20 CB B6 JSR $B6CB
B6C8 [4F6C8] 60 RTS
B6C9 [4F6C9] A9 FF LDA #$FF
B6CB [4F6CB] 85 00 STA $00 ; $00 ← (命中値)
B6CD [4F6CD] 00 0D 1F BRK ; ちからため状態の場合は C = 1 となる (?)
B6D0 [4F6D0] 90 08 BCC $B6DA
B6D2 [4F6D2] 06 00 ASL $00 ; 命中値 2 倍
B6D4 [4F6D4] 90 04 BCC $B6DA
B6D6 [4F6D6] A9 FF LDA #$FF
B6D8 [4F6D8] 85 00 STA $00
B6DA [4F6DA] A5 00 LDA $00
B6DC [4F6DC] 60 RTS
B803 [4F803] FF D8 66 00 FF FF B2 00
B80B [4F80B] E2 E2 E2 E1 E1 E1 E0 E0 E0 E5 E5 E5 E5 E4 E4 E4
E3 E3 E3 68 68 EE E9 67 C7 6B A6 4C EA F2 F2 CD
CD F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 72 E1 E1 E1
E5 E5 E5 67 72 31 67 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 67 E1 F2 F2 EB 67 F2 67 F2 F2 F2 F2 F2
F2 F2 F2 E1 E4 67 E1 E5 6B E0 ED F2 F2 67 E1 F2
28 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 E9 EB F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 66 F2 EC F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2 F2
F2 F2 F2 F2 F2 F2 F2 F2 92 09 F2 F2 F2 E6 F2 F2
;------------------------------------
; 即死攻撃(少なくともザキ・ザラキは該当する)
;------------------------------------
9AFC [45AFC] 00 07 1F BRK
9AFF [45AFF] 90 18 BCC $9B19
9B01 [45B01] 8A TXA
9B02 [45B02] 48 PHA
9B03 [45B03] 20 CC BE JSR $BECC
9B06 [45B06] 9E DB $9E
9B07 [45B07] 68 PLA
9B08 [45B08] AA TAX
9B09 [45B09] 20 E3 91 JSR $91E3
9B0C [45B0C] 00 1A 2F BRK
9B0F [45B0F] B0 07 BCS $9B18
9B11 [45B11] 00 E6 D3 01 BRK
9B15 [45B15] 00 23 2F BRK
9B18 [45B18] 60 RTS
;
9B19 [45B19] 50 53 BVC $9B6E
9B1B [45B1B] 00 3B 93 01 BRK
9B1F [45B1F] 90 0B BCC $9B2C ; 鎧を装備していない場合
9B21 [45B21] C9 B7 CMP #$B7
9B23 [45B23] D0 07 BNE $9B2C ; 「てんくうのよろい」を装備していない場合
9B25 [45B25] 00 1B 0F BRK ; A ← 乱数 0〜255
9B28 [45B28] C9 80 CMP #$80
9B2A [45B2A] 90 0F BCC $9B3B
9B2C [45B2C] 20 62 92 JSR $9262
9B2F [45B2F] 20 CC BE JSR $BECC
9B32 [45B32] 9E DB $9E
9B33 [45B33] 00 E6 D3 02 BRK
9B37 [45B37] 00 23 2F BRK
9B3A [45B3A] 60 RTS
; 効かなかった場合
9B3B [45B3B] 00 E6 D3 03 BRK
9B3F [45B3F] 00 23 2F BRK
9B42 [45B42] 60 RTS
;------------------------------------
; 混乱攻撃(少なくともメダパニは該当する)
;------------------------------------
9CC1 [45CC1] 00 07 1F BRK
9CC4 [45CC4] B0 21 BCS $9CE7
9CC6 [45CC6] A0 80 LDY #$80
9CC8 [45CC8] 00 3B 93 01 BRK
9CCC [45CCC] 90 04 BCC $9CD2 ; 鎧を装備していない場合
9CCE [45CCE] C9 B7 CMP #$B7
9CD0 [45CD0] F0 0C BEQ $9CDE ; 「てんくうのよろい」を装備している場合
9CD2 [45CD2] 00 3B 93 03 BRK
9CD6 [45CD6] 90 0F BCC $9CE7 ; 兜を装備していない場合
9CD8 [45CD8] C9 CD CMP #$CD
9CDA [45CDA] D0 0B BNE $9CE7
9CDC [45CDC] A0 55 LDY #$55 ; 「きんのかみかざり」を装備している場合
9CDE [45CDE] 84 00 STY $00
9CE0 [45CE0] 00 1B 0F BRK ; A ← 乱数 0〜255
9CE3 [45CE3] C5 00 CMP $00
9CE5 [45CE5] 90 07 BCC $9CEE
9CE7 [45CE7] A9 12 LDA #$12
9CE9 [45CE9] A2 02 LDX #$02
9CEB [45CEB] 4C 3F 9D JMP $9D3F
; 効かなかった場合
9CEE [45CEE] 00 E6 D3 03 BRK
9CF2 [45CF2] 60 RTS
|
武器の特殊効果発動率
種類 |
確率 |
どくばりの即死効果 |
12.5 % (32/256) |
まじんのかなづちの会心効果 |
33.6 % (86/256) |
まどろみのけんの睡眠効果 |
37.5 % (96/256) |
まふうじのつえの MP 吸収効果 |
12.5 % (32/256) |
どくがのナイフの麻痺効果 |
12.5 % (32/256) |
ソース
+
|
... |
;
; どくばりの追加効果
;
A6A5 [466A5] 00 1B 0F BRK ; A ← 乱数 0〜255
A6A8 [466A8] 29 07 AND #$07
A6AA [466AA] D0 1C BNE $A6C8
;
; まじんのかなづち
;
A6F2 [466F2] 00 1B 0F BRK ; A ← 乱数 0〜255
A6F5 [466F5] C9 AA CMP #$AA
A6F7 [466F7] B0 0B BCS $A704
;
; まどろみのけんの追加効果
;
A807 [46807] A9 60 LDA #$60 ; 96/256
A809 [46809] 20 5D 99 JSR $995D
A80C [4680C] 90 D1 BCC $A7DF
;
; まふうじのつえの追加効果
;
A819 [46819] A9 20 LDA #$20 ; 32/256
A81B [4681B] 20 5D 99 JSR $995D
A81E [4681E] 90 BF BCC $A7DF
;
; どくがのナイフの追加効果
;
A82B [4682B] A9 20 LDA #$20 ; 32/256
A82D [4682D] 20 5D 99 JSR $995D
A830 [46830] 90 AD BCC $A7DF
;
; 確率 判定部分
;
995D [4595D] 85 00 STA $00
995F [4595F] AD E7 72 LDA $72E7 ; (bit 0) 1: 倒した場合(※ 倒した場合は、そもそもこの処理が実行されない?)
9962 [45962] 4A LSR A
9963 [45963] B0 09 BCS $996E ;
9965 [45965] 00 1B 0F BRK ; A ← 乱数 0〜255
9968 [45968] C5 00 CMP $00
996A [4596A] B0 02 BCS $996E
996C [4596C] 38 SEC
996D [4596D] 60 RTS
996E [4596E] 18 CLC
996F [4596F] 60 RTS
|
先制攻撃・不意打ち
確率設定 |
先制攻撃の確率 |
不意打ちの確率 |
0 |
7/256 |
8/256 |
1 |
7/256 |
31/256 |
2 |
31/256 |
7/256 |
3 |
31/256 |
31/256 |
ソース
+
|
... |
A20E [6220E] A5 0B LDA $0B
A210 [62210] 29 03 AND #$03 ; 確率設定
A212 [62212] 0A ASL A
A213 [62213] 85 04 STA $04
A215 [62215] A6 04 LDX $04
A217 [62217] CA DEX
A218 [62218] A0 FF LDY #$FF
A21A [6221A] A9 21 LDA #$21
A21C [6221C] 00 17 0F BRK ; A ← 乱数 0〜32
A21F [6221F] C8 INY
A220 [62220] C0 02 CPY #$02
A222 [62222] F0 08 BEQ $A22C
A224 [62224] E8 INX
A225 [62225] DD 5C A4 CMP $A45C,X
A228 [62228] F0 02 BEQ $A22C
A22A [6222A] B0 F3 BCS $A21F
; (乱数値) <= (境界値) の場合
A22C [6222C] 98 TYA
A22D [6222D] 8D 44 6E STA $6E44 ; 1: 不意打ち, 2: 先制攻撃
A230 [62230] 60 RTS
A45C [6245C] 1E 1F
1B 1F
1B 1C
18 1C
|
第三章でのアイテムドロップ
第三章では、モンスターの通常のアイテムドロップ処理は行われず、第三章固有のアイテムドロップ処理を行います。手順は次のようになっています:
1. 0〜15 の範囲の乱数値を取得し初期番号とする。
2. 以下で示した表について、初期番号から連番で 16 回アイテム入手処理を行う(途中で番号が 16 になった場合、0 に戻る)。途中で何らかのアイテムを入手できた場合、その時点で判定は打ち切る。
例: 初期番号が 9 であった場合、9, 10, ..., 15, 0, ..., 8 の順でアイテム入手判定を行います。
番号 |
アイテム名 |
入手確率 |
0 |
こんぼう |
16/256 |
1 |
どうのつるぎ |
4/256 |
2 |
くさりがま |
2/256 |
3 |
てつのやり |
2/256 |
4 |
はがねのつるぎ |
(トルネコのLv)/256 |
5 |
たびびとのふく |
4/256 |
6 |
かわのよろい |
4/256 |
7 |
くさりかたびら |
2/256 |
8 |
てつのよろい |
(トルネコのLv)/256 |
9 |
かわのたて |
4/256 |
10 |
うろこのたて |
4/256 |
11 |
かわのぼうし |
4/256 |
12 |
きのぼうし |
4/256 |
13 |
やくそう |
4/256 |
14 |
どくけしそう |
2/256 |
15 |
キメラのつばさ |
4/256 |
ソース
+
|
... |
;-----------------------------------
; アイテムドロップ処理
;-----------------------------------
91DE [491DE] AD 5A 61 LDA $615A
91E1 [491E1] C9 02 CMP #$02
91E3 [491E3] D0 32 BNE $9217 ; 第三章ではない
91E5 [491E5] A9 10 LDA #$10
91E7 [491E7] 00 17 0F BRK ; A ← 乱数 0〜15
91EA [491EA] AA TAX
91EB [491EB] A0 10 LDY #$10
91ED [491ED] BD 8E 92 LDA $928E,X
91F0 [491F0] D0 0A BNE $91FC ; 境界値が 1 以上の場合
91F2 [491F2] A9 05 LDA #$05
91F4 [491F4] 00 63 73 BRK
91F7 [491F7] 85 6E STA $6E ; トルネコのパーティ内での位置
91F9 [491F9] 00 0F 33 BRK
91FC [491FC] 85 01 STA $01 ; $01 ← 境界値 or (トルネコの Lv)
91FE [491FE] 20 91 C8 JSR $C891 ; A ← 乱数 0〜255
9201 [49201] C5 01 CMP $01
9203 [49203] B0 07 BCS $920C
9205 [49205] BD 9E 92 LDA $929E,X
9208 [49208] 85 C4 STA $C4
920A [4920A] D0 3A BNE $9246
920C [4920C] E8 INX
920D [4920D] E0 10 CPX #$10
920F [4920F] 90 02 BCC $9213
9211 [49211] A2 00 LDX #$00
9213 [49213] 88 DEY
9214 [49214] D0 D7 BNE $91ED
9216 [49216] 60 RTS
;-----------------------------------
; 通常のアイテムドロップ処理
;-----------------------------------
9217 ...
928E [4928E] 10 04 02 02 00 04 04 02 00 04 04 04 04 04 02 04
929E [4929E] 01 02 04 05 06 25 26 27 28 3D 3E 46 47 53 54 56
|
最終更新:2024年05月26日 12:51