#!/usr/local/bin/ruby # *************************************** # * Sega Bloxeed Mino Generator * # * Usage: * # * ruby segablox.rb [n] * # * "n" is times already pulled * # * 2022.03.09 * # *************************************** pulled = ARGV.shift case pulled when NilClass then pulled = 0 when String then pulled = pulled.to_i(0) end o1file = "blox_" + pulled.to_s(10) + "(0x" + pulled.to_s(16) + ").txt" o1f = open(o1file, "w") p o1file form = "L" # form = "S" seed = 0x2A6D365B loop = pulled # 消費済みメイン乱数 # for lp in 1..loop do # t0 = seed # 2番目のループ内と同じ処理 # t1 = (seed * 0x29) & 0xffffffff # 2番目のループ内と同じ処理 # seed = (t1 * 0x10001) & 0xffffffff # 2番目のループ内と同じ処理 # end # 消費済みメイン乱数 # # ミノ発生前処理 # t0 = seed # 2番目のループ内と同じ処理 # t1 = (seed * 0x29) & 0xffffffff # 2番目のループ内と同じ処理 # seed = (t1 * 0x10001) & 0xffffffff # 2番目のループ内と同じ処理 # seed = (t0 & 0xffff0000) | (seed / 0x10000) # ミノ発生前処理 # mask = 0x7f zsMask = 0x00700000 # ZとSは、seedの中の3ビットを検査して、Iに書き換える # loop = 2000 # 出力個数 # 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 mino == "Z" || mino == "S" then if seed & zsMask == zsMask then mino = "I" 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# }