1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-03-17 20:58:13 +02:00
ComfyFactorio/modules/robot_limits.lua
2024-11-07 21:29:30 +01:00

160 lines
4.8 KiB
Lua

local Global = require 'utils.global'
local Event = require 'utils.event'
local Module = {}
local settings = {
enabled = true,
registered_forces = {},
roboport_limit = 50,
logi_robot_limit = 500,
cons_robot_limit = 500,
damage_amount = 10
}
Global.register(
settings,
function(tbl)
settings = tbl
end
)
local function alert(entity)
local messages = {
['roboport'] = 'Too many roboports in the network, they start to deteriorate!',
['logistic-robot'] = 'Too many logistic robots in same network, they collide with each other often!',
['construction-robot'] = 'Too many construction robots in same network, they collide with each other often!',
}
for _, player in pairs(game.connected_players) do
player.add_custom_alert(entity, {type = 'virtual', name = 'signal-deny'}, messages[entity.type], true)
player.play_sound({path = 'utility/alert_destroyed'})
end
end
local function damage_entity(entity)
entity.health = entity.health - settings.damage_amount
if entity.health <= 0 then
alert(entity)
entity.die(entity.force, entity)
end
end
local function restrict_roboports(custom_force)
local force = custom_force or game.forces.player
local surface_networks = force.logistic_networks
for _, surface_network in pairs(surface_networks) do
for _, network in pairs(surface_network) do
if #network.cells > settings.roboport_limit then
for _, cell in pairs(network.cells) do
--cell.owner.active = false -- doesn't currently work REEEEEEEEEEEEEE, can't disable roboports
if math.random(1, 3) == 1 then
damage_entity(cell.owner)
end
end
end
end
end
end
local function restrict_robots(custom_force)
local force = custom_force or game.forces.player
local surface_networks = force.logistic_networks
for _, surface_network in pairs(surface_networks) do
for _, network in pairs(surface_network) do
if network.all_logistic_robots > settings.logi_robot_limit then
for _, robot in pairs(network.logistic_robots) do
--robot.active = false --works but is graphically meh
if math.random(1, 8) == 1 then
damage_entity(robot)
end
end
end
if network.all_construction_robots > settings.cons_robot_limit then
for _, robot in pairs(network.construction_robots) do
--robot.active = false --works but is graphically meh
if math.random(1, 8) == 1 then
damage_entity(robot)
end
end
end
end
end
end
local function do_tick()
if not settings.enabled then return end
for _, force in pairs(settings.registered_forces) do
if force.enabled then
restrict_roboports(force.force)
restrict_robots(force.force)
end
end
end
---Gets the amount of damage dealt per second
function Module.get_damage()
return settings.damage_amount
end
---Sets the amount of damage dealt per second
---@param number integer
function Module.set_damage(number)
settings.damage_amount = number
end
---Gets the limit to number of logistic robots in single network
function Module.get_logistic_robot_limit()
return settings.logi_robot_limit
end
---Sets the limit to number of logistic robots in single network
---@param number integer
function Module.set_logistic_robot_limit(number)
settings.logi_robot_limit = number
end
---Gets the limit to number of construction robots in single network
function Module.get_construction_robot_limit()
return settings.cons_robot_limit
end
---Sets the limit to number of construction robots in single network
---@param number integer
function Module.set_construction_robot_limit(number)
settings.cons_robot_limit = number
end
---Gets the limit to number of roboports in single network
function Module.get_roboport_limit()
return settings.roboport_limit
end
---Sets the limit to number of roboports in single network
---@param number integer
function Module.set_roboport_limit(number)
settings.roboport_limit = number
end
---Enables the module
---@param enabled boolean
function Module.enable(enabled)
settings.enabled = enabled
end
---Register or modify the force to be scanned and modified by this module
---@param force LuaForce
---@param enabled boolean
function Module.register_force(force, enabled)
settings.registered_forces[force.index] = {force = force, enabled = enabled}
end
local function on_init()
Module.register_force(game.forces.player, true)
end
Event.on_init(on_init)
Event.on_nth_tick(60, do_tick)
return Module