mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 02:09:41 +00:00
Co-authored-by: Guti <32563288+TheCaramelion@users.noreply.github.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
60 lines
1.9 KiB
Plaintext
60 lines
1.9 KiB
Plaintext
/datum/component/swarming
|
|
var/offset_x = 0
|
|
var/offset_y = 0
|
|
var/is_swarming = FALSE
|
|
var/list/swarm_members = list()
|
|
var/static/list/swarming_loc_connections = list(
|
|
COMSIG_ATOM_EXITED = PROC_REF(leave_swarm),
|
|
COMSIG_ATOM_ENTERED = PROC_REF(join_swarm)
|
|
)
|
|
|
|
|
|
/datum/component/swarming/Initialize(max_x = 24, max_y = 24)
|
|
if(!ismovable(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
offset_x = rand(-max_x, max_x)
|
|
offset_y = rand(-max_y, max_y)
|
|
|
|
AddComponent(/datum/component/connect_loc_behalf, parent, swarming_loc_connections)
|
|
|
|
/datum/component/swarming/Destroy()
|
|
for(var/other in swarm_members)
|
|
var/datum/component/swarming/other_swarm = other
|
|
other_swarm.swarm_members -= src
|
|
if(!length(other_swarm.swarm_members))
|
|
other_swarm.unswarm()
|
|
swarm_members = null
|
|
return ..()
|
|
|
|
/datum/component/swarming/proc/join_swarm(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs)
|
|
var/datum/component/swarming/other_swarm = arrived.GetComponent(/datum/component/swarming)
|
|
if(!other_swarm)
|
|
return
|
|
swarm()
|
|
swarm_members |= other_swarm
|
|
other_swarm.swarm()
|
|
other_swarm.swarm_members |= src
|
|
|
|
/datum/component/swarming/proc/leave_swarm(datum/source, atom/movable/gone, direction)
|
|
var/datum/component/swarming/other_swarm = gone.GetComponent(/datum/component/swarming)
|
|
if(!other_swarm || !(other_swarm in swarm_members))
|
|
return
|
|
swarm_members -= other_swarm
|
|
if(!length(swarm_members))
|
|
unswarm()
|
|
other_swarm.swarm_members -= src
|
|
if(!length(other_swarm.swarm_members))
|
|
other_swarm.unswarm()
|
|
|
|
/datum/component/swarming/proc/swarm()
|
|
var/atom/movable/owner = parent
|
|
if(!is_swarming)
|
|
is_swarming = TRUE
|
|
animate(owner, pixel_x = owner.pixel_x + offset_x, pixel_y = owner.pixel_y + offset_y, time = 2)
|
|
|
|
/datum/component/swarming/proc/unswarm()
|
|
var/atom/movable/owner = parent
|
|
if(is_swarming)
|
|
animate(owner, pixel_x = owner.pixel_x - offset_x, pixel_y = owner.pixel_y - offset_y, time = 2)
|
|
is_swarming = FALSE
|