アットウィキロゴ

Wizardry DIMGUIL (PS) > 確率

非戦闘関連

乱数生成

次のコードと同等の処理によって乱数が生成されています。
struct DimguilRng {
  DimguilRng(uint32_t x0, uint32_t x1) : x0(x0), x1(x1) {}
 
  uint32_t rand(uint32_t m) {
    uint32_t y1 = m - 1;
    uint32_t y0_0 = m - 1;
    uint32_t y0_1 = m - 1;
    uint32_t y0_2 = m - 1;
    while (true) {
      y1 = (this->x1 * 5 + y1) & 0xffff;
      for (int i = 0; i < 5; ++i) {
        y0_0 += this->x0;
        y0_1 += y0_0 >> 16;
        y0_2 += y0_1 >> 16;
        y0_0 &= 0xffff;
      }
      this->x0 = y0_0 + y0_2;
      this->x1 = y1 + y0_1;
      uint64_t p = uint64_t(this->x1) * m;
      y0_0 = p & 0xffff;
      y0_1 = p >> 16;
      if (y0_1 == m) {
        continue;
      }
      return y0_1;
    }
  }
 
  uint32_t x0;
  uint32_t x1;
};
 

注意

  • rand(m) は、0〜(m-1) の範囲の乱数値を返すことを意図したものと思われますが、m の値によっては、範囲を超えて m+1 以上の値を返す場合があります。(: 「おたか」からもらえるアイテムは rand(306) + 1 によって計算されますが、rand(306) は 307 を返すことがあるため、未使用アイテムである「イベント」をもらえる場合があります )
  • rand(m) は処理が終了しない(フリーズする)場合があります。(: (x0, x1) が (0xf32c, 0x332c) であったときに rand(17) が呼ばれた場合)

ソース

+ ...
;-----------------------------------------
; v0 ← 乱数 0〜a0
;(ただし、a0+2 以上の値を返す場合あり)
;-----------------------------------------
8001cd90: 21508000  move  t2,a0
8001cd94: 21308000  move  a2,a0
8001cd98: 2118c000  move  v1,a2
8001cd9c: 2138c000  move  a3,a2
8001cda0: 0000cc28  slti  t4,a2,0
 
8001cda4: 0100cb24  addiu t3,a2,1
8001cda8: 04000524  li  a1,4
 
8001cdac: 2000898f  lw  t1,32(gp)
8001cdb0: 2400888f  lw  t0,36(gp)
 
8001cdb4: 2138e900  addu  a3,a3,t1
8001cdb8: 21186800  addu  v1,v1,t0
8001cdbc: 03140300  sra v0,v1,0x10
8001cdc0: 2130c200  addu  a2,a2,v0
8001cdc4: 03140600  sra v0,a2,0x10
8001cdc8: 21504201  addu  t2,t2,v0
8001cdcc: ffff6330  andi  v1,v1,0xffff
8001cdd0: ffffa524  addiu a1,a1,-1
8001cdd4: f7ffa104  bgez  a1,0x8001cdb4
8001cdd8: ffffe730  andi  a3,a3,0xffff
 
8001cddc: 2140e600  addu  t0,a3,a2
8001cde0: 21300000  move  a2,zero
8001cde4: 21106a00  addu  v0,v1,t2
8001cde8: 2118c000  move  v1,a2
8001cdec: 200088af  sw  t0,32(gp)
8001cdf0: 240082af  sw  v0,36(gp)
8001cdf4: 08008015  bnez  t4,0x8001ce18
8001cdf8: 2128c000  move  a1,a2
 
8001cdfc: 21186800  addu  v1,v1,t0
8001ce00: 03140300  sra v0,v1,0x10
8001ce04: 2130c200  addu  a2,a2,v0
8001ce08: 0100a524  addiu a1,a1,1
8001ce0c: 2a108500  slt v0,a0,a1
8001ce10: faff4010  beqz  v0,0x8001cdfc
8001ce14: ffff6330  andi  v1,v1,0xffff
 
