トルネコの大冒険3 (PS2) > 確率


乱数

32-bit 疑似乱数生成器を用いており、その状態 x は次の式で更新されます: x ← (x × 0x5d588b65 + 1) mod 2^{32}

乱数 0〜(n-1) は (x / 2^{16}) mod n によって取得されます。

ソース

+ ...
;--------------------------------
; 乱数 0〜(a0-1) を返す
;--------------------------------
2728f8: f0ffbd27  addiu sp,sp,-16
2728fc: 0000b0ff  sd  s0,0(sp)
272900: 2d808000  move  s0,a0
272904: 0800bfff  sd  ra,8(sp)
272908: 27ca090c  jal 0x27289c
27290c: 2d20a000  move  a0,a1
 
272910: 2d184000  move  v1,v0
272914: 05000012  beqz  s0,0x27292c
272918: 2d100000  move  v0,zero
 
27291c: 1a007000  div zero,v1,s0
272920: 01000052  beqzl s0,0x272928
272924: cd010000  break 0x0,0x7
 
272928: 10100000  mfhi  v0
27292c: 0000b0df  ld  s0,0(sp)
272930: 0800bfdf  ld  ra,8(sp)
272934: 0800e003  jr  ra
272938: 1000bd27  addiu sp,sp,16
 
;--------------------------------
; v0 ← 乱数値 0〜65535
;--------------------------------
27289c: b0a3858f  lw  a1,-23632(gp)
2728a0: 585d023c  lui v0,0x5d58
2728a4: 658b4234  ori v0,v0,0x8b65
2728a8: b4a3838f  lw  v1,-23628(gp)
2728ac: 1828a200  mult  a1,a1,v0
2728b0: 2d408000  move  t0,a0
2728b4: 01006324  addiu v1,v1,1
2728b8: d0076428  slti  a0,v1,2000
2728bc: c0380300  sll a3,v1,0x3
2728c0: b4a383af  sw  v1,-23628(gp)
2728c4: 0100a524  addiu a1,a1,1
2728c8: 02340500  srl a2,a1,0x10
2728cc: b0a385af  sw  a1,-23632(gp)
2728d0: 07008010  beqz  a0,0x2728f0
2728d4: 2d10c000  move  v0,a2
 
2728d8: 6b00033c  lui v1,0x6b
2728dc: 18d36324  addiu v1,v1,-11496
2728e0: 21206700  addu  a0,v1,a3
2728e4: 2118e300  addu  v1,a3,v1
2728e8: 000066ac  sw  a2,0(v1)
2728ec: 040088ac  sw  t0,4(a0)
 
2728f0: 0800e003  jr  ra
2728f4: 00000000  nop
 

モンスターが仲間になる確率

境界値 T を T := (ポポロの LV) + (武器補正値) + (モンスター補正値) として、(乱数 0〜998) < T を満たした場合にモンスターは仲間になります。つまり、モンスターが仲間になる確率は以下の表のようになります。

境界値 T の範囲 確率
T ≤ 0 0
0 < T ≤ 601 (66×T)/65536
601 < T < 999 (65536-65×(999-T))/65536
999 ≤ T 1

ソース

+ ...
;--------------------------------
; ポポロ勧誘率
;--------------------------------
...
20e404: 0b006012  beqz  s3,0x20e434 ; 素手の場合 は飛ばす
20e408: 2d800000  move  s0,zero     ; s0 ← 0
 
20e40c: 38006286  lh  v0,56(s3)
20e410: 02004014  bnez  v0,0x20e41c
20e414: 2d184000  move  v1,v0
 
20e418: 0c006386  lh  v1,12(s3)     ; 装備アイテム ID
20e41c: 40100300  sll v0,v1,0x1
20e420: 21104300  addu  v0,v0,v1
20e424: 80100200  sll v0,v0,0x2
20e428: 8f00103c  lui s0,0x8f
20e42c: 21800202  addu  s0,s0,v0
20e430: b4371086  lh  s0,14260(s0)  ; s0 ← 装備 勧誘率補正
 
20e434: 0800228e  lw  v0,8(s1)
20e438: 2d204002  move  a0,s2
20e43c: 2d280000  move  a1,zero
20e440: 04004284  lh  v0,4(v0)      ; モンスター ID
20e444: 40100200  sll v0,v0,0x1
20e448: 8f00013c  lui at,0x8f
20e44c: 21082200  addu  at,at,v0
20e450: 20362284  lh  v0,13856(at)
20e454: 18df080c  jal 0x237c60
20e458: 21800202  addu  s0,s0,v0    ; s0 += モンスター 勧誘率補正
 
