mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-26 22:56:43 +02:00
122 lines
3.1 KiB
Lua
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
|