Reworks xenomorphs (#23054)

* reworks xenomorphs

* part 2 electric boogaloo

* more tweaks

* more tweaks

* lints

* Update code/modules/mob/living/carbon/alien/alien_death.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/modules/surgery/organs/subtypes/xenos.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* Update code/datums/spells/alien_spells/transfer_plasma.dm

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>

* reviews

* sprite fix

* high priority fix

* reverts most alien nerfs

---------

Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
This commit is contained in:
GDN
2024-02-24 12:13:31 -06:00
committed by GitHub
parent f1059317c3
commit 5ebefe9fa1
51 changed files with 608 additions and 320 deletions
+8 -8
View File
@@ -111,7 +111,7 @@
icon = 'icons/obj/smooth_structures/alien/resin_door.dmi'
icon_state = "resin"
base_icon_state = "resin"
max_integrity = 100
max_integrity = 60
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 50, ACID = 50)
damage_deflection = 0
flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2
@@ -156,7 +156,7 @@
/obj/structure/alien/resin/door/CanAtmosPass(turf/T)
return !density
/obj/structure/alien/resin/door/proc/try_to_operate(mob/user)
/obj/structure/alien/resin/door/proc/try_to_operate(mob/user, bumped_open = FALSE)
if(is_operating)
return
if(!iscarbon(user))
@@ -164,7 +164,7 @@
var/mob/living/carbon/C = user
if(C.get_int_organ(/obj/item/organ/internal/alien/hivenode))
if(!C.handcuffed)
operate()
operate(bumped_open)
return
to_chat(user, "<span class='noticealien'>Your lack of connection to the hive prevents the resin door from opening</span>")
/*
@@ -178,7 +178,7 @@
return
operate()
/obj/structure/alien/resin/door/proc/operate()
/obj/structure/alien/resin/door/proc/operate(bumped_open = FALSE)
is_operating = TRUE
if(!state_open)
playsound(loc, open_sound, 50, TRUE)
@@ -194,14 +194,14 @@
density = !density
opacity = !opacity
state_open = !state_open
addtimer(CALLBACK(src, PROC_REF(operate_update)), 1 SECONDS)
addtimer(CALLBACK(src, PROC_REF(operate_update), bumped_open), 1 SECONDS)
/obj/structure/alien/resin/door/proc/operate_update()
/obj/structure/alien/resin/door/proc/operate_update(bumped_open)
air_update_turf(1)
update_icon(UPDATE_ICON_STATE)
is_operating = FALSE
if(state_open)
if(state_open && bumped_open)
addtimer(CALLBACK(src, PROC_REF(mobless_try_to_operate)), close_delay)
/obj/structure/alien/resin/door/update_icon_state()
@@ -219,7 +219,7 @@
/obj/structure/alien/resin/door/Bumped(atom/user)
..()
if(!state_open)
return try_to_operate(user)
return try_to_operate(user, TRUE)
/*
* Weeds
@@ -110,3 +110,118 @@
/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, breaks down non xenos and uses their genetic soup to make an alien egg."
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_or_decay_timer
/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(HAS_TRAIT(user, TRAIT_XENO_IMMUNE))
unbuckle_mob(M)
add_fingerprint(user)
return
if(M != user)
M.visible_message("<span class='notice'>[user] tears [M] out of the rejuvination pod!</span>",\
"<span class='notice'>[user] pulls you free from the rejuvination pod!</span>",\
"<span class='italics'>You hear squelching...</span>")
else
M.visible_message("<span class='warning'>[M] struggles to break free from the rejuvination pod!</span>",\
"<span class='notice'>You struggle to break free from the rejuvination pod... (Stay still for 15 seconds.)</span>",\
"<span class='italics'>You hear squelching...</span>")
if(!do_after(M, 15 SECONDS, target = src))
if(M && M.buckled)
to_chat(M, "<span class='warning'>You fail to escape \the [src]!</span>")
return
if(!M.buckled)
return
M.visible_message("<span class='warning'>[M] breaks free from the rejuvination pod!</span>",\
"<span class='notice'>You break free from the rejuvination pod!</span>",\
"<span class='italics'>You hear squelching...</span>")
unbuckle_mob(M)
add_fingerprint(user)
/obj/structure/bed/revival_nest/post_unbuckle_mob(mob/living/M)
STOP_PROCESSING(SSobj, src)
deltimer(revive_or_decay_timer)
/obj/structure/bed/revival_nest/process()
for(var/mob/living/buckled_mob in buckled_mobs)
processing_ticks++
if(isalien(buckled_mob))
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_or_decay_timer)
revive_or_decay_timer = addtimer(CALLBACK(src, PROC_REF(revive_dead_alien), buckled_mob), 40 SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE)
else
buckled_mob.adjustBruteLoss(3)
buckled_mob.adjustFireLoss(3)
/obj/structure/bed/revival_nest/proc/revive_dead_alien(mob/living/carbon/alien/dead_alien)
dead_alien.revive()
dead_alien.visible_message("<span class='warning'>Vines seep into the back of [dead_alien], and it awakes with a burning rage!</span>")
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, "<span class='warning'>We already have an alive queen. We've been reverted to our drone form!</span>")
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) || (get_dist(src, user) > 1) || (M.loc != loc) || user.incapacitated() || M.buckled)
return
if(!user.get_int_organ(/obj/item/organ/internal/alien/hivenode))
to_chat(user, "<span class='noticealien'>Your lack of linkage to the hive prevents you from buckling [M] into [src].</span>")
return
if(has_buckled_mobs())
unbuckle_all_mobs()
if(buckle_mob(M))
M.visible_message("<span class='notice'>[user] secretes a thick vile goo, securing [M] into [src]!</span>",\
"<span class='danger'>[user] drenches you in a foul-smelling resin, trapping you in [src]!</span>",\
"<span class='italics'>You hear squelching...</span>")
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)