20e45c: 40100200  sll v0,v0,0x1
20e460: 2d200000  move  a0,zero
20e464: 8f00013c  lui at,0x8f
20e468: 21082200  addu  at,at,v0
20e46c: 98ef2284  lh  v0,-4200(at)
20e470: 009180af  sw  zero,-28416(gp)
20e474: 9c74080c  jal 0x21d270      ; v0 ← 乱数 0〜998
20e478: 21800202  addu  s0,s0,v0    ; s0 += Lv 勧誘率補正
 
20e47c: 2a105000  slt v0,v0,s0
20e480: 03004050  beqzl v0,0x20e490 ; (乱数値) >= s0 の場合、仲間にならない
20e484: 2d100000  move  v0,zero
 
20e488: 009191af  sw  s1,-28416(gp)
20e48c: 01000224  li  v0,1
20e490: 0000b0df  ld  s0,0(sp)
20e494: 0800b1df  ld  s1,8(sp)
20e498: 1000b2df  ld  s2,16(sp)
20e49c: 1800b3df  ld  s3,24(sp)
20e4a0: 2000bfdf  ld  ra,32(sp)
20e4a4: 0800e003  jr  ra
20e4a8: 3000bd27  addiu sp,sp,48
 
 
8f39a0: 40    (0x29)
8f39ac: 60    (0x2a)
8f39b8: 90    (0x2b)
8f39c4: -9999 (0x2c)
8f39d0: 128   (0x2d)
 
8eef98: 00 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 
        08 00 09 00 0a 00 0b 00 0c 00 0d 00 0e 00 0f 00 
        10 00 11 00 12 00 13 00 14 00 15 00 16 00 17 00 
        18 00 19 00 1a 00 1b 00 1c 00 1d 00 1e 00 1f 00 
        20 00 21 00 22 00 23 00 24 00 25 00 26 00 27 00 
        28 00 29 00 2a 00 2b 00 2c 00 2d 00 2e 00 2f 00 
        30 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00 
        38 00 39 00 3a 00 3b 00 3c 00 3d 00 3e 00 3f 00 
        40 00 41 00 42 00 43 00 44 00 45 00 46 00 47 00 
        48 00 49 00 4a 00 4b 00 4c 00 4d 00 4e 00 4f 00 
        50 00 51 00 52 00 53 00 54 00 55 00 56 00 57 00 
        58 00 59 00 5a 00 5b 00 5c 00 5d 00 5e 00 5f 00 
        60 00 61 00 62 00 63 00
 
8f3620: 00 00 64 00 32 00 01 00 64 00 64 00 0a 00 0a 00 
        64 00 32 00 64 00 32 00 1e 00 14 00 64 00 32 00 
        30 ff 32 00 1e 00 1e 00 fa 00 c8 00 01 00 00 00 
        05 00 01 00 91 00 1e 00 1e 00 32 00 32 00 64 00 
        64 00 14 00 14 00 64 00 32 00 94 ff 64 00 64 00 
        64 00 64 00 1e 00 05 00 01 00 64 00 32 00 32 00 
        28 00 14 00 0a 00 14 00 50 00 46 00 3c 00 32 00 
        14 00 32 00 28 00 1e 00 0a 00 0a 00 1e 00 1e 00 
        1e 00 01 00 01 00 64 00 96 00 01 00 14 00 4e ff 
        4e ff 00 00 00 00 64 00 64 00 64 00 32 00 1e 00 
        01 00 64 00 64 00 1e 00 64 00 46 00 28 00 64 00 
        32 00 64 00 05 00 64 00 64 00 64 00 32 00 0a 00 
        0a 00 64 00 32 00 64 00 64 00 64 00 64 00 64 00 
        28 00 64 00 32 00 14 00 64 00 94 ff 64 00 30 ff 
        01 00 32 00 64 00 64 00 32 00 64 00 64 00 64 00 
        14 00 14 00 1e 00 0f 00 0f 00 32 00 32 00 32 00 
        32 00 38 ff 28 00 28 00 94 ff 30 ff 01 00 01 00 
        00 00 00 00 00 00 00 00 64 00 46 00 46 00 58 ff 
        58 ff 58 ff 46 00 46 00 3c 00 01 00 01 00 01 00 
        28 00 28 00 64 00 64 00 64 00 64 00 0a 00 0a 00 
        64 00 64 00 64 00 30 ff 01 00 01 00 64 00 64 00 
        00 00 64 00 28 00 50 00 14 00 94 ff 30 ff 14 00 
        64 00 64 00 64 00 64 00 64 00 64 00 01 00 46 00 
        46 00 46 00 64 00 00 00 ce ff 05 00 05 00 05 00 
        05 00 05 00 05 00 05 00 05 00 00 00 00 00 00 00 
 
;--------------------------------
; 乱数 0〜998 を返す
;--------------------------------
21d270: f0ffbd27  addiu sp,sp,-16
21d274: 2d288000  move  a1,a0
21d278: 0000bfff  sd  ra,0(sp)
21d27c: e7030424  li  a0,999
21d280: 0000bfdf  ld  ra,0(sp)
21d284: 3eca0908  j 0x2728f8
21d288: 1000bd27  addiu sp,sp,16
 