8001ce18: e4ffcb10  beq a2,t3,0x8001cdac
8001ce1c: 04000524  li  a1,4
 
8001ce20: 0800e003  jr  ra
8001ce24: 2110c000  move  v0,a2
 

「埋もれた金塊」イベント

「埋もれた金塊」イベントは、「神殿内部」「地下神殿」「エリア A〜E」に移動した際(マロール可)に、イベントが設定されていないマスに配置されることがあります。(正確な条件はやや複雑なため、省略します)

このイベントでは、約 777/778 の確率で金塊(Gp)を入手でき、約 1/778 の確率(rand(778) = 77 を満たした場合)で財宝(アイテム)を入手できます。

入手できる金塊の量は、パーティの合計 Lv に依存して次のように決まります。
  • (合計 Lv) ≤ 120 の場合: rand(rand(301) + 2 × (合計 Lv)) + 100
  • (合計 Lv) > 120 の場合: rand(2 × (合計 Lv)) + 100

また、この値は約 1/101 の確率(rand(101) = 77 を満たした場合)で 10 倍になります。

入手できる財宝(アイテム)は、rand(306) + 1 によって決定されます(おたかイベントと同様)。ただし、乱数生成処理の都合により、実際に入手できるアイテムは No.155〜No.157(「忍びの覆面」「忍びの足袋」「鋼のブーツ」)のいずれかとなります。

ソース

+ ...
...
800c04d4: 09030424  li  a0,777
...
800c0504: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 以上になることあり]
800c0508: 000060a0  ...
 
800c050c: 4d000324  li  v1,77
800c0510: 2b004314  bne v0,v1,0x800c05c0
800c0514: 21900000  move  s2,zero
 
; 財宝の場合
 
800c0518: 21400000  move  t0,zero
800c051c: 21380001  move  a3,t0
800c0520: 0880023c  lui v0,0x8008
800c0524: d8d94924  addiu t1,v0,-9768
800c0528: 0880023c  lui v0,0x8008
800c052c: e0ea4a24  addiu t2,v0,-5408
800c0530: 2110ea00  addu  v0,a3,t2
 
800c0534: 02004680  lb  a2,2(v0)
800c0538: 21280000  move  a1,zero
800c053c: 40100600  sll v0,a2,0x1
800c0540: 21104600  addu  v0,v0,a2
800c0544: 80100200  sll v0,v0,0x2
800c0548: 21104600  addu  v0,v0,a2
800c054c: 00210200  sll a0,v0,0x4
800c0550: 21108900  addu  v0,a0,t1
800c0554: 20004384  lh  v1,32(v0)
800c0558: ffff0224  li  v0,-1
800c055c: 04006214  bne v1,v0,0x800c0570
800c0560: 00000000  nop
 
800c0564: 0200c310  beq a2,v1,0x800c0570
800c0568: 00000000  nop
 
800c056c: 01000825  addiu t0,t0,1
 
800c0570: 0100a524  addiu a1,a1,1
800c0574: 0a00a228  slti  v0,a1,10
800c0578: f5ff4014  bnez  v0,0x800c0550
800c057c: 02008424  addiu a0,a0,2
 
800c0580: 0100e724  addiu a3,a3,1
800c0584: 0600e228  slti  v0,a3,6
800c0588: eaff4014  bnez  v0,0x800c0534
800c058c: 2110ea00  addu  v0,a3,t2
 
800c0590: 0b000011  beqz  t0,0x800c05c0 ; アイテムに空きがない場合
 
800c0594: 21900000  move  s2,zero
 
800c0598: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 以上になることあり]
800c059c: 31010424  li  a0,305
 
800c05a0: 6c2e030c  jal 0x800cb9b0 ; アイテム追加(未識別)
800c05a4: 01004424  addiu a0,v0,1
800c05a8: 0880033c  lui v1,0x8008
800c05ac: 3c000224  li  v0,60
800c05b0: bc010308  j 0x800c06f0
800c05b4: f29b62a0  sb  v0,-25614(v1)
 
800c05b8: b6010308  j 0x800c06d8
800c05bc: 1c0082ac  sw  v0,28(a0)
 
