anchor.diff:  		var/y0 = epicenter.y
   		var/z0 = epicenter.z
   
  -		for(var/turf/T in trange(max_range, epicenter))
  +		var/list/affected_turfs = trange(max_range, epicenter)
  +
  +		if(config.reactionary_explosions)
  +			for(var/turf/T in affected_turfs) // we cache the explosion block rating of every turf in the explosion area
  +				cached_exp_block[T] = 0
  +				if(T.density && T.explosion_block)
  +					cached_exp_block[T] += T.explosion_block
  +
  +				for(var/obj/machinery/door/D in T)
  +					if(D.density && D.explosion_block)
  +						cached_exp_block[T] += D.explosion_block
  +
  +				for(var/obj/structure/window/W in T)
  +					if(W.reinf && W.fulltile)
  +						cached_exp_block[T] += W.explosion_block
  +
  +		for(var/turf/T in affected_turfs)
   
   			var/dist = cheap_hypotenuse(T.x, T.y, x0, y0)
   
  
positive.code: 				var/turf/Trajectory = T
  				while(Trajectory != epicenter)
  					Trajectory = get_step_towards(Trajectory, epicenter)
  					if(Trajectory.density && Trajectory.explosion_block)
  						dist += Trajectory.explosion_block
  
  					for(var/obj/machinery/door/D in Trajectory)
  						if(D.density && D.explosion_block)
  							dist += D.explosion_block
  
  					for(var/obj/structure/window/W in Trajectory)
  						if(W.reinf && W.fulltile)
  							dist += W.explosion_block
  
  			var/flame_dist = 0
  			var/throw_dist = dist
  
negative.code: 				if(flame_dist && prob(40) && !istype(T, /turf/space) && !T.density)
  					PoolOrNew(/obj/effect/hotspot, T) //Mostly for ambience!
  				if(dist > 0)
  					T.ex_act(dist)
  
  			//--- THROW ITEMS AROUND ---
  
  