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