Aleksei-bird 7c9c708c92 Первый фикс
Пачки некоторых позиций увеличены
2024-03-01 20:54:33 +03:00

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