spidertron-squad-control/control/player_select.lua

147 lines
5.4 KiB
Lua

--[[ Copyright (c) 2020 npc_strider
* For direct use of code or graphics, credit is appreciated. See LICENSE.txt for more information.
* This mod may contain modified code sourced from base/core Factorio
*
* control/player_select.lua
* Handles selection tools for link and squad select.
--]]
require("control.functions")
require("control.2dvec")
local function messageSpiders(target, s, force, n)
if target.valid then
local pos = target.position
game.forces[force].print({"", "[img=utility/warning_icon] "..n.." spidertrons have been unlinked from a ", target.localised_name, " near [gps="..pos.x..","..pos.y.."]"})
else
local e = FirstValid(s)
if e then
local pos = e.position
game.forces[force].print("[img=utility/warning_icon] "..n.." spidertrons have been unlinked from an entity near [gps="..pos.x..","..pos.y.."]")
else
game.forces[force].print("[img=utility/warning_icon] "..n.." spidertrons have been unlinked from an entity")
end
end
end
local function messageS(target, s, force)
if target.valid then
local pos = target.position
game.forces[force].print({"", "[img=utility/warning_icon] Spidertron squad has been unlinked from ", target.localised_name, " near [gps="..pos.x..","..pos.y.."]"}) -- using force comms because this could be the death of a spidertron, not only removal
else
local e = FirstValid(s)
if e then
local pos = e.position
game.forces[force].print({"", "[img=utility/warning_icon] Spidertron squad has been unlinked from a target near [gps="..pos.x..","..pos.y.."]"})
else
game.forces[force].print({"", "[img=utility/warning_icon] Spidertron squad has been unlinked from a target"})
end
end
end
local function unitNumbers(entities)
local ids = {}
for i = 1, #entities do
ids[#ids+1] = entities[i].unit_number
end
return ids
end
function SpiderDeSelect(spiders, force)
local ids = unitNumbers(spiders)
local t = global.spidercontrol_linked_s
local rem_t = {} --This part is really bad - I think it's O(N^3) worst case?
for i = 1, #t do
if (t[i].force == force and #ids > 0) then
local s = t[i].s
local rem_s = {}
for j = 1, #s do
local rem_id = {}
for k = 1, #ids do
if (ids[k] == s[j].spider.unit_number) then
s[j].spider.autopilot_destination = nil
rem_id[#rem_id+1] = k
rem_s[#rem_s+1] = j
end
end
if (#rem_id > 0) then
ids = Remove(ids, rem_id)
if (#ids == 0) then
break
end
end
end
if (#rem_s > 0) then
local force = t[i].force
local target = t[i].target
for x = 1, #rem_s do
rendering.destroy(s[rem_s[x]].sprite)
end
s = Remove(s, rem_s)
messageSpiders(target, s, force, #rem_s)
if (#s == 0) then
rem_t[#rem_t+1] = i
messageS(target, s, force)
else
global.spidercontrol_linked_s[i].s = s
end
end
if (#ids == 0) then
break
end
end
end
if (#rem_t > 0) then -- Need to remove sprite
for x = 1, #rem_t do
rendering.destroy(t[rem_t[x]].sprite)
end
global.spidercontrol_linked_s = Remove(global.spidercontrol_linked_s, rem_t)
end
end
local function spiderSelect(spiders, index)
local player = game.players[index]
local mean = IJMeanEntity(spiders)
global.spidercontrol_player_s[index].active = {}
SpiderDeSelect(spiders, player.force.index) -- TO prevent double-linking (linking the same spider to 2 or more entities)
if SPIDERTRON_WAYPOINTS then
for i = 1, #spiders do
remote.call("SpidertronWaypoints", "clear_waypoints", spiders[i].unit_number)
spiders[i].autopilot_destination = nil
end
end
-- spiderDeSelectPlayers(spiders, player.force.index) -- Y'know what, not sure if i can be arsed to deselect player squads...
for i=1, #spiders do
table.insert(global.spidercontrol_player_s[index].active, {
spider = spiders[i],
delta = IJDelta(mean, spiders[i].position)
})
end
if GiveStack(player, {name="squad-spidertron-remote",count=1}) then
player.cursor_stack.connected_entity=spiders[1]
end
end
local function areaSelection(event)
local index = event.player_index
local spiders = event.entities -- We're only selecting spiders from our force (due to force filter)
local item = event.item
if #spiders > 0 then
if item == "squad-spidertron-remote-sel" then
spiderSelect(spiders, index)
UpdateGuiList(game.players[index])
elseif item == "squad-spidertron-unlink-tool" then
SpiderDeSelect(spiders, spiders[1].force.index)
UpdateGuiList(game.players[index])
end
end
end
script.on_event(defines.events.on_player_alt_selected_area, areaSelection)
script.on_event(defines.events.on_player_selected_area, areaSelection)