anchor.diff:  		forceMove(get_turf(found_bloodpool))
   		playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
   		visible_message("<span class='danger'>And springs back out!</span>")
  -
  -
  -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray()
  -	visible_message("<span class='danger'>[src] sprays a stream of gore!</span>")
  -	var/turf/E = get_edge_target_turf(src, src.dir)
  -	var/range = 10
  -	var/turf/previousturf = get_turf(src)
  -	for(var/turf/J in getline(src,E))
  -		if(!range)
  -			break
  -		new /obj/effect/temp_visual/dir_setting/bloodsplatter(previousturf, get_dir(previousturf, J))
  -		if(!previousturf.CanAtmosPass(J))
  -			break
  -		playsound(J,'sound/effects/splat.ogg', 100, 1, -1)
  -		new /obj/effect/decal/cleanable/blood(J)
  -		range--
  -		previousturf = J
  -		sleep(1)
  +		blood_enrage()
  +		return TRUE
  +	return FALSE
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage(var/boost_time = 30)
  +	enrage_till = world.time + boost_time
  +	retreat_distance = null
  +	minimum_distance = 1
  +	change_move_delay(3.75)
  +	var/newcolor = rgb(149, 10, 10)
  +	add_atom_colour(newcolor, TEMPORARY_COLOUR_PRIORITY)
  +	var/datum/callback/cb = CALLBACK(src, .proc/blood_enrage_end)
  +	addtimer(cb, boost_time)
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage_end(var/newcolor = rgb(149, 10, 10))
  +	retreat_distance = initial(retreat_distance)
  +	minimum_distance = initial(minimum_distance)
  +	change_move_delay()
  +	remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, newcolor)
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/is_enraged()
  +	return (enrage_till > world.time)
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/change_move_delay(var/newmove = initial(move_to_delay))
  +	move_to_delay = newmove
  +	handle_automated_action() // need to recheck movement otherwise move_to_delay won't update until the next checking aka will be wrong speed for a bit
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range)
  +	. = list()
  +	for(var/obj/effect/decal/cleanable/nearby in view(T, range))
  +		if(nearby.can_bloodcrawl_in())
  +			. += nearby
  +
  +/obj/effect/decal/cleanable/blood/bubblegum
  +	bloodiness = 0
  +
  +/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in()
  +	return TRUE
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/hallucination_charge_around(var/times = 4, var/delay = 6, var/chargepast = 0, var/useoriginal = 1)
  +	var/startingangle = rand(1, 360)
  +	if(!target)
  +		return
  +	var/turf/chargeat = get_turf(target)
  +	var/srcplaced = 0
  +	for(var/i = 1 to times)
  +		var/ang = (startingangle + 360/times * i)
  +		if(!chargeat)
  +			return
  +		var/turf/place = locate(chargeat.x + cos(ang) * times, chargeat.y + sin(ang) * times, chargeat.z)
  +		if(!place)
  +			continue
  +		if(!srcplaced && useoriginal)
  +			forceMove(place)
  +			srcplaced = 1
  +			continue
  +		var/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/B = new /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination(src.loc)
  +		B.forceMove(place)
  +		INVOKE_ASYNC(B, .proc/charge, chargeat, delay, chargepast)
  +	if(useoriginal)
  +		charge(chargeat, delay, chargepast)
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination
  +	name = "bubblegum's hallucination"
  +	desc = "Is that really just a hallucination?"
  +	health = 1
  +	maxHealth = 1
  +	alpha = 127.5
  +	crusher_loot = null
  +	loot = null
  +	medal_type = null
  +	score_type = null
  +	deathmessage = "Explodes into a pool of blood!"
  +	deathsound = 'sound/effects/splat.ogg'
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Initialize()
  +	..()
  +	toggle_ai(AI_OFF)
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/charge()
  +	..()
  +	qdel(src)
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Destroy()
  +	new /obj/effect/decal/cleanable/blood(get_turf(src))
  +	. = ..()
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/CanPass(atom/movable/mover, turf/target)
  +	if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) // hallucinations should not be stopping bubblegum or eachother
  +		return 1
  +	return ..()
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life()
  +	return
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE)
  +	return
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/OpenFire()
  +	return
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/AttackingTarget()
  +	return
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/try_bloodattack()
  +	return
  +
  +/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/grant_achievement(medaltype,scoretype)
  +	return
   
   /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings()
   	visible_message("<span class='danger'>[src] summons a shoal of slaughterlings!</span>")
  -	for(var/obj/effect/decal/cleanable/blood/H in range(src, 10))
  -		if(prob(25))
  -			new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(H.loc)
  +	var/max_amount = 6
  +	for(var/H in get_pools(get_turf(src), 1))
  +		if(!max_amount)
  +			break
  +		max_amount--
  +		var/obj/effect/decal/cleanable/blood/B = H
  +		new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter(B.loc)
  +	return max_amount
   
   /mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter
   	name = "slaughterling"
  
positive.code: 	if(.)
  		SSshuttle.shuttle_purchase_requirements_met |= "bubblegum"
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A)
  	if(charging)
  		return
  	..()
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
  	if(charging)
  		return
  	..()
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance)
  	if(charging)
  		return
  	..()
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
  	if(!stat)
  		playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1)
  	if(charging)
  		new/obj/effect/temp_visual/decoy/fading(loc,src)
  		DestroySurroundings()
  	. = ..()
  	if(charging)
  		DestroySurroundings()
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge()
  	charge()
  	sleep(10)
  	charge()
  	sleep(10)
  	charge()
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge()
  	var/turf/T = get_turf(target)
  	if(!T || T == loc)
  		return
  	new /obj/effect/temp_visual/dragon_swoop(T)
  	charging = 1
  	DestroySurroundings()
  	walk(src, 0)
  	setDir(get_dir(src, T))
  	var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(loc,src)
  	animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 5)
  	sleep(5)
  	throw_at(T, get_dist(src, T), 1, src, 0)
  	charging = 0
  	Goto(target, move_to_delay, minimum_distance)
  
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/Bump(atom/A)
  	if(charging)
  		if(isturf(A) || isobj(A) && A.density)
  			A.ex_act(EXPLODE_HEAVY)
  		DestroySurroundings()
  	..()
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
  	if(!charging)
  		return ..()
  
  	else if(isliving(hit_atom))
  		var/mob/living/L = hit_atom
  		L.visible_message("<span class='danger'>[src] slams into [L]!</span>", "<span class='userdanger'>[src] slams into you!</span>")
  		L.apply_damage(40, BRUTE)
  		playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
  		shake_camera(L, 4, 3)
  		shake_camera(src, 2, 3)
  		var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
  		L.throw_at(throwtarget, 3)
  
  	charging = 0
  
  
  /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
  	var/obj/effect/decal/cleanable/blood/found_bloodpool
  	var/list/pools = list()
  	var/can_jaunt = FALSE
  	for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2))
  		can_jaunt = TRUE
  		break
  	if(!can_jaunt)
  		return
  	for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2))
  		pools += nearby
  	if(pools.len)
  		shuffle_inplace(pools)
  		found_bloodpool = pick(pools)
  
negative.code: /*
  
  BUBBLEGUM
  