diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 15ea2ca630..48e8a4c338 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -36,7 +36,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/magic/PopulateContents()
- var/loot = rand(1,9)
+ var/loot = rand(1,10)
switch(loot)
if(1)
new /obj/item/soulstone/anybody(src)
@@ -57,6 +57,8 @@
new /obj/item/immortality_talisman(src)
if(9)
new /obj/item/gun/magic/wand/book/healing(src)
+ if(10)
+ new /obj/item/guardiancreator(src)
/obj/structure/closet/crate/necropolis/tendril/weapon_armor/PopulateContents()
var/loot = rand(1,11)
@@ -128,7 +130,7 @@
new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src)
/obj/structure/closet/crate/necropolis/tendril/all/PopulateContents()
- var/loot = rand(1,28)
+ var/loot = rand(1,29)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
@@ -192,6 +194,8 @@
new /obj/item/immortality_talisman(src)
if(28)
new /obj/item/gun/magic/wand/book/healing(src)
+ if(29)
+ new /obj/item/guardiancreator(src)
//KA modkit design discs
/obj/item/disk/design_disk/modkit_disc
@@ -1105,14 +1109,12 @@
/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents()
new /obj/item/clothing/suit/space/hostile_environment(src)
new /obj/item/clothing/head/helmet/space/hostile_environment(src)
- var/loot = rand(1,3)
+ var/loot = rand(1,2)
switch(loot)
if(1)
new /obj/item/mayhem(src)
if(2)
new /obj/item/book/granter/spell/asura(src)
- if(3)
- new /obj/item/guardiancreator(src)
/obj/structure/closet/crate/necropolis/bubblegum/crusher
name = "bloody bubblegum chest"
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index d5b78b14b6..72a72d3683 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -1,5 +1,3 @@
-#define MEDAL_PREFIX "Bubblegum"
-
/*
BUBBLEGUM
@@ -7,17 +5,18 @@ BUBBLEGUM
Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence.
Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size.
-It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage.
+It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power
-It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming.
-Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target.
-To make this possible, it sprays streams of blood at random.
-From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress.
+It leaves blood trails behind wherever it goes, its clones do as well.
+It tries to strike at its target through any bloodpools under them; if it fails to do that.
+If it does warp it will enter an enraged state, becoming immune to all projectiles, becoming much faster, and dealing damage and knockback to anything that gets in the cloud around it.
+It may summon clones charging from all sides, one of these charges being bubblegum himself.
+It can charge at its target, and also heavily damaging anything directly hit in the charge.
+If at half health it will start to charge from all sides with clones.
-When Bubblegum dies, it leaves behind a H.E.C.K. suit+helmet as well as a chest that can contain three things:
- 1. A spellblade that can slice off limbs at range
- 2. A bottle that, when activated, drives everyone nearby into a frenzy
- 3. A super double-barrel shotgun that shoots both shells at the same time.
+When Bubblegum dies, it leaves behind a H.E.C.K. mining suit as well as a chest that can contain three things:
+ 1. A bottle that, when activated, drives everyone nearby into a frenzy
+ 2. A scroll that teaches the reader a martial art that sacrifices health for raw demonic power with their bare hands.
Difficulty: Hard
@@ -42,15 +41,20 @@ Difficulty: Hard
melee_damage_lower = 40
melee_damage_upper = 40
speed = 1
- move_to_delay = 10
- ranged_cooldown_time = 10
+ move_to_delay = 5
+ retreat_distance = 5
+ minimum_distance = 5
+ rapid_melee = 8 // every 1/4 second
+ melee_queue_distance = 20 // as far as possible really, need this because of blood warp
ranged = 1
pixel_x = -32
gender = MALE
del_on_death = 1
crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher)
loot = list(/obj/structure/closet/crate/necropolis/bubblegum)
+ blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME
var/charging = 0
+ var/enrage_till = null
achievement_type = /datum/award/achievement/boss/bubblegum_kill
crusher_achievement_type = /datum/award/achievement/boss/bubblegum_crusher
@@ -67,36 +71,60 @@ Difficulty: Hard
desc = "You're not quite sure how a signal can be bloody."
invisibility = 100
-/mob/living/simple_animal/hostile/megafauna/bubblegum/BiologicalLife(seconds, times_fired)
- if(!(. = ..()))
- return
- move_to_delay = clamp(round((health/maxHealth) * 10), 3, 10)
+/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, only_robotic = FALSE, only_organic = TRUE)
+ . = ..()
+ if(. > 0 && prob(25))
+ var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc)
+ if(prob(40))
+ step(B, pick(GLOB.cardinals))
+ else
+ B.setDir(pick(GLOB.cardinals))
+
+/obj/effect/decal/cleanable/blood/gibs/bubblegum
+ name = "thick blood"
+ desc = "Thick, splattered blood."
+ random_icon_states = list("gib3", "gib5", "gib6")
+ bloodiness = 20
+
+/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in()
+ return TRUE
/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire()
- anger_modifier = clamp(((maxHealth - health)/50),0,20)
+ anger_modifier = clamp(((maxHealth - health)/60),0,20)
if(charging)
return
- ranged_cooldown = world.time + ranged_cooldown_time
+ ranged_cooldown = world.time + 50
+ if(!try_bloodattack())
+ blood_warp()
- blood_warp()
-
- if(prob(25))
- INVOKE_ASYNC(src, .proc/blood_spray)
-
- else if(prob(5+anger_modifier/2))
- slaughterlings()
- else
- if(health > maxHealth/2 && !client)
- INVOKE_ASYNC(src, .proc/charge)
+ if(health > maxHealth * 0.5)
+ if(prob(50 + anger_modifier))
+ charge(delay = 6)
+ charge(delay = 4) // The FitnessGram Pacer Test is a multistage aerobic capacity test that progressively gets more difficult as it continues.
+ charge(delay = 2)
+ SetRecoveryTime(15)
else
- INVOKE_ASYNC(src, .proc/triple_charge)
+ hallucination_charge_around(times = 6, delay = 10 - anger_modifier / 5)
+ SetRecoveryTime(10)
+ else
+ if(prob(50 - anger_modifier))
+ hallucination_charge_around(times = 4, delay = 9)
+ hallucination_charge_around(times = 4, delay = 8)
+ hallucination_charge_around(times = 4, delay = 7)
+ SetRecoveryTime(15)
+ else
+ for(var/i = 1 to 5)
+ INVOKE_ASYNC(src, .proc/hallucination_charge_around, 2, 10, 2, 0)
+ sleep(5)
+ SetRecoveryTime(10)
/mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize()
. = ..()
- for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_list)
- if(B != src)
- return INITIALIZE_HINT_QDEL //There can be only one
+ if(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination))
+ return
+ for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in GLOB.mob_living_list) if(B != src)
+ return INITIALIZE_HINT_QDEL //There can be only one
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
if(istype(loc, /obj/effect/dummy/phased_mob/slaughter))
@@ -109,52 +137,78 @@ Difficulty: Hard
SSshuttle.shuttle_purchase_requirements_met |= "bubblegum"
/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
- if(charging)
- return
- ..()
+ if(!charging)
+ ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
- if(charging)
+ if(!charging)
+ . = ..()
+ if(.)
+ recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/item/projectile/P)
+ if(is_enraged())
+ visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!", "You deflect the projectile!")
+ playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, 1)
+ return 0
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/ex_act(severity, target)
+ if(severity >= EXPLODE_LIGHT)
return
- ..()
+ severity = EXPLODE_LIGHT // puny mortals
+ return ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/CanPass(atom/movable/mover, turf/target)
+ if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination))
+ return 1
+ return ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance)
- if(charging)
- return
- ..()
+ if(!charging)
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/MoveToTarget(list/possible_targets)
+ if(!charging)
+ ..()
/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)
+ new /obj/effect/temp_visual/decoy/fading(loc,src)
DestroySurroundings()
- . = ..()
+ ..()
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/Moved()
+ new /obj/effect/decal/cleanable/blood(src.loc)
if(charging)
DestroySurroundings()
+ playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1)
+ return ..()
-/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)
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge(atom/chargeat = target, delay = 3, chargepast = 2)
+ if(!chargeat)
return
- new /obj/effect/temp_visual/dragon_swoop(T)
+ var/chargeturf = get_turf(chargeat)
+ if(!chargeturf)
+ return
+ var/dir = get_dir(src, chargeturf)
+ var/turf/T = get_ranged_target_turf(chargeturf, dir, chargepast)
+ if(!T)
+ return
+ new /obj/effect/temp_visual/dragon_swoop/bubblegum(T)
charging = 1
DestroySurroundings()
walk(src, 0)
- setDir(get_dir(src, T))
+ setDir(dir)
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)
+ animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3)
+ sleep(delay)
+ var/movespeed = 0.7
+ walk_towards(src, T, movespeed)
+ sleep(get_dist(src, T) * movespeed)
+ walk(src, 0) // cancel the movement
+ try_bloodattack()
charging = 0
- Goto(target, move_to_delay, minimum_distance)
/**
* Attack by override for bubblegum
@@ -176,36 +230,147 @@ Difficulty: Hard
if(isturf(A) || isobj(A) && A.density)
A.ex_act(EXPLODE_HEAVY)
DestroySurroundings()
+ if(isliving(A))
+ var/mob/living/L = A
+ L.visible_message("[src] slams into [L]!", "[src] tramples you into the ground!")
+ src.forceMove(get_turf(L))
+ L.apply_damage(istype(src, /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination) ? 15 : 30, BRUTE)
+ playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
+ shake_camera(L, 4, 3)
+ shake_camera(src, 2, 3)
..()
-/mob/living/simple_animal/hostile/megafauna/bubblegum/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(!charging)
- return ..()
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood()
+ var/list/targets = ListTargets()
+ . = list()
+ for(var/mob/living/L in targets)
+ var/list/bloodpool = get_pools(get_turf(L), 0)
+ if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD))
+ . += L
- else if(isliving(hit_atom))
- var/mob/living/L = hit_atom
- L.visible_message("[src] slams into [L]!", "[src] slams into you!")
- 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)
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack()
+ var/list/targets = get_mobs_on_blood()
+ if(targets.len)
+ INVOKE_ASYNC(src, .proc/bloodattack, targets, prob(50))
+ return TRUE
+ return FALSE
- charging = 0
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness)
+ var/mob/living/target_one = pick_n_take(targets)
+ var/turf/target_one_turf = get_turf(target_one)
+ var/mob/living/target_two
+ if(targets.len)
+ target_two = pick_n_take(targets)
+ var/turf/target_two_turf = get_turf(target_two)
+ if(target_two.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_two_turf, handedness)
+ else
+ bloodsmack(target_two_turf, handedness)
+ if(target_one)
+ var/list/pools = get_pools(get_turf(target_one), 0)
+ if(pools.len)
+ target_one_turf = get_turf(target_one)
+ if(target_one_turf)
+ if(target_one.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_one_turf, !handedness)
+ else
+ bloodsmack(target_one_turf, !handedness)
+
+ if(!target_two && target_one)
+ var/list/poolstwo = get_pools(get_turf(target_one), 0)
+ if(poolstwo.len)
+ target_one_turf = get_turf(target_one)
+ if(target_one_turf)
+ if(target_one.stat != CONSCIOUS || prob(10))
+ bloodgrab(target_one_turf, handedness)
+ else
+ bloodsmack(target_one_turf, handedness)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T)
+ else
+ new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T)
+ sleep(4)
+ for(var/mob/living/L in T)
+ if(!faction_check_mob(L))
+ to_chat(L, "[src] rends you!")
+ playsound(T, attack_sound, 100, 1, -1)
+ var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
+ L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration))
+ sleep(3)
+
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness)
+ if(handedness)
+ new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T)
+ new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T)
+ else
+ new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T)
+ new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T)
+ sleep(6)
+ for(var/mob/living/L in T)
+ if(!faction_check_mob(L))
+ if(L.stat != CONSCIOUS)
+ to_chat(L, "[src] drags you through the blood!")
+ playsound(T, 'sound/magic/enter_blood.ogg', 100, 1, -1)
+ var/turf/targetturf = get_step(src, dir)
+ L.forceMove(targetturf)
+ playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, 1, -1)
+ addtimer(CALLBACK(src, .proc/devour, L), 2)
+ sleep(1)
+
+/obj/effect/temp_visual/dragon_swoop/bubblegum
+ duration = 10
+
+/obj/effect/temp_visual/bubblegum_hands
+ icon = 'icons/effects/bubblegum.dmi'
+ duration = 9
+
+/obj/effect/temp_visual/bubblegum_hands/rightthumb
+ icon_state = "rightthumbgrab"
+
+/obj/effect/temp_visual/bubblegum_hands/leftthumb
+ icon_state = "leftthumbgrab"
+
+/obj/effect/temp_visual/bubblegum_hands/rightpaw
+ icon_state = "rightpawgrab"
+ layer = BELOW_MOB_LAYER
+
+/obj/effect/temp_visual/bubblegum_hands/leftpaw
+ icon_state = "leftpawgrab"
+ layer = BELOW_MOB_LAYER
+
+/obj/effect/temp_visual/bubblegum_hands/rightsmack
+ icon_state = "rightsmack"
+
+/obj/effect/temp_visual/bubblegum_hands/leftsmack
+ icon_state = "leftsmack"
/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp()
+ if(Adjacent(target) || (enrage_till + 30 > world.time))
+ return FALSE
+ var/list/can_jaunt = get_pools(get_turf(src), 1)
+ if(!can_jaunt.len)
+ return FALSE
+
+ var/list/pools = get_pools(get_turf(target), 2)
+ var/list/pools_to_remove = get_pools(get_turf(target), 1)
+ pools -= pools_to_remove
+ if(!pools.len)
+ return FALSE
+
+ var/obj/effect/temp_visual/decoy/DA = new /obj/effect/temp_visual/decoy(loc,src)
+ DA.color = "#FF0000"
+ var/oldtransform = DA.transform
+ DA.transform = matrix()*2
+ animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 3)
+ sleep(3)
+ qdel(DA)
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
+ pools = get_pools(get_turf(target), 2)
+ pools_to_remove = get_pools(get_turf(target), 1)
+ pools -= pools_to_remove
if(pools.len)
shuffle_inplace(pools)
found_bloodpool = pick(pools)
@@ -215,48 +380,110 @@ Difficulty: Hard
forceMove(get_turf(found_bloodpool))
playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1)
visible_message("And springs back out!")
+ 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_spray()
- visible_message("[src] sprays a stream of gore!")
- 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)
+/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/slaughterlings()
- visible_message("[src] summons a shoal of slaughterlings!")
- 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)
+/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/is_enraged()
+ return (enrage_till > world.time)
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood/slaughter
- name = "slaughterling"
- desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you."
- icon_state = "bloodbrood"
- icon_living = "bloodbrood"
- icon_aggro = "bloodbrood"
- attack_verb_continuous = "pierces"
- attack_verb_simple = "pierce"
- color = "#C80000"
- density = FALSE
- faction = list("mining", "boss")
- weather_immunities = list("lava","ash")
- has_field_of_vision = FALSE
+/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/asteroid/hivelordbrood/slaughter/CanPass(atom/movable/mover, turf/target)
- if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum))
+/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
+ 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(atom/chargeat = target, delay = 3, chargepast = 2)
+ ..()
+ 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 0
+ return ..()
-#undef MEDAL_PREFIX
+/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, only_robotic = FALSE, only_organic = TRUE)
+ 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