mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-14 10:13:13 +02:00
169 lines
4.7 KiB
Lua
169 lines
4.7 KiB
Lua
local Event = require 'utils.event'
|
|
local Task = require 'utils.Task'
|
|
local Token = require 'utils.global_token'
|
|
local Global = require 'utils.global'
|
|
|
|
local no_coin_entity = {}
|
|
|
|
Global.register(
|
|
{no_coin_entity = no_coin_entity},
|
|
function(tbl)
|
|
no_coin_entity = tbl.no_coin_entity
|
|
end
|
|
)
|
|
|
|
local entity_drop_amount = {
|
|
--[[['small-biter'] = {low = -62, high = 1},
|
|
['small-spitter'] = {low = -62, high = 1},
|
|
['medium-biter'] = {low = -14, high = 1},
|
|
['medium-spitter'] = {low = -14, high = 1},
|
|
['big-biter'] = {low = -2, high = 1},
|
|
['big-spitter'] = {low = -2, high = 1},
|
|
['behemoth-biter'] = {low = 1, high = 1},
|
|
['behemoth-spitter'] = {low = 1, high = 1}, ]]
|
|
['biter-spawner'] = {low = 5, high = 15},
|
|
['spitter-spawner'] = {low = 5, high = 15},
|
|
['small-worm-turret'] = {low = 2, high = 8},
|
|
['medium-worm-turret'] = {low = 5, high = 15},
|
|
['big-worm-turret'] = {low = 10, high = 20}
|
|
}
|
|
|
|
local spill_items =
|
|
Token.register(
|
|
function(data)
|
|
local stack = {name = 'coin', count = data.count}
|
|
data.surface.spill_item_stack(data.position, stack, true)
|
|
end
|
|
)
|
|
|
|
local entity_spawn_map = {
|
|
['medium-biter'] = 'small-worm-turret',
|
|
['big-biter'] = 'medium-worm-turret',
|
|
['behemoth-biter'] = 'big-worm-turret'
|
|
}
|
|
|
|
local biters = {
|
|
'small-biter',
|
|
'medium-biter',
|
|
'big-biter',
|
|
'behemoth-biter'
|
|
}
|
|
|
|
local spitters = {
|
|
'small-spitter',
|
|
'medium-spitter',
|
|
'big-spitter',
|
|
'behemoth-spitter'
|
|
}
|
|
|
|
local turret_evolution_factor = {
|
|
['gun-turret'] = 0.002,
|
|
['laser-turret'] = 0.004,
|
|
['flamethrower-turret'] = 0.003,
|
|
['artillery-turret'] = 0.008
|
|
}
|
|
|
|
local spawn_worm =
|
|
Token.register(
|
|
function(data)
|
|
local surface = data.surface
|
|
local name = data.name
|
|
local position = data.position
|
|
|
|
local p = surface.find_non_colliding_position(name, position, 8, 1)
|
|
|
|
if p then
|
|
local entity = surface.create_entity({name = data.name, position = data.position})
|
|
no_coin_entity[entity.unit_number] = true
|
|
end
|
|
end
|
|
)
|
|
|
|
local function get_level()
|
|
local ef = game.forces.enemy.evolution_factor
|
|
return math.floor(ef * 4) + 1
|
|
end
|
|
|
|
local spawn_units =
|
|
Token.register(
|
|
function(data)
|
|
local surface = data.surface
|
|
local name = data.name
|
|
local position = data.position
|
|
for _ = 1, 5 do
|
|
local p = surface.find_non_colliding_position(name, position, 8, 1)
|
|
if p then
|
|
surface.create_entity {name = name, position = p}
|
|
end
|
|
end
|
|
end
|
|
)
|
|
|
|
Event.add(
|
|
defines.events.on_entity_died,
|
|
function(event)
|
|
local entity = event.entity
|
|
if not entity or not entity.valid then
|
|
return
|
|
end
|
|
|
|
local name = entity.name
|
|
|
|
local bounds = entity_drop_amount[name]
|
|
if bounds then
|
|
local unit_number = entity.unit_number
|
|
if no_coin_entity[unit_number] then
|
|
no_coin_entity[unit_number] = nil
|
|
else
|
|
local count = math.random(bounds.low, bounds.high)
|
|
|
|
if count > 0 then
|
|
Task.set_timeout_in_ticks(
|
|
1,
|
|
spill_items,
|
|
{count = count, surface = entity.surface, position = entity.position}
|
|
)
|
|
end
|
|
end
|
|
end
|
|
|
|
local spawn = entity_spawn_map[name]
|
|
|
|
if spawn then
|
|
if math.random() <= 0.25 then
|
|
Task.set_timeout_in_ticks(
|
|
1,
|
|
spawn_worm,
|
|
{surface = entity.surface, name = spawn, position = entity.position}
|
|
)
|
|
end
|
|
else
|
|
if name == 'biter-spawner' then
|
|
local unit = biters[get_level()]
|
|
Task.set_timeout_in_ticks(
|
|
10,
|
|
spawn_units,
|
|
{surface = entity.surface, name = unit, position = entity.position}
|
|
)
|
|
elseif name == 'spitter-spawner' then
|
|
local unit = spitters[get_level()]
|
|
Task.set_timeout_in_ticks(
|
|
10,
|
|
spawn_units,
|
|
{surface = entity.surface, name = unit, position = entity.position}
|
|
)
|
|
end
|
|
end
|
|
|
|
local factor = turret_evolution_factor[name]
|
|
if factor then
|
|
local force = entity.force
|
|
if force.name == 'enemy' then
|
|
local old = force.evolution_factor
|
|
local new = old + (1 - old) * factor
|
|
force.evolution_factor = math.min(new, 1)
|
|
end
|
|
end
|
|
end
|
|
)
|