福引き

福引き処理では上記とは別の方法で 0〜1999 の範囲の乱数値を取得し、下記の表のように等級が決定されます。
0〜1999 の範囲の乱数は (1?〜8388607 の範囲の乱数値(詳細不明)) mod 2000 によって取得されます。

条件 等級 アイテム 確率(乱数の一様性を仮定した場合)
(乱数値) = 1999 特等 ゴールドカード 約 1/2000
1988 ≤ (乱数値) < 1999 1等 白紙の巻物 約 11/2000
1968 ≤ (乱数値) < 1988 2等 メッキの巻物 約 20/2000
500 ≤ (乱数値) < 600 3等 スカラの巻物 約 100/2000
850 ≤ (乱数値) < 1000 4等 バイキルトの巻物 約 150/2000
0 ≤ (乱数値) < 450 5等 (福引き券) 約 450/2000
(その他) はずれ (なし) 約 1268/2000

ソース

+ ...
;----------------------------------------
; 乱数 初期化
;----------------------------------------
2deef8: 0008a448  qmtc2 a0,$vf1
2deefc: 3e0c004a  vrinit  $R,$vf1x
2def00: 0800e003  jr  ra
2def04: 00000000  nop
 
; 乱数 シード指定箇所
...
3328a8: 0b00043c  lui a0,0xb
3328ac: be7b0b0c  jal 0x2deef8
3328b0: 85ae8434  ori a0,a0,0xae85
 
; 乱数 シード指定箇所
...
200420: 5600043c  lui a0,0x56
200424: be7b0b0c  jal 0x2deef8
200428: db298434  ori a0,a0,0x29db
 
;----------------------------------------
; 乱数? 取得部分
;----------------------------------------
2def3c: 7f00083c  lui t0,0x7f
2def40: ffff0835  ori t0,t0,0xffff
2def44: 3c04e14b  vrnext.xyzw $vf1xyzw,$R
2def48: 00082248  qmfc2 v0,$vf1
2def4c: 0800e003  jr  ra
2def50: 24104800  and v0,v0,t0
 
;----------------------------------------
; 福引き
;----------------------------------------
32a514: 3cf88324  addiu v1,a0,-1988
32a518: 01000624  li  a2,1
32a51c: 0b00632c  sltiu v1,v1,11
32a520: 50f88524  addiu a1,a0,-1968
32a524: 06000224  li  v0,6
32a528: 1400a52c  sltiu a1,a1,20
32a52c: 0b10c300  movn  v0,a2,v1
 
32a530: 02000624  li  a2,2
32a534: 0cfe8324  addiu v1,a0,-500
32a538: 0b10c500  movn  v0,a2,a1
 
32a53c: 6400632c  sltiu v1,v1,100
32a540: 03000624  li  a2,3
32a544: aefc8524  addiu a1,a0,-850
32a548: 0b10c300  movn  v0,a2,v1
 
32a54c: 9600a52c  sltiu a1,a1,150
32a550: 04000324  li  v1,4
32a554: 0b106500  movn  v0,v1,a1
 
32a558: c201852c  sltiu a1,a0,450
32a55c: cf070624  li  a2,1999
32a560: 05000324  li  v1,5
32a564: 26208600  xor a0,a0,a2
32a568: 0b106500  movn  v0,v1,a1
 
32a56c: 0800e003  jr  ra
32a570: 0a100400  movz  v0,zero,a0
 

モンスター出現率

ソース

+ ...
221d84: c0ffbd27  addiu sp,sp,-64
221d88: 0000b0ff  sd  s0,0(sp)
221d8c: 0800b1ff  sd  s1,8(sp)
221d90: 3000bfff  sd  ra,48(sp)
221d94: 1000b2ff  sd  s2,16(sp)
221d98: 2d900000  move  s2,zero
221d9c: 1800b3ff  sd  s3,24(sp)
221da0: ff009330  andi  s3,a0,0xff
221da4: 2000b4ff  sd  s4,32(sp)
221da8: ff00d430  andi  s4,a2,0xff
221dac: 2800b5ff  sd  s5,40(sp)
221db0: ff00b530  andi  s5,a1,0xff
221db4: 9c74080c  jal 0x21d270      ; v0 ← 乱数 0〜998
221db8: 2d200000  move  a0,zero
 
221dbc: a072080c  jal 0x21ca80
221dc0: 2d884000  move  s1,v0
 
221dc4: 2d184000  move  v1,v0
 
221dc8: 00006584  lh  a1,0(v1)
221dcc: 0f00a010  beqz  a1,0x221e0c
221dd0: 41001024  li  s0,65
 
