DQ4 (FC) > 確率


乱数

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