#!/usr/local/bin/ruby # *************************************************************** # * Sega Tetris/FlashPoint/Bloxeed Mino Generator * # * Usage: * # * ruby segatet2.rb T * # * Tetris (large format) (out "tetris_l.txt") * # * ruby segatet2.rb F * # * Flash Point (large format) (out "flashpoint_l.txt") * # * ruby segatet2.rb B * # * Bloxeed (large format) (out "bloxeed_l.txt") * # * ruby segatet2.rb t * # * Tetris (small format) (out "tetris_s.txt") * # * ruby segatet2.rb f * # * Flash Point (small format) (out "flashpoint_s.txt") * # * ruby segatet2.rb b * # * Bloxeed (small format) (out "bloxeed_s.txt") * # * 2022.03.03 * # *************************************************************** case ARGV.shift when "T" then game = "T"; form = "L"; o1file = "tetris_l.txt" when "F" then game = "F"; form = "L"; o1file = "flashpoint_l.txt" when "B" then game = "B"; form = "L"; o1file = "bloxeed_l.txt" when "t" then game = "T"; form = "S"; o1file = "tetris_s.txt" when "f" then game = "F"; form = "S"; o1file = "flashpoint_s.txt" when "b" then game = "B"; form = "S"; o1file = "bloxeed_s.txt" else game = nil end if game == nil STDERR.print " Usage: ruby segatet2.rb T|t|F|f|B|b\n" STDERR.print " T or t for Tetris\n" STDERR.print " F or f for Flash Point\n" STDERR.print " B or b for Bloxeed\n" STDERR.print " capital for large format\n" STDERR.print " small for small format\n" exit end o1f = open(o1file, "w") p o1file if game == "T" then seed = 0x2A6D365A mask = 0x3f loop = 0x40000 # 262144(=0x40000)でミノ周期が一周 # end if game == "F" then seed = 0x2A6D365B mask = 0x3f loop = 0x80000 # 524288(=0x80000)でミノ周期が一周 # end if game == "B" then # ブロックの連続抽選を始める前に必ず 1個 抽選して # # それを使って加工する # # (毎ゲームseedが加工されるので、このプログラムは # # RAMクリア後初回の電源パターンにしか使えない) # # seed0 = 0x2A6D365B # 初期化定数 # # seed1 = 0x8010B493 # 初期化後1個抽選結果 # # seed = (seed0 & 0xffff0000) | seed1 / 0x10000) # # = 0x2A6D8010 seed = 0x2A6D365B mask = 0x7f loop = 0x10000 # 不定 (0x2A6D8010スタートは 65536(=0x10000)) # t0 = seed # ループ内と同じ処理 # t1 = (seed * 0x29) & 0xffffffff # ループ内と同じ処理 # seed = (t1 * 0x10001) & 0xffffffff # ループ内と同じ処理 # seed = (t0 & 0xffff0000) | (seed / 0x10000) zsMask = 0x00700000 # ZとSは、seedの中の3ビットを検査して、Iに書き換える # end # (実験用)2周+1回ループさせてみる # # 大きめに設定して、実際のデータを見て、繰り返し箇所を調べる # # loop = loop * 2 + 1 # (実験用)2周+1回ループさせてみる # for lp in 1..loop do t0 = seed t1 = (seed * 0x29) & 0xffffffff seed = (t1 * 0x10001) & 0xffffffff t2 = ( (t1 / 0x10000) + (t1 % 0x10000) ) | (t0 & 0xffff0000) t3 = (t2 & mask) % 7 case t3 when 0 then mino = "I" when 1 then mino = "Z" when 2 then mino = "S" when 3 then mino = "O" when 4 then mino = "T" when 5 then mino = "L" when 6 then mino = "J" else mino = "ERROR" end # ブロクシード専用 SZ 加工 # if game == "B" then if mino == "Z" || mino == "S" then if seed & zsMask == zsMask then mino = "I" end end end # ブロクシード専用 SZ 加工 # if form == "L" then o1f.printf("%08X %s\n",seed,mino) end if form == "S" then o1f.printf("%s",mino) # 必要なら改行 # # if lp%128==0 then # o1f.printf("\n") # end # 必要なら改行 # end # 進行数表示 # if lp%100000==0 then p lp end # 進行数表示 # end o1f.close ######## url("https://tetris.wiki/Sega_Randomizer") #C.lang# #include #C.lang# #include #C.lang# #C.lang# #define DEFAULT_SEED 0x2A6D365A #C.lang# #define HI(lw) ((lw) & 0xFFFF0000) #C.lang# #define LO(lw) ((lw) & 0xFFFF) #C.lang# #define LW(lw) ((lw) << 16) #C.lang# #define RW(lw) ((lw) >> 16) #C.lang# uint32_t rand(uint32_t *seedp) { #C.lang# uint32_t temp, oldseed; #C.lang# #C.lang# temp = (*seedp == 0u) ? DEFAULT_SEED : *seedp; #C.lang# oldseed = temp; #C.lang# temp *= 41u; #C.lang# *seedp = temp + LW(temp); #C.lang# return (LO(temp) + RW(temp)) | HI(oldseed); #C.lang# } #C.lang# #C.lang# void newsequence(uint8_t *seq, size_t len, uint32_t *seedp) { #C.lang# for (size_t i = 0u; i < len; i++) { #C.lang# seq[i] = (rand(seedp) & 0x3F) % 7; #C.lang# } #C.lang# } #C.lang# #C.lang# void printsequence(uint8_t *seq, size_t len) { #C.lang# for (size_t i = 0u; i < len; i++) { #C.lang# char c; #C.lang# #C.lang# switch (seq[i]) { #C.lang# case 0: c = 'I'; break; #C.lang# case 1: c = 'Z'; break; #C.lang# case 2: c = 'S'; break; #C.lang# case 3: c = 'O'; break; #C.lang# case 4: c = 'T'; break; #C.lang# case 5: c = 'L'; break; #C.lang# case 6: c = 'J'; break; #C.lang# default: c = '?'; break; #C.lang# } #C.lang# putchar(c); #C.lang# } #C.lang# putchar('\n'); #C.lang# }