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