; 金塊の場合
 
800c05c0: 21884002  move  s1,s2
800c05c4: 0880023c  lui v0,0x8008
800c05c8: e0ea4524  addiu a1,v0,-5408
800c05cc: ffff0424  li  a0,-1
800c05d0: 0880023c  lui v0,0x8008
800c05d4: d8d94324  addiu v1,v0,-9768
800c05d8: 21102502  addu  v0,s1,a1
800c05dc: 02005080  lb  s0,2(v0)
800c05e0: 00000000  nop
800c05e4: 0a000412  beq s0,a0,0x800c0610
800c05e8: 40101000  sll v0,s0,0x1
 
800c05ec: 21105000  addu  v0,v0,s0
800c05f0: 80100200  sll v0,v0,0x2
800c05f4: 21105000  addu  v0,v0,s0
800c05f8: 00110200  sll v0,v0,0x4
800c05fc: 21104300  addu  v0,v0,v1
800c0600: 44004284  lh  v0,68(v0)
800c0604: 00000000  nop
800c0608: 40100200  sll v0,v0,0x1
800c060c: 21904202  addu  s2,s2,v0 ; s2 += lv * 2
 
800c0610: 01003126  addiu s1,s1,1
800c0614: 0600222a  slti  v0,s1,6
800c0618: f0ff4014  bnez  v0,0x800c05dc
800c061c: 21102502  addu  v0,s1,a1
 
800c0620: ffff5226  addiu s2,s2,-1
800c0624: f000422a  slti  v0,s2,240
800c0628: 04004010  beqz  v0,0x800c063c ; 2 * 合計 lv - 1 >= 240
800c062c: 00000000  nop
 
800c0630: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 以上になることあり]
800c0634: 2c010424  li  a0,300
 
800c0638: 21904202  addu  s2,s2,v0
 
800c063c: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 以上になることあり]
800c0640: 21204002  move  a0,s2
 
; 10 倍処理
 
800c0644: 64005224  addiu s2,v0,100
800c0648: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0
800c064c: 64000424  li  a0,100
 
800c0650: 4d000324  li  v1,77
800c0654: 04004314  bne v0,v1,0x800c0668
800c0658: 00000000  nop
800c065c: 80101200  sll v0,s2,0x2
800c0660: 21105200  addu  v0,v0,s2
800c0664: 40900200  sll s2,v0,0x1
...
 

おたかイベント [初期版]

NPC おたかは「フィールド」「神殿内部」「地下神殿」「エリアX, A〜E」に移動した際(マロール可)に出現することがあり、その出現確率は約 1/1000(rand(1000) = 777 を満たした場合)です。ただし、「街外れ」から「フィールド」に移動した際には出現しません。

おたか からもらえる各々のアイテムは rand(306) + 1 によって決定されます。ただし、乱数生成処理の都合により、実際にもらえるアイテムは No.2〜No.306(「スタッフ」〜「孫の手」), No.308「イベント」のいずれかとなります。

また、約 1/7 の確率(rand(7) = 1 を満たした場合)で、全てのアイテムを識別状態でもらうことができます。

効率的な遭遇手順(正攻法)

おたか は「フィールド」に出現した場合、必ず座標 (10, 2) に配置されます。(これは、意図的なものではなく、乱数生成処理の都合によります)

よって、「魔法の魔除け」を使い、座標 (10, 2) に繰り返しマロールすることで、おたかが出現した場合には必ず会うことができます。

ソース

+ ...
;
; おたか判定箇所
;
...
800c4830: 0680023c  lui v0,0x8006
 
800c4834: 6e000324  li  v1,110
800c4838: d2e043a0  sb  v1,-7982(v0)
800c483c: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 以上になることあり]
800c4840: e7030424  li  a0,999
 
