寶可夢太陽月亮亂數小研究

由於這樣那樣的原因,研究起了太陽月亮的孵蛋亂數產生器,大概有了一些有趣的小發現。在這邊列出來一下。因為不是研究很深入,所以可能有錯,錯了就算了反正不重要(炸)

  • 亂數產生使用了 TinyMT 演算法
  • 生成 seed 週期為 2^127 - 1
  • 可以生成 32bit 的 PID

由於系統儲存了目前的亂數位置(status),而這個 status 是由四個 32bit 的數字組成的,並且在亂數計算過程一開始就會把 status 的四組數字顛倒過來,所以這也是為什麼程式計算都是 status[3] ~ status[0],而不是 status[0] ~ status[3]。

格式例如這樣:

status[3] = 0x12345678

status[2] = 0xabcdef01

status[1] = 0x87654321

status[0] = 0xfedcba98

覺醒力量:

  • 覺醒力量的演算法如下
  • 先把六項個體值 HABCDS 對 2 取餘數,得到 habcds (範圍為 0 或 1)
  • (h+2*a+4*b+8*s+16*c+32*d) * 15/63
  • HABCDS 對應寶可夢個體值,注意的是 S 在 C、D 前面
  • 所以值只會在 0 ~ 15 之間
  • 因為屬性有 18 個,但是會出現的值只有 16 個
  • 所以沒有一般系跟妖精系的覺醒力量(炸)

好,回來講孵蛋亂數。

孵蛋亂數在決定目前的 seed (status) 之後,領蛋的瞬間會決定蛋的值,以及下一個 seed。而大家都知道如果退蛋會 seed + 1,領蛋則是加不定數,這是因為蛋的值(例如性格、個體...)都是用後面幾個 seed (status) 去算出來的,所以這些 seed 用掉之後,開發者就決定跳過這些 seed,增加隨機性(如果沒跳過的話很可能會出現連續兩個蛋個體值一樣的情況)

亂數消費如下:

  • 開頭先消費一次
  • 無性別、固定公、固定母不消費亂數,有公母的消耗 1
  • 無視不變之石,亂數性格,消耗 1
  • 如果兩方都帶不變之石,額外消耗 1,決定性格遺傳
  • 如果一方帶不變之石,強制覆蓋性格,不消耗
  • 決定特性,消耗 1
  • 決定遺傳個體,消耗數不定,這邊會先判定要遺傳幾項個體(例如有沒有帶紅線),然後用 1 消耗決定遺傳 HABCDS 哪一項,再用 1 消耗決定遺傳公母。由於決定遺傳 HABCDS 的時候有可能兩次亂數都決定遺傳同一項,所以這邊有判定如果個體該項已經被遺傳了,就會再跑一次亂數,所以這邊消耗數可以變化很大
  • 決定個體,消耗數 6,決定個體之後會再用剛剛的遺傳個體覆蓋過去。
  • 這時候可以計算覺醒力量了
  • 計算 PID,1 消耗
  • 決定色違判定次數,初始值 0,國際結婚 +6,光守 +2
  • 這邊有點怪怪的,初始判定次數如果真的是 0 的話,那麼只要沒光守,沒國孵就等於不可能出色違,但是這樣違背常理,應該是亂數計算工具寫錯。
  • 從 PID 計算 TSV 是否符合色違條件,如果有多次判定(光守、國際結婚),則會多跑幾次,如果出現色違則停止亂數,在這邊多跑幾次等於多幾次消耗
  • 決定非百變怪的球種遺傳,如果雙親都非百變怪,消耗 1
  • 結尾消費一次

大概這樣,有什麼新發現會再補充。

發佈留言