2020-11-28 22:31:57 +08:00
--[[ 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 .
--]]
2020-11-28 01:37:34 +08:00
require ( " control.functions " )
require ( " control.2dvec " )
local function messageSpiders ( target , s , force , n )
if target.valid then
local pos = target.position
2020-11-29 13:36:20 +08:00
game.forces [ force ] . print ( { " " , " [img=utility/warning_icon] " .. n .. " spidertrons have been unlinked from a " , target.localised_name , " near [gps= " .. pos.x .. " , " .. pos.y .. " ] " } )
2020-11-28 01:37:34 +08:00
else
local e = FirstValid ( s )
if e then
local pos = e.position
2020-11-29 13:36:20 +08:00
game.forces [ force ] . print ( " [img=utility/warning_icon] " .. n .. " spidertrons have been unlinked from an entity near [gps= " .. pos.x .. " , " .. pos.y .. " ] " )
2020-11-28 01:37:34 +08:00
else
2020-11-29 13:36:20 +08:00
game.forces [ force ] . print ( " [img=utility/warning_icon] " .. n .. " spidertrons have been unlinked from an entity " )
2020-11-28 01:37:34 +08:00
end
end
end
local function messageS ( target , s , force )
if target.valid then
local pos = target.position
2020-11-29 13:36:20 +08:00
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
2020-11-28 01:37:34 +08:00
else
local e = FirstValid ( s )
if e then
local pos = e.position
2020-11-29 13:36:20 +08:00
game.forces [ force ] . print ( { " " , " [img=utility/warning_icon] Spidertron squad has been unlinked from a target near [gps= " .. pos.x .. " , " .. pos.y .. " ] " } )
2020-11-28 01:37:34 +08:00
else
2020-11-29 13:36:20 +08:00
game.forces [ force ] . print ( { " " , " [img=utility/warning_icon] Spidertron squad has been unlinked from a target " } )
2020-11-28 01:37:34 +08:00
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
2020-11-28 22:31:57 +08:00
function SpiderDeSelect ( spiders , force )
2020-11-28 01:37:34 +08:00
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 = { }
2020-11-28 22:31:57 +08:00
SpiderDeSelect ( spiders , player.force . index ) -- TO prevent double-linking (linking the same spider to 2 or more entities)
2020-11-28 01:37:34 +08:00
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
2020-11-28 22:31:57 +08:00
-- spiderDeSelectPlayers(spiders, player.force.index) -- Y'know what, not sure if i can be arsed to deselect player squads...
2020-11-28 01:37:34 +08:00
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 )
2020-11-28 22:31:57 +08:00
UpdateGuiList ( game.players [ index ] )
2020-11-28 01:37:34 +08:00
elseif item == " squad-spidertron-unlink-tool " then
2020-11-28 22:31:57 +08:00
SpiderDeSelect ( spiders , spiders [ 1 ] . force.index )
UpdateGuiList ( game.players [ index ] )
2020-11-28 01:37:34 +08:00
end
end
end
script.on_event ( defines.events . on_player_alt_selected_area , areaSelection )
script.on_event ( defines.events . on_player_selected_area , areaSelection )