800c4844: 09030324  li  v1,777
800c4848: 33004314  bne v0,v1,0x800c4918
800c484c: 00000000  nop
800c4850: 0880023c  lui v0,0x8008
800c4854: 38994390  lbu v1,-26312(v0) ; ← フロア ID (0x80079938)
800c4858: 00000000  nop
800c485c: 0900622c  sltiu v0,v1,9
800c4860: 06004014  bnez  v0,0x800c487c
800c4864: 0680023c  lui v0,0x8006
 
800c4868: eeff6224  addiu v0,v1,-18
800c486c: 1600422c  sltiu v0,v0,22
800c4870: 29004010  beqz  v0,0x800c4918
800c4874: 00000000  nop
 
800c4878: 0680023c  lui v0,0x8006
 
800c487c: 1caf5324  addiu s3,v0,-20708
800c4880: 0680023c  lui v0,0x8006
800c4884: 9cd75224  addiu s2,v0,-10340
800c4888: 0680023c  lui v0,0x8006
800c488c: 9cbc5124  addiu s1,v0,-17252
 
800c4890: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0
800c4894: 17000424  li  a0,23
800c4898: 21804000  move  s0,v0
 
800c489c: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0
800c48a0: 17000424  li  a0,23
800c48a4: 21304000  move  a2,v0
 
800c48a8: 40101000  sll v0,s0,0x1
800c48ac: 21185000  addu  v1,v0,s0
800c48b0: c0100300  sll v0,v1,0x3
800c48b4: 2120c200  addu  a0,a2,v0
800c48b8: 21109300  addu  v0,a0,s3
800c48bc: 00004590  lbu a1,0(v0)
800c48c0: ff000224  li  v0,255
800c48c4: f2ffa210  beq a1,v0,0x800c4890
800c48c8: 21109200  addu  v0,a0,s2
 
800c48cc: 00004290  lbu v0,0(v0)
800c48d0: 00000000  nop
800c48d4: eeff4014  bnez  v0,0x800c4890
800c48d8: 80100600  sll v0,a2,0x2
 
800c48dc: 40190300  sll v1,v1,0x5
800c48e0: 21104300  addu  v0,v0,v1
800c48e4: 21105100  addu  v0,v0,s1
800c48e8: 0000428c  lw  v0,0(v0)
800c48ec: 00000000  nop
800c48f0: 02004230  andi  v0,v0,0x2
800c48f4: e6ff4010  beqz  v0,0x800c4890
800c48f8: 0680023c  lui v0,0x8006
 
800c48fc: 9cd74224  addiu v0,v0,-10340
800c4900: 21108200  addu  v0,a0,v0
800c4904: 7d000324  li  v1,125
800c4908: 000043a0  sb  v1,0(v0)
800c490c: 0680033c  lui v1,0x8006
800c4910: 6f000224  li  v0,111
800c4914: cde062a0  sb  v0,-7987(v1)
...
 
;
; アイテム処理部分
;
...
800c2240: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0
800c2244: 06000424  li  a0,6
 
800c2248: 01000324  li  v1,1
800c224c: 0f004314  bne v0,v1,0x800c228c
800c2250: 00000000  nop
 
; 約 1/7
 
800c2254: a537030c  jal 0x800cde94
800c2258: 3b010424  li  a0,315
800c225c: 1b00201a  blez  s1,0x800c22cc
800c2260: 21800000  move  s0,zero
 
800c2264: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 になることあり]
800c2268: 31010424  li  a0,305
 
800c226c: a12e030c  jal 0x800cba84 ; アイテム追加(鑑定済み)
800c2270: 01004424  addiu a0,v0,1
 
800c2274: 01001026  addiu s0,s0,1
800c2278: 2a101102  slt v0,s0,s1
800c227c: f9ff4014  bnez  v0,0x800c2264
800c2280: 0980023c  lui v0,0x8009
 
800c2284: b5080308  j 0x800c22d4
800c2288: 0880033c  lui v1,0x8008
 
; 約 6/7
 
800c228c: a537030c  jal 0x800cde94
800c2290: 3a010424  li  a0,314
800c2294: 0d00201a  blez  s1,0x800c22cc
800c2298: 21800000  move  s0,zero
 
