anchor.diff:  	smoothing_flags = SMOOTH_BITMASK
   	smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS)
   	canSmoothWith = list(SMOOTH_GROUP_ALIEN_WEEDS, SMOOTH_GROUP_WALLS)
  -	var/last_expand = 0 //last world.time this weed expanded
  -	var/growth_cooldown_low = 150
  -	var/growth_cooldown_high = 200
  -	var/static/list/blacklisted_turfs
  -
  +	///the range of the weeds going to be affected by the node
  +	var/node_range = NODERANGE
  +	///the parent node that will determine if we grow or die
  +	var/obj/structure/alien/weeds/node/parent_node
  +	///the list of turfs that the weeds will not be able to grow over
  +	var/static/list/blacklisted_turfs = list(
  +		/turf/open/space,
  +		/turf/open/chasm,
  +		/turf/open/lava,
  +		/turf/open/water,
  +		/turf/open/openspace,
  +	)
   
   /obj/structure/alien/weeds/Initialize(mapload)
  +	//so the sprites line up right in the map editor
   	pixel_x = -4
  -	pixel_y = -4 //so the sprites line up right in the map editor
  -
  -	. = ..()
  -
  -	if(!blacklisted_turfs)
  -		blacklisted_turfs = typecacheof(list(
  -			/turf/open/space,
  -			/turf/open/chasm,
  -			/turf/open/lava,
  -			/turf/open/openspace))
  +	pixel_y = -4
  +
  +	. = ..()
   
   	set_base_icon()
   
  -	last_expand = world.time + rand(growth_cooldown_low, growth_cooldown_high)
   	AddElement(/datum/element/atmos_sensitive, mapload)
   
  +/obj/structure/alien/weeds/Destroy()
  +	if(parent_node)
  +		UnregisterSignal(parent_node, COMSIG_PARENT_QDELETING)
  +		parent_node = null
  +	return ..()
   
   ///Randomizes the weeds' starting icon, gets redefined by children for them not to share the behavior.
   /obj/structure/alien/weeds/proc/set_base_icon()
  
positive.code: 			base_icon_state = "weeds3"
  	set_smoothed_icon_state(smoothing_junction)
  
  /obj/structure/alien/weeds/proc/expand()
  	var/turf/U = get_turf(src)
  	if(is_type_in_typecache(U, blacklisted_turfs))
  		qdel(src)
  		return FALSE
  
  	for(var/turf/T in U.get_atmos_adjacent_turfs())
  		if(locate(/obj/structure/alien/weeds) in T)
  			continue
  
  		if(is_type_in_typecache(T, blacklisted_turfs))
  			continue
  
  		new /obj/structure/alien/weeds(T)
  	return TRUE
  
  /obj/structure/alien/weeds/should_atmos_process(datum/gas_mixture/air, exposed_temperature)
  	return exposed_temperature > 300
  
negative.code: 	base_icon_state = "weednode"
  	light_color = LIGHT_COLOR_BLUE
  	light_power = 0.5
  	///the range of the light for the node
  	var/lon_range = 4
  	///the minimum time it takes for another weed to spread from this one
  	var/minimum_growtime = 5 SECONDS
  	///the maximum time it takes for another weed to spread from this one
  	var/maximum_growtime = 10 SECONDS
  	//the cooldown between each growth
  	COOLDOWN_DECLARE(growtime)
  
  /obj/structure/alien/weeds/node/Initialize(mapload)
  	. = ..()
  
  	//give it light
  	set_light(lon_range)
  
  	//we are the parent node
  	parent_node = src
  
  	//destroy any non-node weeds on turf
  	var/obj/structure/alien/weeds/check_weed = locate(/obj/structure/alien/weeds) in loc
  	if(check_weed && check_weed != src)
  		qdel(check_weed)
  
  	//start the cooldown
  	COOLDOWN_START(src, growtime, rand(minimum_growtime, maximum_growtime))
  
  	//start processing
  	START_PROCESSING(SSobj, src)
  
  /obj/structure/alien/weeds/node/Destroy()
  	STOP_PROCESSING(SSobj, src)
  	return ..()
  
  /obj/structure/alien/weeds/node/process()
  	//we need to have a cooldown, so check and then add
  	if(!COOLDOWN_FINISHED(src, growtime))
  		return
  	COOLDOWN_START(src, growtime, rand(minimum_growtime, maximum_growtime))
  	//attempt to grow all weeds in range
  	for(var/obj/structure/alien/weeds/growing_weed in range(node_range, src))
  		growing_weed.try_expand()
  
  /obj/structure/alien/weeds/node/set_base_icon()
  	return //No icon randomization at init. The node's icon is already well defined.
  