1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2024-12-26 22:56:43 +02:00
ComfyFactorio/maps/biter_battles_v2/biter_raffle.lua
2021-03-24 18:22:45 +01:00

122 lines
3.1 KiB
Lua

--luacheck:ignore
local Public = {}
local math_random = math.random
local math_floor = math.floor
local function get_raffle_table(level, name)
local raffle = {
['small-' .. name] = 1000 - level * 1.75,
['medium-' .. name] = -250 + level * 1.5,
['big-' .. name] = 0,
['behemoth-' .. name] = 0
}
if level > 500 then
raffle['medium-' .. name] = 500 - (level - 500)
raffle['big-' .. name] = (level - 500) * 2
end
if level > 900 then
raffle['behemoth-' .. name] = (level - 900) * 8
end
for k, v in pairs(raffle) do
if raffle[k] < 0 then
raffle[k] = 0
end
end
return raffle
end
local function roll(evolution_factor, name)
local raffle = get_raffle_table(math_floor(evolution_factor * 1000), name)
local max_chance = 0
for k, v in pairs(raffle) do
max_chance = max_chance + v
end
local r = math_random(0, math_floor(max_chance))
local current_chance = 0
for k, v in pairs(raffle) do
current_chance = current_chance + v
if r <= current_chance then
return k
end
end
end
local function get_biter_name(evolution_factor)
return roll(evolution_factor, 'biter')
end
local function get_spitter_name(evolution_factor)
return roll(evolution_factor, 'spitter')
end
local function get_worm_raffle_table(level)
local raffle = {
['small-worm-turret'] = 1000 - level * 1.75,
['medium-worm-turret'] = level,
['big-worm-turret'] = 0,
['behemoth-worm-turret'] = 0
}
if level > 500 then
raffle['medium-worm-turret'] = 500 - (level - 500)
raffle['big-worm-turret'] = (level - 500) * 2
end
if level > 900 then
raffle['behemoth-worm-turret'] = (level - 900) * 3
end
for k, v in pairs(raffle) do
if raffle[k] < 0 then
raffle[k] = 0
end
end
return raffle
end
local function get_worm_name(evolution_factor)
local raffle = get_worm_raffle_table(math_floor(evolution_factor * 1000))
local max_chance = 0
for k, v in pairs(raffle) do
max_chance = max_chance + v
end
local r = math_random(0, math_floor(max_chance))
local current_chance = 0
for k, v in pairs(raffle) do
current_chance = current_chance + v
if r <= current_chance then
return k
end
end
end
local function get_unit_name(evolution_factor)
if math_random(1, 3) == 1 then
return get_spitter_name(evolution_factor)
else
return get_biter_name(evolution_factor)
end
end
local type_functions = {
['spitter'] = get_spitter_name,
['biter'] = get_biter_name,
['mixed'] = get_unit_name,
['worm'] = get_worm_name
}
function Public.roll(entity_type, evolution_factor)
if not entity_type then
return
end
if not type_functions[entity_type] then
return
end
local evo = evolution_factor
if not evo then
evo = game.forces.enemy.evolution_factor
end
return type_functions[entity_type](evo)
end
return Public