anchor.diff:  	add_fingerprint(user)
   	return
   
  +/obj/item/clothing/suit/armor/reactive/hit_reaction(owner, hitby, attack_text, final_block_chance, damage, attack_type)
  +	if(!active || !prob(hit_reaction_chance))
  +		return FALSE
  +	if(world.time < reactivearmor_cooldown)
  +		cooldown_activation(owner)
  +		return FALSE
  +	if(bad_effect)
  +		return emp_activation(owner, hitby, attack_text, final_block_chance, damage, attack_type)
  +	else
  +		return reactive_activation(owner, hitby, attack_text, final_block_chance, damage, attack_type)
  +
  +/**
  + * A proc for doing cooldown effects (like the sparks on the tesla armor, or the semi-stealth on stealth armor)
  + * Called from the suit activating whilst on cooldown.
  + * You should be calling ..()
  + */
  +/obj/item/clothing/suit/armor/reactive/proc/cooldown_activation(mob/living/carbon/human/owner)
  +	owner.visible_message(cooldown_message)
  +
  +/**
  + * A proc for doing reactive armor effects.
  + * Called from the suit activating while off cooldown, with no emp.
  + * Returning TRUE will block the attack that triggered this
  + */
  +/obj/item/clothing/suit/armor/reactive/proc/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  +	owner.visible_message("<span class='danger'>The reactive armor doesn't do much! No surprises here.</span>")
  +	return TRUE
  +
  +/**
  + * A proc for doing owner unfriendly reactive armor effects.
  + * Called from the suit activating while off cooldown, while the armor is still suffering from the effect of an EMP.
  + * Returning TRUE will block the attack that triggered this
  + */
  +/obj/item/clothing/suit/armor/reactive/proc/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  +	owner.visible_message("<span class='danger'>The reactive armor doesn't do much, despite being emp'd! Besides giving off a special message, of course.</span>")
  +	return TRUE
  +
   /obj/item/clothing/suit/armor/reactive/emp_act(severity)
   	. = ..()
  -	if(. & EMP_PROTECT_SELF)
  +	if(. & EMP_PROTECT_SELF || bad_effect || !active) //didn't get hit or already emp'd, or off
   		return
  -	active = FALSE
  -	icon_state = "reactiveoff"
  -	inhand_icon_state = "reactiveoff"
  -	reactivearmor_cooldown = world.time + 200
  +	visible_message(emp_message)
  +	bad_effect = TRUE
  +	addtimer(VARSET_CALLBACK(src, bad_effect, FALSE), 30 SECONDS)
   
   //When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!)
   /obj/item/clothing/suit/armor/reactive/teleport
   	name = "reactive teleport armor"
   	desc = "Someone separated our Research Director from his own head!"
  +	emp_message = "<span class='warning'>The reactive armor's teleportation calculations begin spewing errors!</span>"
  +	cooldown_message = "<span class='danger'>The reactive teleport system is still recharging! It fails to activate!</span>"
  +	reactivearmor_cooldown_duration = 10 SECONDS
   	var/tele_range = 6
   	var/rad_amount= 15
   
  -/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  -	if(!active)
  -		return FALSE
  -	if(prob(hit_reaction_chance))
  -		if(world.time < reactivearmor_cooldown)
  -			owner.visible_message("<span class='danger'>The reactive teleport system is still recharging! It fails to teleport [owner]!</span>")
  -			return FALSE
  -		owner.visible_message("<span class='danger'>The reactive teleport system flings [owner] clear of [attack_text], shutting itself off in the process!</span>")
  -		playsound(get_turf(owner),'sound/magic/blink.ogg', 100, TRUE)
  -		do_teleport(owner, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE)
  -		owner.rad_act(rad_amount)
  -		reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  -		return TRUE
  -	return FALSE
  +/obj/item/clothing/suit/armor/reactive/teleport/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  +	owner.visible_message("<span class='danger'>The reactive teleport system flings [owner] clear of [attack_text]!</span>")
  +	playsound(get_turf(owner),'sound/magic/blink.ogg', 100, TRUE)
  +	do_teleport(owner, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE)
  +	owner.rad_act(rad_amount)
  +	reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  +	return TRUE
  +
  +/obj/item/clothing/suit/armor/reactive/teleport/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  +	owner.visible_message("<span class='danger'>The reactive teleport system flings itself clear of [attack_text], leaving someone behind in the process!</span>")
  +	owner.dropItemToGround(src, TRUE, TRUE)
  +	playsound(get_turf(owner),'sound/machines/buzz-sigh.ogg', 50, TRUE)
  +	playsound(get_turf(owner),'sound/magic/blink.ogg', 100, TRUE)
  +	do_teleport(src, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE)
  +	owner.rad_act(rad_amount)
  +	reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  +	return FALSE //you didn't actually evade the attack now did you
   
   //Fire
   
   /obj/item/clothing/suit/armor/reactive/fire
   	name = "reactive incendiary armor"
   	desc = "An experimental suit of armor with a reactive sensor array rigged to a flame emitter. For the stylish pyromaniac."
  -
  -/obj/item/clothing/suit/armor/reactive/fire/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  -	if(!active)
  -		return FALSE
  -	if(prob(hit_reaction_chance))
  -		if(world.time < reactivearmor_cooldown)
  -			owner.visible_message("<span class='danger'>The reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!</span>")
  -			return FALSE
  -		owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out jets of flame!</span>")
  -		playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, TRUE)
  -		for(var/mob/living/carbon/C in range(6, owner))
  -			if(C != owner)
  -				C.adjust_fire_stacks(8)
  -				C.IgniteMob()
  -		owner.set_fire_stacks(-20)
  -		reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  -		return TRUE
  +	cooldown_message = "<span class='danger'>The reactive incendiary armor activates, but fails to send out flames as it is still recharging its flame jets!</span>"
  +	emp_message = "<span class='warning'>The reactive incendiary armor's targeting system begins rebooting...</span>"
  +
  +/obj/item/clothing/suit/armor/reactive/fire/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  +	owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out jets of flame!</span>")
  +	playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, TRUE)
  +	for(var/mob/living/carbon/carbon_victim in range(6, owner))
  +		if(carbon_victim != owner)
  +			carbon_victim.adjust_fire_stacks(8)
  +			carbon_victim.IgniteMob()
  +	owner.set_fire_stacks(-20)
  +	reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  +	return TRUE
  +
  +/obj/item/clothing/suit/armor/reactive/fire/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  +	owner.visible_message("<span class='danger'>[src] just makes [attack_text] worse by spewing molten death on [owner]!</span>")
  +	playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, TRUE)
  +	owner.adjust_fire_stacks(12)
  +	owner.IgniteMob()
  +	reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
   	return FALSE
   
   //Stealth
  
