diff --git a/code/datums/spells/alien_spells/build_resin_structure.dm b/code/datums/spells/alien_spells/build_resin_structure.dm
index b33967cd40a..0d1cb5d8366 100644
--- a/code/datums/spells/alien_spells/build_resin_structure.dm
+++ b/code/datums/spells/alien_spells/build_resin_structure.dm
@@ -1,7 +1,6 @@
#define RESIN_WALL "Resin Wall"
#define RESIN_NEST "Resin Nest"
#define RESIN_DOOR "Resin Door"
-#define REVIVAL_NEST "Revival Nest"
/datum/spell/alien_spell/build_resin
name = "Build Resin Structure"
@@ -15,8 +14,7 @@
/datum/spell/alien_spell/build_resin/cast(list/targets, mob/living/carbon/user)
var/static/list/resin_buildings = list(RESIN_WALL = image(icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi', icon_state = "resin_wall-0"),
RESIN_NEST = image(icon = 'icons/mob/alien.dmi', icon_state = "nest"),
- RESIN_DOOR = image(icon = 'icons/obj/smooth_structures/alien/resin_door.dmi', icon_state = "resin"),
- REVIVAL_NEST = image(icon = 'icons/mob/alien.dmi', icon_state = "placeholder_rejuv_nest"))
+ RESIN_DOOR = image(icon = 'icons/obj/smooth_structures/alien/resin_door.dmi', icon_state = "resin"))
var/choice = show_radial_menu(user, user, resin_buildings, src, radius = 40)
var/turf/turf_to_spawn_at = user.loc
if(!choice)
@@ -42,8 +40,6 @@
new /obj/structure/bed/nest(turf_to_spawn_at)
if(RESIN_DOOR)
new /obj/structure/alien/resin/door(turf_to_spawn_at)
- if(REVIVAL_NEST)
- new /obj/structure/bed/revival_nest(turf_to_spawn_at)
/datum/spell/touch/alien_spell/consume_resin
name = "Consume resin structures"
@@ -75,7 +71,7 @@
if(!plasma_check(10, C))
to_chat(C, "You don't have enough plasma to perform this action!")
return
- var/static/list/resin_objects = list(/obj/structure/alien/resin, /obj/structure/alien/egg, /obj/structure/bed/nest, /obj/structure/bed/revival_nest)
+ var/static/list/resin_objects = list(/obj/structure/alien/resin, /obj/structure/alien/egg, /obj/structure/bed/nest)
for(var/resin_type in resin_objects)
if(!istype(target, resin_type))
continue
@@ -90,4 +86,3 @@
#undef RESIN_WALL
#undef RESIN_NEST
#undef RESIN_DOOR
-#undef REVIVAL_NEST
diff --git a/code/datums/spells/alien_spells/corrosive_acid_spit.dm b/code/datums/spells/alien_spells/corrosive_acid_spit.dm
index ce92020b280..3e03006e279 100644
--- a/code/datums/spells/alien_spells/corrosive_acid_spit.dm
+++ b/code/datums/spells/alien_spells/corrosive_acid_spit.dm
@@ -69,7 +69,7 @@
C.visible_message("[C] touches [target] and a fireball erupts on contact!")
C.add_plasma(-100)
else
- var/static/list/resin_objects = list(/obj/structure/alien/resin, /obj/structure/alien/egg, /obj/structure/bed/nest, /obj/structure/bed/revival_nest)
+ var/static/list/resin_objects = list(/obj/structure/alien/resin, /obj/structure/alien/egg, /obj/structure/bed/nest)
for(var/resin_type in resin_objects)
if(!istype(target, resin_type))
continue
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 6cb5c0a0083..61d636dc8c2 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -116,113 +116,3 @@
/obj/structure/bed/nest/prevents_buckled_mobs_attacking()
return TRUE
-
-/obj/structure/bed/revival_nest
- name = "alien rejuvenation nest"
- desc = "It's a gruesome pile of thick, sticky resin shaped like a flytrap. Heals damaged aliens and slowly revives the dead."
- icon = 'icons/mob/alien.dmi'
- icon_state = "placeholder_rejuv_nest"
- max_integrity = 30
- var/image/nest_overlay
- comfort = 0
- flags = NODECONSTRUCT
- var/processing_ticks = 0
- var/revive_timer
-
-/obj/structure/bed/revival_nest/Initialize(mapload)
- . = ..()
- nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer = MOB_LAYER - 0.2)
-
-/obj/structure/bed/revival_nest/user_unbuckle_mob(mob/living/buckled_mob, mob/user)
- for(var/mob/living/M in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore
- if(user.get_int_organ(/obj/item/organ/internal/alien/hivenode))
- unbuckle_mob(M)
- add_fingerprint(user)
-
-/obj/structure/bed/revival_nest/post_buckle_mob(mob/living/M)
- M.layer = BELOW_MOB_LAYER
- add_overlay(nest_overlay)
-
-/obj/structure/bed/revival_nest/post_unbuckle_mob(mob/living/M)
- M.layer = initial(M.layer)
- cut_overlay(nest_overlay)
- STOP_PROCESSING(SSobj, src)
- deltimer(revive_timer)
- revive_timer = null
-
-/obj/structure/bed/revival_nest/process()
- for(var/mob/living/buckled_mob in buckled_mobs)
- processing_ticks++
- if(!buckled_mob.get_int_organ(/obj/item/organ/internal/alien/hivenode))
- continue
- buckled_mob.adjustBruteLoss(-5)
- buckled_mob.adjustFireLoss(-5)
- buckled_mob.adjustToxLoss(-5)
- buckled_mob.adjustOxyLoss(-5)
- buckled_mob.adjustCloneLoss(-5)
- for(var/datum/disease/virus in buckled_mob.viruses)
- if(virus.stage < 1 && processing_ticks >= 4)
- virus.cure()
- processing_ticks = 0
- if(virus.stage > 1 && processing_ticks >= 4)
- virus.stage--
- processing_ticks = 0
- if(buckled_mob.stat == DEAD && !revive_timer && isalien(buckled_mob))
- revive_timer = addtimer(CALLBACK(src, PROC_REF(revive_dead_alien), buckled_mob), 40 SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE)
-
-/obj/structure/bed/revival_nest/proc/revive_dead_alien(mob/living/carbon/alien/dead_alien)
- dead_alien.revive()
- dead_alien.visible_message("Vines seep into the back of [dead_alien], and it awakes with a burning rage!")
- if(dead_alien.ghost_can_reenter())
- var/mob/dead/observer/dead_bro = dead_alien.grab_ghost()
- SEND_SOUND(dead_alien, sound('sound/voice/hiss5.ogg'))
- if(isalienqueen(dead_alien))
- for(var/mob/living/carbon/alien/humanoid/queen/living_queen in GLOB.alive_mob_list)
- if(living_queen.key || !living_queen.get_int_organ(/obj/item/organ/internal/brain))
- to_chat(dead_bro, "We already have an alive queen. We've been reverted to our drone form!")
- qdel(dead_alien)
- var/mob/living/carbon/alien/humanoid/drone/new_drone = new(get_turf(src))
- new_drone.key = dead_bro.key
- else
- var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as [dead_alien]?", ROLE_ALIEN, FALSE, source = dead_alien)
- if(!length(candidates))
- return
- var/mob/C = pick(candidates)
- dead_alien.key = C.key
- dust_if_respawnable(C)
- dead_alien.mind.name = dead_alien.name
- dead_alien.mind.assigned_role = SPECIAL_ROLE_XENOMORPH
- dead_alien.mind.special_role = SPECIAL_ROLE_XENOMORPH
- SEND_SOUND(dead_alien, sound('sound/voice/hiss5.ogg'))
-
-/obj/structure/bed/revival_nest/user_buckle_mob(mob/living/M, mob/living/user)
- if(!istype(M) || user.incapacitated() || M.buckled)
- return
-
- if(M != user && !HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && (!in_range(M, src) || !do_after(user, 1 SECONDS, target = M)))
- return FALSE
-
- if(!user.get_int_organ(/obj/item/organ/internal/alien/hivenode))
- to_chat(user, "Your lack of linkage to the hive prevents you from buckling [M] into [src].")
- return
-
- if(has_buckled_mobs())
- unbuckle_all_mobs()
-
- if(!M.get_int_organ(/obj/item/organ/internal/alien/hivenode))
- to_chat(user, "[src] would be of no use to [M].")
- return
-
- if(buckle_mob(M))
- M.visible_message("[user] secretes a thick vile goo, securing [M] into [src]!",\
- "[user] drenches you in a foul-smelling resin, trapping you in [src]!",\
- "You hear squelching...")
- START_PROCESSING(SSobj, src)
-
-/obj/structure/bed/revival_nest/attack_alien(mob/living/carbon/alien/user)
- if(user.a_intent != INTENT_HARM)
- return attack_hand(user)
- if(!do_after(user, 4 SECONDS, target = src) || QDELETED(src))
- return
- playsound(get_turf(user), pick('sound/effects/alien_resin_break2.ogg', 'sound/effects/alien_resin_break1.ogg'), 50, FALSE)
- qdel(src)
diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm
index 72e6a955421..ad9604300af 100644
--- a/code/modules/surgery/organs/subtypes/xenos.dm
+++ b/code/modules/surgery/organs/subtypes/xenos.dm
@@ -75,6 +75,8 @@
var/max_plasma = 300
var/heal_rate = 5
var/plasma_rate = 10
+ /// For curing viruses
+ var/processing_ticks = 0
/obj/item/organ/internal/alien/plasmavessel/prepare_eat()
var/obj/S = ..()
@@ -123,6 +125,15 @@
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)
+ if(IS_HORIZONTAL(owner) && length(owner.viruses))
+ processing_ticks++
+ for(var/datum/disease/virus in owner.viruses)
+ if(virus.stage < 1 && processing_ticks >= 4)
+ virus.cure()
+ processing_ticks = 0
+ if(virus.stage > 1 && processing_ticks >= 4)
+ virus.stage--
+ processing_ticks = 0
/obj/item/organ/internal/alien/plasmavessel/insert(mob/living/carbon/M, special = 0)
..()
diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi
index 6f74879c7a9..d4897f07164 100644
Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