Skip to content

Instantly share code, notes, and snippets.

@oupo
Created April 14, 2010 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oupo/366474 to your computer and use it in GitHub Desktop.
Save oupo/366474 to your computer and use it in GitHub Desktop.
#!ruby -Ku
require "set"
def main()
PRNG.init_cache
load_waza_list "waza_list.txt"
num_monohiroi = 5
result_max = 10
count = 0
each_fseed(0x057a) do |seed|
results = judge_seeds(seed, num_monohiroi, 2)
next unless results
results.each do |r|
wazaname = get_waza_name(r.waza)
puts "%#.8x %s %d匹目 %2d" % [r.seed, ljust_name(wazaname, 7), r.index + 1, r.val]
end
count += 1
break if count >= result_max
end
end
def list_near_seeds(seed)
-1.upto(1) do |i|
high = ((seed >> 24) + i) & 0xff
-200.upto(200) do |j|
s = high << 24 | (seed + j & 0xffffff)
prng = PRNG.new(s)
prng.step 11
waza = calc_yubihuri_waza(prng)
prng.step 4 + num_waza_effect(waza)
monohirois = []
5.times do |i|
next unless prng.rand() % 10 == 0
monohirois << [i + 1, prng.rand() % 100]
end
puts "%#.8x %s %p" % [s, get_waza_name(waza), monohirois]
end
end
end
def ljust_name(name, i)
nchars = name.chars.to_a.size
space = " " * (i - nchars)
name + space
end
def each_fseed(row_min)
row = row_min
while true
hour = 0
while hour < 24
high = 0
while high < 256
seed = high << 24 | hour << 16 | row
yield seed
high += 1
end
hour += 1
end
row += 1
end
end
def judge_seeds(seed, num_monohiroi, n)
results = []
# 初期seedがn個ずれてもうまくいくseedを探す
n.times do |i|
r = judge_seed(seed + i * 2, num_monohiroi)
return nil unless r
return nil if results.any? {|e| r.index != e.index or r.val != e.val}
results << r
end
results
end
JudgeResult = Struct.new(:seed, :waza, :index, :val)
def judge_seed(seed, num_monohiroi)
prng = PRNG.new(seed)
prng.step 11
waza = calc_yubihuri_waza(prng)
return nil unless ok_waza?(waza)
prng.step 2
return nil unless prng.rand() % 100 + 1 <= get_waza_hit(waza)
prng.step 1 + num_waza_effect(waza)
num_monohiroi.times do |i|
next if prng.rand() % 10 != 0
r = prng.rand() % 100
if r >= 98
return JudgeResult.new(seed, waza, i, r)
end
end
nil
end
OK_WAZA_EFFECT_CODES = Set.new([
0x000, 0x002, 0x003, 0x004, 0x005, 0x006, 0x011, 0x01f, 0x02b, 0x02d,
0x030, 0x042, 0x044, 0x045, 0x046, 0x047, 0x048, 0x049, 0x04b, 0x04c,
0x04e, 0x050, 0x051, 0x063, 0x067, 0x075, 0x077, 0x079, 0x07b, 0x07d,
0x080, 0x081, 0x087, 0x08a, 0x08b, 0x08c, 0x092, 0x093, 0x095, 0x096,
0x098, 0x09e, 0x0a9, 0x0ab, 0x0ad, 0x0b6, 0x0b9, 0x0ba, 0x0bc, 0x0be,
0x0c4, 0x0c5, 0x0c6, 0x0c8, 0x0ca, 0x0cc, 0x0d1, 0x0d9, 0x0da, 0x0db,
0x0dd, 0x0de, 0x0e0, 0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0eb, 0x0ed, 0x0f5,
0x0f8, 0x0fd, 0x101, 0x104, 0x106, 0x109, 0x10c, 0x10d, 0x10f, 0x111,
0x112, 0x113, 0x114])
DESELECTION_LIST = Set.new([0x44, 0x66, 0x76, 0x77, 0xA5, 0xA6, 0xA8, 0xB6, 0xC2, 0xC5, 0xCB, 0xD6, 0xF3, 0x108, 0x10A, 0x10E, 0x10F, 0x112, 0x121, 0x157, 0x16C, 0x17E, 0x17F, 0x19F, 0x1C0])
def calc_yubihuri_waza(prng)
begin
waza = prng.rand() % 0x1d3 + 1
end while DESELECTION_LIST.include?(waza)
waza
end
WazaEntry = Struct.new(:effect_code, :effect_odds, :hit_odds, :name)
WAZA_LIST = [nil]
def load_waza_list(path)
open(path, "rb") do |f|
f.each_line do |l|
/^([0-9a-f]+)\t(\d+)\t(\d+)\t(.+)$/i =~ l
WAZA_LIST.push WazaEntry.new($1.to_i(16), $2.to_i, $3.to_i, $4)
end
end
end
def get_waza_name(waza)
WAZA_LIST[waza].name
end
def get_waza_hit(waza)
WAZA_LIST[waza].hit_odds
end
def num_waza_effect(waza)
e = WAZA_LIST[waza]
return 0 if e.effect_odds == 0
return 2 if 423 <= waza and waza <= 424 # 三色キバ (ほかに追加効果二つある技あったっけ?)
return 1
end
def ok_waza?(waza)
OK_WAZA_EFFECT_CODES.include?(WAZA_LIST[waza].effect_code)
end
class PRNG
A, B = 0x41C64E6D, 0x6073
def initialize(seed)
@seed = seed
end
attr_reader :seed
def rand
@seed = uint(@seed * A + B)
@seed >> 16
end
def step(n)
n = uint(n)
if n < CACHE.size
c = CACHE[n]
@seed = uint(@seed * c.a + c.b)
else
raise "not implemented"
end
end
CACHE = []
Coefficient = Struct.new(:a,:b)
def self.init_cache
c1 = Coefficient.new(A, B)
c = Coefficient.new(1, 0)
256.times do |i|
CACHE[i] = c
c = Coefficient.new(uint(c.a * c1.a), uint(c.b * c1.a + c1.b))
end
end
end
def uint(n)
n & 0xffffffff
end
main() if $0 == __FILE__
0000 0 100 はたく
002B 0 100 からてチョップ
001D 0 85 おうふくビンタ
001D 0 85 れんぞくパンチ
0000 0 85 メガトンパンチ
0022 0 100 ネコにこばん
0004 10 100 ほのおのパンチ
0005 10 100 れいとうパンチ
0006 10 100 かみなりパンチ
0000 0 100 ひっかく
0000 0 100 はさむ
0026 0 30 ハサミギロチン
0027 0 100 かまいたち
0032 0 0 つるぎのまい
0000 0 95 いあいぎり
0095 0 100 かぜおこし
0000 0 100 つばさでうつ
001C 0 100 ふきとばし
009B 0 95 そらをとぶ
002A 0 75 しめつける
0000 0 75 たたきつける
0000 0 100 つるのムチ
0096 30 100 ふみつけ
002C 0 100 にどげり
0000 0 75 メガトンキック
002D 0 95 とびげり
001F 30 85 まわしげり
0017 0 100 すなかけ
001F 30 100 ずつき
0000 0 100 つのでつく
001D 0 85 みだれづき
0026 0 30 つのドリル
0000 0 95 たいあたり
0006 30 100 のしかかり
002A 0 85 まきつく
0030 0 85 とっしん
001B 0 100 あばれる
00C6 0 100 すてみタックル
0013 0 100 しっぽをふる
0002 30 100 どくばり
004D 20 100 ダブルニードル
001D 0 85 ミサイルばり
0013 0 100 にらみつける
001F 30 100 かみつく
0012 0 100 なきごえ
001C 0 100 ほえる
0001 0 55 うたう
0031 0 55 ちょうおんぱ
0082 0 90 ソニックブーム
0056 0 80 かなしばり
0048 10 100 ようかいえき
0004 10 100 ひのこ
0004 10 100 かえんほうしゃ
002E 0 0 しろいきり
0000 0 100 みずでっぽう
0000 0 80 ハイドロポンプ
0101 0 100 なみのり
0005 10 100 れいとうビーム
0104 10 70 ふぶき
004C 10 100 サイケこうせん
0046 10 100 バブルこうせん
0044 10 100 オーロラビーム
0050 0 90 はかいこうせん
0000 0 100 つつく
0000 0 100 ドリルくちばし
0030 0 80 じごくぐるま
00C4 0 100 けたぐり
0059 0 100 カウンター
0057 0 100 ちきゅうなげ
0000 0 100 かいりき
0003 0 100 すいとる
0003 0 100 メガドレイン
0054 0 90 やどりぎのタネ
000D 0 0 せいちょう
002B 0 95 はっぱカッター
0097 0 100 ソーラービーム
0042 0 75 どくのこな
0043 0 75 しびれごな
0001 0 75 ねむりごな
001B 0 100 はなびらのまい
0014 0 95 いとをはく
0029 0 100 りゅうのいかり
002A 0 70 ほのおのうず
0006 10 100 でんきショック
0006 10 100 10まんボルト
0043 0 100 でんじは
0098 30 70 かみなり
0000 0 90 いわおとし
0093 0 100 じしん
0026 0 30 じわれ
0100 0 100 あなをほる
0021 0 85 どくどく
004C 10 100 ねんりき
0048 10 100 サイコキネシス
0001 0 70 さいみんじゅつ
000A 0 0 ヨガのポーズ
0034 0 0 こうそくいどう
0067 0 100 でんこうせっか
0051 0 100 いかり
0099 0 0 テレポート
0057 0 100 ナイトヘッド
0052 0 0 ものまね
003B 0 85 いやなおと
0010 0 0 かげぶんしん
0020 0 0 じこさいせい
000B 0 0 かたくなる
006C 0 0 ちいさくなる
0017 0 100 えんまく
0031 0 100 あやしいひかり
000B 0 0 からにこもる
009C 0 0 まるくなる
0033 0 0 バリアー
0023 0 0 ひかりのかべ
0019 0 0 くろいきり
0041 0 0 リフレクター
002F 0 0 きあいだめ
001A 0 0 がまん
0053 0 0 ゆびをふる
0009 0 0 オウムがえし
0007 0 100 じばく
0000 0 75 タマゴばくだん
0006 30 100 したでなめる
0002 40 70 スモッグ
0002 30 100 ヘドロこうげき
001F 10 85 ホネこんぼう
0004 10 85 だいもんじ
001F 20 100 たきのぼり
002A 0 75 からではさむ
0011 0 0 スピードスター
0091 100 100 ロケットずつき
001D 0 100 とげキャノン
0046 10 100 からみつく
0036 0 0 ドわすれ
0017 0 80 スプーンまげ
0020 0 0 タマゴうみ
002D 0 90 とびひざげり
0043 0 75 へびにらみ
0008 0 100 ゆめくい
0042 0 55 どくガス
001D 0 85 たまなげ
0003 0 100 きゅうけつ
0001 0 75 あくまのキッス
004B 30 90 ゴッドバード
0039 0 0 へんしん
0046 10 100 あわ
004C 20 100 ピヨピヨパンチ
0001 0 100 キノコのほうし
0017 0 100 フラッシュ
0058 0 80 サイコウェーブ
0055 0 0 はねる
0033 0 0 とける
002B 0 85 クラブハンマー
0007 0 100 だいばくはつ
001D 0 80 みだれひっかき
002C 0 90 ホネブーメラン
0025 0 0 ねむる
001F 30 90 いわなだれ
001F 10 90 ひっさつまえば
000A 0 0 かくばる
001E 0 0 テクスチャー
0024 20 100 トライアタック
0028 0 90 いかりのまえば
002B 0 100 きりさく
004F 0 0 みがわり
00FE 0 0 わるあがき
005F 0 0 スケッチ
0068 0 90 トリプルキック
0069 0 100 どろぼう
006A 0 0 クモのす
005E 0 0 こころのめ
006B 0 100 あくむ
007D 10 100 かえんぐるま
005C 30 100 いびき
006D 0 0 のろい
0063 0 100 じたばた
005D 0 0 テクスチャー2
002B 0 95 エアロブラスト
003C 0 85 わたほうし
0063 0 100 きしかいせい
0064 0 100 うらみ
0005 10 100 こなゆき
006F 0 0 まもる
0067 0 100 マッハパンチ
003C 0 90 こわいかお
0011 0 0 だましうち
0031 0 75 てんしのキッス
008E 0 0 はらだいこ
0002 30 100 ヘドロばくだん
0049 100 100 どろかけ
0049 50 85 オクタンほう
0070 0 0 まきびし
0006 100 50 でんじほう
0071 0 0 みやぶる
0062 0 0 みちづれ
0072 0 0 ほろびのうた
0046 100 95 こごえるかぜ
006F 0 0 みきり
001D 0 80 ボーンラッシュ
005E 0 0 ロックオン
001B 0 100 げきりん
0073 0 0 すなあらし
0003 0 100 ギガドレイン
0074 0 0 こらえる
003A 0 100 あまえる
0075 0 90 ころがる
0065 0 100 みねうち
0076 0 90 いばる
0020 0 0 ミルクのみ
0006 30 100 スパーク
0077 0 95 れんぞくぎり
008A 10 90 はがねのつばさ
006A 0 0 くろいまなざし
0078 0 100 メロメロ
0061 0 0 ねごと
0066 0 0 いやしのすず
0079 0 100 おんがえし
007A 0 90 プレゼント
007B 0 100 やつあたり
007C 0 0 しんぴのまもり
005B 0 0 いたみわけ
007D 50 95 せいなるほのお
007E 0 100 マグニチュード
004C 100 50 ばくれつパンチ
0000 0 85 メガホーン
0006 30 100 りゅうのいぶき
007F 0 0 バトンタッチ
005A 0 100 アンコール
0080 0 100 おいうち
0081 0 100 こうそくスピン
0018 0 100 あまいかおり
0045 30 75 アイアンテール
008B 10 95 メタルクロー
004E 0 0 あてみなげ
0084 0 0 あさのひざし
0084 0 0 こうごうせい
0084 0 0 つきのひかり
0087 0 100 めざめるパワー
002B 0 80 クロスチョップ
0092 20 100 たつまき
0088 0 0 あまごい
0089 0 0 にほんばれ
0045 20 100 かみくだく
0090 0 100 ミラーコート
008F 0 0 じこあんじ
0067 0 100 しんそく
008C 10 100 げんしのちから
0048 20 100 シャドーボール
0094 0 90 みらいよち
0045 50 100 いわくだき
0105 0 70 うずしお
009A 0 100 ふくろだたき
009E 100 100 ねこだまし
009F 0 100 さわぐ
00A0 0 0 たくわえる
00A1 0 100 はきだす
00A2 0 0 のみこむ
0004 10 90 ねっぷう
00A4 0 0 あられ
00A5 0 100 いちゃもん
00A6 0 100 おだてる
00A7 0 75 おにび
00A8 0 100 おきみやげ
00A9 0 100 からげんき
00AA 0 100 きあいパンチ
00AB 0 100 きつけ
00AC 0 0 このゆびとまれ
00AD 0 0 しぜんのちから
00AE 0 0 じゅうでん
00AF 0 100 ちょうはつ
00B0 0 0 てだすけ
00B1 0 100 トリック
00B2 0 0 なりきり
00B3 0 0 ねがいごと
00B4 0 0 ねこのて
00B5 0 0 ねをはる
00B6 0 100 ばかぢから
00B7 0 0 マジックコート
00B8 0 0 リサイクル
00B9 0 100 リベンジ
00BA 0 100 かわらわり
00BB 0 0 あくび
00BC 0 100 はたきおとす
00BD 0 100 がむしゃら
00BE 0 100 ふんか
00BF 0 0 スキルスワップ
00C0 0 0 ふういん
00C1 0 0 リフレッシュ
00C2 0 0 おんねん
00C3 0 0 よこどり
00C5 30 100 ひみつのちから
00FF 0 100 ダイビング
001D 0 100 つっぱり
00D5 0 0 ほごしょく
0035 0 0 ほたるび
0048 50 100 ラスターパージ
0047 50 100 ミストボール
003A 0 100 フェザーダンス
00C7 0 100 フラフラダンス
00C8 10 90 ブレイズキック
00C9 0 0 どろあそび
0075 0 90 アイスボール
001F 30 100 ニードルアーム
0020 0 0 なまける
0000 0 100 ハイパーボイス
00CA 30 100 どくどくのキバ
0045 50 95 ブレイククロー
0050 0 90 ブラストバーン
0050 0 90 ハイドロカノン
008B 20 85 コメットパンチ
001F 30 100 おどろかす
00CB 0 100 ウェザーボール
0066 0 0 アロマセラピー
003E 0 100 うそなき
002B 0 95 エアカッター
00CC 100 90 オーバーヒート
0071 0 0 かぎわける
0046 100 80 がんせきふうじ
008C 10 100 ぎんいろのかぜ
003E 0 85 きんぞくおん
0001 0 55 くさぶえ
00CD 0 100 くすぐる
00CE 0 0 コスモパワー
00BE 0 100 しおふき
004C 10 100 シグナルビーム
0011 0 0 シャドーパンチ
001F 10 100 じんつうりき
00CF 0 90 スカイアッパー
002A 0 70 すなじごく
0026 0 30 ぜったいれいど
0049 30 85 だくりゅう
001D 0 100 タネマシンガン
0011 0 0 つばめがえし
001D 0 100 つららばり
0033 0 0 てっぺき
006A 0 0 とおせんぼう
000A 0 0 とおぼえ
0000 0 100 ドラゴンクロー
0050 0 90 ハードプラント
00D0 0 0 ビルドアップ
0107 30 85 とびはねる
0046 100 95 マッドショット
00D1 10 100 ポイズンテール
0069 0 100 ほしがる
0106 10 100 ボルテッカー
0011 0 0 マジカルリーフ
00D2 0 0 みずあそび
00D3 0 0 めいそう
002B 0 100 リーフブレード
00D4 0 0 りゅうのまい
001D 0 80 ロックブラスト
0011 0 0 でんげきは
004C 20 100 みずのはどう
0094 0 85 はめつのねがい
00CC 100 90 サイコブースト
00D6 0 0 はねやすめ
00D7 0 0 じゅうりょく
00D8 0 0 ミラクルアイ
00D9 0 100 めざましビンタ
00DA 0 90 アームハンマー
00DB 0 100 ジャイロボール
00DC 0 0 いやしのねがい
00DD 0 100 しおみず
00DE 0 100 しぜんのめぐみ
00DF 0 100 フェイント
00E0 0 100 ついばむ
00E1 0 0 おいかぜ
00E2 0 0 つぼをつく
00E3 0 100 メタルバースト
00E4 0 100 とんぼがえり
00E5 0 100 インファイト
00E6 0 100 しっぺがえし
00E7 0 100 ダメおし
00E8 0 100 さしおさえ
00E9 0 100 なげつける
00EA 0 90 サイコシフト
00EB 0 0 きりふだ
00EC 0 100 かいふくふうじ
00ED 0 100 しぼりとる
00EE 0 0 パワートリック
00EF 0 100 いえき
00F0 0 0 おまじない
00F1 0 0 さきどり
00F2 0 0 まねっこ
00F3 0 0 パワースワップ
00F4 0 0 ガードスワップ
00F5 0 100 おしおき
00F6 0 100 とっておき
00F7 0 100 なやみのタネ
00F8 0 100 ふいうち
00F9 0 0 どくびし
00FA 0 0 ハートスワップ
00FB 0 0 アクアリング
00FC 0 0 でんじふゆう
00FD 10 100 フレアドライブ
0006 30 100 はっけい
0011 0 0 はどうだん
0034 0 0 ロックカット
0002 30 100 どくづき
001F 20 100 あくのはどう
002B 0 100 つじぎり
0000 0 90 アクアテール
0000 0 100 タネばくだん
001F 30 95 エアスラッシュ
0000 0 100 シザークロス
0048 10 100 むしのさざめき
0000 0 100 りゅうのはどう
001F 20 75 ドラゴンダイブ
0000 0 100 パワージェム
0003 0 100 ドレインパンチ
0067 0 100 しんくうは
0048 10 70 きあいだま
0048 10 100 エナジーボール
00C6 0 100 ブレイブバード
0048 10 100 だいちのちから
00B1 0 100 すりかえ
0050 0 90 ギガインパクト
0035 0 0 わるだくみ
0067 0 100 バレットパンチ
00B9 0 100 ゆきなだれ
0067 0 100 こおりのつぶて
002B 0 100 シャドークロー
0113 10 95 かみなりのキバ
0112 10 95 こおりのキバ
0111 10 95 ほのおのキバ
0067 0 100 かげうち
0049 30 85 どろばくだん
002B 0 100 サイコカッター
001F 20 90 しねんのずつき
0049 30 85 ミラーショット
0048 10 100 ラスターカノン
004C 20 85 ロッククライム
0102 0 0 きりばらい
0103 0 0 トリックルーム
00CC 100 90 りゅうせいぐん
0006 30 100 ほうでん
0004 30 100 ふんえん
00CC 100 90 リーフストーム
0000 0 85 パワーウィップ
0050 0 90 がんせきほう
00D1 10 100 クロスポイズン
0002 30 70 ダストシュート
001F 30 100 アイアンヘッド
0011 0 0 マグネットボム
002B 0 80 ストーンエッジ
0109 0 100 ゆうわく
010A 0 0 ステルスロック
00C4 0 100 くさむすび
010B 0 100 おしゃべり
010C 0 100 さばきのつぶて
00E0 0 100 むしくい
0114 70 90 チャージビーム
00C6 0 100 ウッドハンマー
0067 0 100 アクアジェット
002B 0 100 こうげきしれい
00CE 0 0 ぼうぎょしれい
0020 0 0 かいふくしれい
010D 0 80 もろはのずつき
002C 0 90 ダブルアタック
0050 0 90 ときのほうこう
002B 0 95 あくうせつだん
010E 0 0 みかづきのまい
00ED 0 100 にぎりつぶす
002A 0 70 マグマストーム
0001 0 80 ダークホール
010F 40 85 シードフレア
008C 10 100 あやしいかぜ
0110 0 100 シャドーダイブ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment