anchor.diff:  		return FALSE
   	shooter.face_atom(target)
   	var/next_delay = autofire_shot_delay
  +	if(windup_autofire)
  +		next_delay = clamp(next_delay - current_windup_reduction, round(autofire_shot_delay * windup_autofire_cap), autofire_shot_delay)
  +		current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier))
  +		timerid = addtimer(CALLBACK(src, .proc/windup_reset, FALSE), windup_spindown, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE)
   	if(HAS_TRAIT(shooter, TRAIT_DOUBLE_TAP))
   		next_delay = round(next_delay * 0.5)
   	COOLDOWN_START(src, next_shot_cd, next_delay)
  
positive.code: 		return TRUE
  	stop_autofiring()
  	return FALSE
  
  // Gun procs.
  
  
negative.code: 	var/autofire_shot_delay = 0.3 SECONDS //Time between individual shots.
  	var/mouse_status = AUTOFIRE_MOUSEUP //This seems hacky but there can be two MouseDown() without a MouseUp() in between if the user holds click and uses alt+tab, printscreen or similar.
  
  	///windup autofire vars
  	///Whether the delay between shots increases over time, simulating a spooling weapon
  	var/windup_autofire = FALSE
  	///the reduction to shot delay for windup
  	var/current_windup_reduction = 0
  	///the percentage of autfire_shot_delay that is added to current_windup_reduction
  	var/windup_autofire_reduction_multiplier = 0.3
  	///How high of a reduction that current_windup_reduction can reach
  	var/windup_autofire_cap = 0.3
  	///How long it takes for weapons that have spooled-up to reset back to the original firing speed
  	var/windup_spindown = 3 SECONDS
  	///Timer for tracking the spindown reset timings
  	var/timerid
  	COOLDOWN_DECLARE(next_shot_cd)
  
  /datum/component/automatic_fire/Initialize(autofire_shot_delay, windup_autofire, windup_autofire_reduction_multiplier, windup_autofire_cap, windup_spindown)
  	. = ..()
  	if(!isgun(parent))
  		return COMPONENT_INCOMPATIBLE
  	var/obj/item/gun = parent
  	RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/wake_up)
  	if(autofire_shot_delay)
  		src.autofire_shot_delay = autofire_shot_delay
  	if(windup_autofire)
  		src.windup_autofire = windup_autofire
  		src.windup_autofire_reduction_multiplier = windup_autofire_reduction_multiplier
  		src.windup_autofire_cap = windup_autofire_cap
  		src.windup_spindown = windup_spindown
  	if(autofire_stat == AUTOFIRE_STAT_IDLE && ismob(gun.loc))
  		var/mob/user = gun.loc
  		wake_up(src, user)
  