800c229c: 6473000c  jal 0x8001cd90 ; v0 ← 乱数 0〜a0 [a0+2 になることあり]
800c22a0: 31010424  li  a0,305
 
800c22a4: 6c2e030c  jal 0x800cb9b0 ; アイテム追加(未識別)
800c22a8: 01004424  addiu a0,v0,1
 
800c22ac: 01001026  addiu s0,s0,1
800c22b0: 2a101102  slt v0,s0,s1
800c22b4: f9ff4014  bnez  v0,0x800c229c
800c22b8: 0980023c  lui v0,0x8009
 
800c22bc: b5080308  j 0x800c22d4
800c22c0: 0880033c  lui v1,0x8008
 
; 空きがない場合
 
800c22c4: a537030c  jal 0x800cde94
800c22c8: 39010424  li  a0,313
 

戦闘関連

乱数生成

32-bit 状態の線形合同法を用いており、内部状態 x は x ← (0x41c64e6d × x + 12345) mod 232 によって更新されます。

乱数 0〜(n-1) は、次のいずれかの式によって計算されます:
  • ⌊(⌊x / 65536⌋ mod 32768) / 2max{0, 12-k} ⌋ mod n (ただし、k は 2k ≥ n を満たす最小の非負整数)
  • (⌊x / 65536⌋ mod 32768) mod n

ソース

+ ...
;------------------------------------------------------
; v0 ← 乱数 0〜(a0-1)
;------------------------------------------------------
8002188c: ff7f0224  li  v0,32767
80021890: 2a104400  slt v0,v0,a0
80021894: 02004010  beqz  v0,0x800218a0
80021898: c641033c  lui v1,0x41c6
 
8002189c: ff7f0424  li  a0,32767
 
800218a0: 0880023c  lui v0,0x8008
800218a4: 049d428c  lw  v0,-25340(v0)
800218a8: 6d4e6334  ori v1,v1,0x4e6d
800218ac: 18004300  mult  v0,v1
800218b0: 01000524  li  a1,1
800218b4: 21300000  move  a2,zero
800218b8: 12400000  mflo  t0
800218bc: 39300325  addiu v1,t0,12345
800218c0: 02140300  srl v0,v1,0x10
800218c4: ff7f4730  andi  a3,v0,0x7fff
800218c8: 0880013c  lui at,0x8008
800218cc: 049d23ac  sw  v1,-25340(at)
 
800218d0: 2a10a400  slt v0,a1,a0
800218d4: 06004010  beqz  v0,0x800218f0 ; a1 >= a0 の場合
800218d8: 0c000224  li  v0,12
 
800218dc: 0100c624  addiu a2,a2,1
800218e0: 0c00c228  slti  v0,a2,12
800218e4: faff4014  bnez  v0,0x800218d0
800218e8: 40280500  sll a1,a1,0x1
 
800218ec: 0c000224  li  v0,12
 
800218f0: 23304600  subu  a2,v0,a2
800218f4: 0638c700  srlv  a3,a3,a2
800218f8: 1b00e400  divu  zero,a3,a0
800218fc: 02008014  bnez  a0,0x80021908
80021900: 00000000  nop
80021904: 0d000700  break 0x7
 
80021908: 10100000  mfhi  v0
8002190c: 0800e003  jr  ra
80021910: 00000000  nop
 
;------------------------------------------------------
; v0 ← 乱数 0〜(a0-1)
;------------------------------------------------------
80021914: ff7f0224  li  v0,32767
80021918: 2a104400  slt v0,v0,a0
8002191c: 02004010  beqz  v0,0x80021928
80021920: c641033c  lui v1,0x41c6
 
80021924: ff7f0424  li  a0,32767
 
80021928: 0880023c  lui v0,0x8008
8002192c: 049d428c  lw  v0,-25340(v0) ; 0x80079d04
80021930: 6d4e6334  ori v1,v1,0x4e6d
80021934: 18004300  mult  v0,v1
80021938: 12180000  mflo  v1
8002193c: 39306324  addiu v1,v1,12345
80021940: 0880013c  lui at,0x8008
80021944: 049d23ac  sw  v1,-25340(at)
80021948: 021c0300  srl v1,v1,0x10
8002194c: ff7f6330  andi  v1,v1,0x7fff
80021950: 1b006400  divu  zero,v1,a0
80021954: 02008014  bnez  a0,0x80021960
80021958: 00000000  nop
8002195c: 0d000700  break 0x7
 