221dd4: 02006284  lh  v0,2(v1)      ; v0 ← (境界値)
221dd8: 06004014  bnez  v0,0x221df4
221ddc: 2a205100  slt a0,v0,s1      ; a0 ← (境界値) < (乱数値)
...
221dec: f6ff0010  b 0x221dc8
221df0: 06006324  addiu v1,v1,6
...
221e00: f1ff8014  bnez  a0,0x221dc8
221e04: 06006324  addiu v1,v1,6
...
 

アイテム出現率

ソース

  • へんげの壺: 0x002C9820 (アイテム決定に使用される乱数値の範囲は 0〜997)
  • モノカの杖・モンスターの所持アイテム: 0x002C8510 (...乱数値の範囲は 0〜998)
  • 床落ち・店・発掘: 0x00253968 (...乱数値の範囲は 0〜997)
+ ...
;
; 乱数 0〜997 を返す
;
L_0021D254:
    addiu   sp,-0x10
    dmove   a1,a0
    sd  ra,(sp)
    li  a0,0x3E6          ; a0 ← 998
    ld  ra,(sp)
    j   L_002728F8
    addiu   sp,0x10
 
;
; アイテム選択処理
;
L_00253968:
    ...
 
L_00253B7C:
    jal L_0021D254        ; v0 ← 乱数 0〜997
    dmove   a0,zero
 
L_00253B84:
    lw  a3,(s5)
    bltz    a3,L_00253B9C
    dmove   a2,v0         ; a2 ← v0
 
    dmove   a0,s7
    b   L_00253BBC
    dmove   s3,s6
 
L_00253B9C:
    lui v0,0x0040
    and v0,a3,v0
    beqz    v0,L_00253BB4
    lw  a0,0x348(sp)
 
    b   L_00253BBC
    dmove   s3,fp
 
L_00253BB4:
    lw  a0,0x340(sp)
    lw  s3,0x344(sp)
 
L_00253BBC:
    lh  v0,(a0)
    beqz    v0,L_00253BD4
    dmove   s1,zero
 
    slt v0,a2
    beqzl   v0,L_00253C0C ; (境界値) >= (乱数値)
 
    xori    v0,s1,0x000E
 
L_00253BD4:
    addiu   s1,0x1
 
L_00253BD8:
    sll v0,s1,0x01
    slti    v1,s1,0x000E
    beqz    v1,L_00253C08 
    addu    v0,a0
 
    lh  v0,(v0)
    nop 
    beqz    v0,L_00253BD4
    slt v1,v0,a2          ; v1 ← (境界値) < (乱数値)
    nop 
    nop 
    bnezl   v1,L_00253BD8 ; (境界値) >= (乱数値) となるまでループする
 
    addiu   s1,0x1
 
L_00253C08:
    xori    v0,s1,0x000E
 
L_00253C0C:
    li  v1,0xC
    sltiu   a1,v0,0x0001
    bne s1,v1,L_00253C3C
    li  a2,0x1
 
    lui v0,0x0065
    lui v1,0x0020
    lhu a0,-0x2EC4(v0)
    and v1,a3,v1
    lhu v0,0x8(s5)
    movn    a1,a2,v1
    xor v0,a0
    movz    a1,a2,v0
 
L_00253C3C:
    beqz    a1,L_00253C6C
    li  a1,0x122
 
    ...
    b   L_00253E10
    addiu   s4,0x1
 
L_00253C6C:
    dmove   a0,zero
    jal L_0021D254         ; v0 ← 乱数値 0〜997
    dmove   s0,zero
 
    dmove   a1,zero
    dmove   a2,v0
    dmove   v1,s3
 
L_00253C84:
    lh  a0,(v1)
    beqz    a0,L_00253CB0
    addiu   v1,0x2
 
    lui v0,0x0090
    addu    v0,a1
    lh  v0,0x4614(v0)
    bnel    v0,s1,L_00253CB4
    addiu   s0,0x1
 
    slt v0,a0,a2             ; v0 ← (境界値) < (乱数値)
    beqz    v0,L_00253CC4    ; (境界値) >= (乱数値) となるまでループ
    li  v0,0x172
 
L_00253CB0:
    addiu   s0,0x1
 
L_00253CB4:
    slti    v0,s0,0x0172
    bnez    v0,L_00253C84
    addiu   a1,0x18
 
    li  v0,0x172
 
L_00253CC4:
    bne s0,v0,L_00253CF4
    addiu   s3,sp,0x100
 
    ...
 

注意: 床落ちアイテム と モンスターの所持アイテム は同一のアイテムテーブルから選択されますが、アイテム選択の際に用いられる乱数値の範囲が異なるため、(一部の)アイテムの出現率には微小な差異があります。現状は、床落ちアイテムの出現率のみを記載しています。
最終更新:2024年06月12日 22:54