58 lines
1.5 KiB
Lua
58 lines
1.5 KiB
Lua
function getPossibleBiters(curve, evo)
|
|
local ret = {}
|
|
local totalWeight = 0
|
|
for _,entry in pairs(curve) do
|
|
local biter = entry.unit
|
|
local vals = entry.spawn_points -- eg "{0.5, 0.0}, {1.0, 0.4}"
|
|
for idx = 1,#vals do
|
|
local point = vals[idx]
|
|
local ref = point.evolution_factor
|
|
local chance = point.weight
|
|
if evo >= ref then
|
|
local interp = 0
|
|
if idx == #vals then
|
|
interp = chance
|
|
else
|
|
interp = chance+(vals[idx+1].weight-chance)*(vals[idx+1].evolution_factor-ref)
|
|
end
|
|
if interp > 0 then
|
|
table.insert(ret, {biter, interp+totalWeight})
|
|
totalWeight = totalWeight+interp
|
|
--game.print("Adding " .. biter .. " with weight " .. interp)
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
--game.print("Fake Evo " .. evo)
|
|
--for i=1,#ret do game.print(ret[i][1] .. ": " .. ((i == 1 and 0 or ret[i-1][2]) .. " -> " .. ret[i][2])) end
|
|
return ret, totalWeight
|
|
end
|
|
|
|
function selectWeightedBiter(biters, total)
|
|
local f = math.random()*total
|
|
local ret = "nil"
|
|
local smallest = 99999999
|
|
for i = 1,#biters do
|
|
if f <= biters[i][2] and smallest > biters[i][2] then
|
|
smallest = biters[i][2]
|
|
ret = biters[i][1]
|
|
end
|
|
end
|
|
--game.print("Selected " .. ret .. " with " .. f .. " / " .. total)
|
|
return ret
|
|
end
|
|
|
|
function getSpawnedBiter(curve, evo)
|
|
--game.print("Real Evo " .. evo)
|
|
if math.random() < 0.5 then
|
|
evo = evo-0.1
|
|
end
|
|
if math.random() < 0.25 then
|
|
evo = evo-0.1
|
|
end
|
|
evo = math.max(evo, 0)
|
|
local biters, total = getPossibleBiters(curve, evo)
|
|
return selectWeightedBiter(biters, total)
|
|
end
|