fortunes_foundation/seeds.lua

55 lines
1.3 KiB
Lua
Raw Permalink Normal View History

2024-02-10 03:21:47 +00:00
seeds={}
add(modules,seeds)
function seeds:init()
2024-02-10 05:05:24 +00:00
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)
2024-02-11 00:35:57 +00:00
self.l7=seed_pool:new(seed_constants.l7_start,seed_constants.l7_end,_delta_4b)
2024-02-10 03:21:47 +00:00
end
function seeds:choose(pool)
2024-02-10 05:05:24 +00:00
if (pool) return self[pool]:choose()
return rnd(5000>>16)
2024-02-10 03:21:47 +00:00
end
seed_pool=klass()
2024-02-10 05:05:24 +00:00
function seed_pool:init(addr_start,addr_end,routine,negencode)
if (negencode) self.neg_max=(%addr_start)>>16 addr_start+=2
2024-02-10 03:21:47 +00:00
local seeds={}
2024-02-10 05:05:24 +00:00
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)
2024-02-10 03:21:47 +00:00
local acc=0
2024-02-10 05:05:24 +00:00
while s < e do
local byte=@s
2024-02-10 03:21:47 +00:00
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
2024-02-10 05:05:24 +00:00
s+=1
end
end
function _naive_16b(seeds,s,e)
while s < e do
add(seeds,%s)
s+=2
2024-02-10 03:21:47 +00:00
end
end