80021960: 10100000  mfhi  v0
80021964: 0800e003  jr  ra
80021968: 00000000  nop
 

入手した武器の攻撃回数補正

回数補正 表記 確率
-5 -! 0.27 % (11/4096)
-4 -? 0.27 % (11/4096)
-3 -# 0.54 % (11/2048)
-2 -& 1.07 % (11/1024)
-1 -% 4.10 % (21/512)
0 75.00 % (3/4)
1 +% 12.30 % (63/512)
2 +& 3.22 % (33/1024)
3 +# 1.61 % (33/2048)
4 +? 0.81 % (33/4096)
5 +! 0.81 % (33/4096)

ソース

+ ...
800c848c: 03160200  sra v0,v0,0x18
800c8490: 09004228  slti  v0,v0,9
800c8494: 2f004010  beqz  v0,0x800c8554
800c8498: 21880000  move  s1,zero
 
; 武器
 
800c849c: 2386000c  jal 0x8002188c ; v0 ← 乱数 0〜(a0-1)
800c84a0: 04000424  li  a0,4
 
800c84a4: 21984000  move  s3,v0
800c84a8: 01000224  li  v0,1
800c84ac: 17006216  bne s3,v0,0x800c850c
800c84b0: 00000000  nop
 
800c84b4: 21884000  move  s1,v0
800c84b8: 2386000c  jal 0x8002188c ; v0 ← 乱数 0〜(a0-1)
800c84bc: 03000424  li  a0,3
 
800c84c0: 21804000  move  s0,v0
800c84c4: 11001316  bne s0,s3,0x800c850c
800c84c8: 00000000  nop
 
800c84cc: 02001124  li  s1,2
800c84d0: 2386000c  jal 0x8002188c ; v0 ← 乱数 0〜(a0-1)
800c84d4: 02000424  li  a0,2
 
800c84d8: 0c005014  bne v0,s0,0x800c850c
800c84dc: 00000000  nop
 
800c84e0: 03001124  li  s1,3
800c84e4: 2386000c  jal 0x8002188c ; v0 ← 乱数 0〜(a0-1)
800c84e8: 02000424  li  a0,2
 
800c84ec: 07004014  bnez  v0,0x800c850c
800c84f0: 00000000  nop
 
800c84f4: 04001124  li  s1,4
800c84f8: 2386000c  jal 0x8002188c ; v0 ← 乱数 0〜(a0-1)
800c84fc: 02000424  li  a0,2
 
800c8500: 02004014  bnez  v0,0x800c850c
800c8504: 00000000  nop
 
800c8508: 05001124  li  s1,5
 
800c850c: 2386000c  jal 0x8002188c ; v0 ← 乱数 0〜(a0-1)
800c8510: 04000424  li  a0,4
 
800c8514: 01000324  li  v1,1
800c8518: 04004314  bne v0,v1,0x800c852c
800c851c: 00161100  sll v0,s1,0x18
 
800c8520: 02004010  beqz  v0,0x800c852c
800c8524: 27101100  nor v0,zero,s1
800c8528: 21884300  addu  s1,v0,v1
 
800c852c: 001e1500  sll v1,s5,0x18
800c8530: 031e0300  sra v1,v1,0x18
800c8534: 40100300  sll v0,v1,0x1
800c8538: 21104300  addu  v0,v0,v1
800c853c: 80100200  sll v0,v0,0x2
800c8540: 21104300  addu  v0,v0,v1
800c8544: 00110200  sll v0,v0,0x4
800c8548: 21108202  addu  v0,s4,v0
800c854c: 21105600  addu  v0,v0,s6
800c8550: 340051a0  sb  s1,52(v0)
 
最終更新:2026年08月12日 23:40