positive.code: 	if(slot_flags & slot) //Was equipped to a valid slot for this item?
  		REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor")
  
  /obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  	if(!active)
  		return FALSE
  	if(prob(hit_reaction_chance))
  		if(world.time < reactivearmor_cooldown)
  			var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
  			sparks.set_up(1, 1, src)
  			sparks.start()
  			owner.visible_message("<span class='danger'>The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.</span>")
  			return
  		owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out arcs of lightning!</span>")
  		tesla_zap(owner, zap_range, zap_power, zap_flags)
  		reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  		return TRUE
  
  //Repulse
  
  /obj/item/clothing/suit/armor/reactive/repulse
  	name = "reactive repulse armor"
  	desc = "An experimental suit of armor that violently throws back attackers."
  	var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG
  
  /obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  	if(!active)
  		return FALSE
  	if(prob(hit_reaction_chance))
  		if(world.time < reactivearmor_cooldown)
  			owner.visible_message("<span class='danger'>The repulse generator is still recharging!</span>")
  			return FALSE
  		playsound(get_turf(owner),'sound/magic/repulse.ogg', 100, TRUE)
  		owner.visible_message("<span class='danger'>[src] blocks [attack_text], converting the attack into a wave of force!</span>")
  		var/turf/T = get_turf(owner)
  		var/list/thrown_items = list()
  		for(var/atom/movable/A in range(T, 7))
  			if(A == owner || A.anchored || thrown_items[A])
  				continue
  			var/throwtarget = get_edge_target_turf(T, get_dir(T, get_step_away(A, T)))
  			A.safe_throw_at(throwtarget, 10, 1, force = repulse_force)
  			thrown_items[A] = A
  
  		reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  		return TRUE
  
  /obj/item/clothing/suit/armor/reactive/table
  	name = "reactive table armor"
  	desc = "If you can't beat the memes, embrace them."
  	var/tele_range = 10
  
  /obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
  	if(!active)
  		return FALSE
  	if(prob(hit_reaction_chance))
  		var/mob/living/carbon/human/H = owner
  		if(world.time < reactivearmor_cooldown)
  			owner.visible_message("<span class='danger'>The reactive table armor's fabricators are still on cooldown!</span>")
  			return FALSE
  		owner.visible_message("<span class='danger'>The reactive teleport system flings [H] clear of [attack_text] and slams [H.p_them()] into a fabricated table!</span>")
  		owner.visible_message("<font color='red' size='3'>[H] GOES ON THE TABLE!!!</font>")
  		owner.Paralyze(40)
  		do_teleport(owner, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE)
  		new /obj/structure/table(get_turf(owner))
  		reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
  		return TRUE
  	return FALSE
  
  /obj/item/clothing/suit/armor/reactive/table/emp_act()
  	return
  
negative.code: /obj/item/clothing/suit/armor/reactive
  	name = "reactive armor"
  	desc = "Doesn't seem to do much for some reason."
  	///Whether the armor will try to react to hits (is it on)
  	var/active = FALSE
  	///This will be true for 30 seconds after an EMP, it makes the reaction effect dangerous to the user.
  	var/bad_effect = FALSE
  	///Message sent when the armor is emp'd. It is not the message for when the emp effect goes off.
  	var/emp_message = "<span class='warning'>The reactive armor has been emp'd! Damn, now it's REALLY gonna not do much!</span>"
  	///Message sent when the armor is still on cooldown, but activates.
  	var/cooldown_message = "<span class='danger'>The reactive armor fails to do much, as it is recharging! From what? Only the reactive armor knows.</span>"
  	///Duration of the cooldown specific to reactive armor for when it can activate again.
  	var/reactivearmor_cooldown_duration = 10 SECONDS
  	///The cooldown itself of the reactive armor for when it can activate again.
  	var/reactivearmor_cooldown = 0
  	icon_state = "reactiveoff"
  	inhand_icon_state = "reactiveoff"
  