Skip to content

Commit

Permalink
Merge pull request #484 from ComfyFactory/robot_limiting
Browse files Browse the repository at this point in the history
robot limiter initial version
  • Loading branch information
Gerkiz authored Nov 8, 2024
2 parents 41a5687 + ca6f242 commit d4f42ab
Showing 1 changed file with 160 additions and 0 deletions.
160 changes: 160 additions & 0 deletions modules/robot_limits.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@

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

0 comments on commit d4f42ab

Please sign in to comment.