diff --git a/code/datums/action.dm b/code/datums/action.dm
index 59976843017..df32a847895 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -275,13 +275,16 @@
return 0
return ..()
-/datum/action/item_action/organ_action/toggle
-
/datum/action/item_action/organ_action/toggle/New(Target)
..()
name = "Toggle [target.name]"
button.name = name
+/datum/action/item_action/organ_action/use/New(Target)
+ ..()
+ name = "Use [target.name]"
+ button.name = name
+
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
index b80c8ffdc34..dee4b491559 100644
--- a/code/modules/mob/living/carbon/human/blood.dm
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -223,10 +223,10 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
var/datum/reagent/blood/our = get_blood(vessel)
- if (!injected || !our)
+ if (!injected || !our || !dna)
return
- if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"],injected.data["species"],our.data["species"]) )
+ if(blood_incompatible(injected.data["blood_type"], dna.blood_type,injected.data["species"], dna.species.id) )
reagents.add_reagent("toxin",amount * 0.5)
our.on_merge(injected.data) //still transfer viruses and such, even if incompatibles bloods
reagents.update_total()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 4867440b5e7..9860ccb8830 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -237,8 +237,10 @@
flags = NOBLUDGEON
slot = "hivecore"
force = 0
+ actions_types = list(/datum/action/item_action/organ_action/use)
var/inert = 0
var/preserved = 0
+ var/list/spawned_brood = list()
/obj/item/organ/internal/hivelord_core/New()
..()
@@ -249,6 +251,23 @@
else
preserved = 1
+/obj/item/organ/internal/hivelord_core/ui_action_click()
+ var/spawn_amount = 1
+ if(!inert)
+ spawn_amount++
+
+ for(var/a in spawned_brood)
+ if(!istype(a, /mob/living/simple_animal/hostile/asteroid/hivelordbrood) || qdeleted(a))
+ spawned_brood -= a
+ continue
+ spawn_amount -= spawned_brood.len
+
+ for(var/i = 1 to spawn_amount)
+ var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/B = new (owner.loc)
+ B.link_host(owner)
+ spawned_brood |= B
+
+
/obj/item/organ/internal/hivelord_core/on_life()
..()
if(owner)
@@ -299,6 +318,7 @@
speed = 3
maxHealth = 1
health = 1
+ flying = 1
harm_intent_damage = 5
melee_damage_lower = 2
melee_damage_upper = 2
@@ -313,7 +333,89 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New()
..()
spawn(100)
- qdel(src)
+ death()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood
+ name = "blood brood"
+ desc = "A living string of blood and alien materials."
+ icon_state = "bloodbrood"
+ icon_living = "bloodbrood"
+ icon_aggro = "bloodbrood"
+ attacktext = "pierces"
+ color = "#C80000"
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/death()
+ if(loc) // Splash the turf we are on with blood
+ reagents.reaction(get_turf(src))
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/New()
+ create_reagents(30)
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/AttackingTarget()
+ ..()
+ if(iscarbon(target))
+ transfer_reagents(target, 1)
+
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_hand(mob/living/carbon/human/M)
+ if("\ref[M]" in faction)
+ reabsorb_host(M)
+ else
+ return ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_paw(mob/living/carbon/monkey/M)
+ if("\ref[M]" in faction)
+ reabsorb_host(M)
+ else
+ return ..()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/attack_alien(mob/living/carbon/alien/humanoid/M)
+ if("\ref[M]" in faction)
+ reabsorb_host(M)
+ else
+ return ..()
+
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/reabsorb_host(mob/living/carbon/C)
+ C.visible_message("[src] is reabsorbed by [C]'s body.", \
+ "[src] is reabsorbed by your body.")
+ transfer_reagents(C)
+ death()
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/transfer_reagents(mob/living/carbon/C, var/volume = 30)
+ if(!reagents.total_volume)
+ return
+
+ volume = min(volume, reagents.total_volume)
+
+ var/fraction = min(volume/reagents.total_volume, 1)
+ reagents.reaction(C, INJECT, fraction)
+
+ var/datum/reagent/blood/B
+ for(var/datum/reagent/blood/d in reagents.reagent_list)
+ B = d
+ break
+ if(B)
+ C.inject_blood(src, min(B.volume, volume))
+
+ reagents.trans_to(C, volume)
+
+/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/proc/link_host(mob/living/carbon/C)
+ faction = list("\ref[src]", "\ref[C]") // Hostile to everyone except the host.
+ var/datum/reagent/B = C.take_blood(src, 30)
+ if(!B)
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(H.dna.species.exotic_blood && H.reagents.total_volume)
+ H.reagents.trans_to(src, 10)
+
+ else
+ reagents.reagent_list += B
+ reagents.update_total()
+
+ color = mix_color_from_reagents(reagents.reagent_list)
/mob/living/simple_animal/hostile/asteroid/goliath
name = "goliath"
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 1c724e9cb86..06905f87d76 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index b22513e6aaf..8cf32385df3 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 81d20e1f745..116fbe4090c 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