mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 11:05:03 +01:00
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:
@@ -46,6 +46,7 @@
|
||||
var/obj/effect/decal/cleanable/C = locate() in src
|
||||
qdel(C)
|
||||
clean_blood()
|
||||
SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT)
|
||||
return TRUE
|
||||
|
||||
/atom/proc/can_clean() //For determining if a cleaning object can actually remove decals
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
|
||||
/obj/effect/acid/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
target = null
|
||||
@@ -67,6 +66,14 @@
|
||||
/obj/effect/acid/alien
|
||||
var/target_strength = 30
|
||||
|
||||
/obj/effect/acid/alien/Initialize(mapload, acid_pwr, acid_amt)
|
||||
. = ..()
|
||||
var/turf/cleanable_turf = get_turf(src)
|
||||
RegisterSignal(cleanable_turf, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(remove_acid))
|
||||
|
||||
/obj/effect/acid/alien/proc/remove_acid(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/acid/alien/process()
|
||||
. = ..()
|
||||
|
||||
@@ -192,6 +192,11 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
|
||||
SSacid.processing -= src
|
||||
deconstruct(FALSE)
|
||||
|
||||
/obj/cleaning_act(mob/user, atom/cleaner, cleanspeed, text_verb, text_description, text_targetname)
|
||||
. = ..()
|
||||
if(acid_level)
|
||||
acid_level = 0
|
||||
|
||||
//// FIRE
|
||||
|
||||
/obj/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user