mirror of
https://github.com/peter-tanner/spidertron-squad-control.git
synced 2024-11-30 19:10:18 +08:00
147 lines
5.4 KiB
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) |