anchor.diff:  	if(QDELETED(src))
   		return
   
  -	heavy_ex_range = max(heavy_ex_range - 1, 0)
  -	medium_ex_range = max(medium_ex_range - 1, 0)
  -	light_ex_range = max(light_ex_range - 1, 0)
  -
  -	if(heavy_ex_range)
  -		SSexplosions.highturf += loc
  +	var/decrement = 1
  +	var/atom/location = loc
  +	if (reactionary)
  +		if(location.density || !isturf(location))
  +			decrement += location.explosion_block
  +		for(var/obj/thing in location)
  +			if (thing == src)
  +				continue
  +			var/the_block = thing.explosion_block
  +			decrement += the_block == EXPLOSION_BLOCK_PROC ? thing.GetExplosionBlock() : the_block
  +
  +	range = max(range - decrement + 1, 0) // Already decremented by 1 in the parent. Exists so that if we pass through something with negative block it extends the range.
  +	heavy_ex_range = max(heavy_ex_range - decrement, 0)
  +	medium_ex_range = max(medium_ex_range - decrement, 0)
  +	light_ex_range = max(light_ex_range - decrement, 0)
  +
  +	if (heavy_ex_range)
  +		SSexplosions.highturf += location
   	else if(medium_ex_range)
  -		SSexplosions.medturf += loc
  +		SSexplosions.medturf += location
   	else if(light_ex_range)
  -		SSexplosions.lowturf += loc
  +		SSexplosions.lowturf += location
   	else
   		qdel(src)
   		return
  
positive.code: 	var/medium_ex_range = 0
  	/// The maximum distance this will inflict [EXPLODE_LIGHT]
  	var/light_ex_range = 0
  
  /obj/projectile/blastwave/Initialize(mapload, heavy_ex_range, medium_ex_range, light_ex_range)
  	range = max(heavy_ex_range, medium_ex_range, light_ex_range, 0)
  	src.heavy_ex_range = heavy_ex_range
  	src.medium_ex_range = medium_ex_range
  	src.light_ex_range = light_ex_range
  	return ..()
  
  /obj/projectile/blastwave/Range()
  
negative.code: /obj/projectile/blastwave/ex_act()
  	return FALSE
  
  #undef BLASTCANNON_RANGE_EXP
  #undef BLASTCANNON_RANGE_SCALE
  