fortunes_foundation/seeds.lua

55 lines
1.3 KiB
Lua

seeds={}
add(modules,seeds)
function seeds:init()
self.l4=seed_pool:new(seed_constants.l4_start,seed_constants.l4_end,_naive_16b,true)
self.l5=seed_pool:new(seed_constants.l5_start,seed_constants.l5_end,_delta_4b,true)
self.ff=seed_pool:new(seed_constants.ff_start,seed_constants.ff_end,_delta_4b)
self.l7=seed_pool:new(seed_constants.l7_start,seed_constants.l7_end,_delta_4b)
end
function seeds:choose(pool)
if (pool) return self[pool]:choose()
return rnd(5000>>16)
end
seed_pool=klass()
function seed_pool:init(addr_start,addr_end,routine,negencode)
if (negencode) self.neg_max=(%addr_start)>>16 addr_start+=2
local seeds={}
routine(seeds,addr_start,addr_end)
self.seeds=seeds
self.is_seed={}
for s in all(seeds) do
self.is_seed[s] = true
end
end
function seed_pool:choose()
if self.neg_max then
while true do
local r = rnd(self.neg_max)
if (not self.is_seed[r]) return r
end
end
return rnd(self.seeds)
end
function _delta_4b(seeds,s,e)
local acc=0
while s < e do
local byte=@s
local nb0=byte>>20
local nb1=(byte&0xf)>>16
if nb0==0 then acc+=0x0.000f else acc+=nb0 add(seeds,acc) end
if nb1==0 then acc+=0x0.000f else acc+=nb1 add(seeds,acc) end
s+=1
end
end
function _naive_16b(seeds,s,e)
while s < e do
add(seeds,%s)
s+=2
end
end