From bb77e6d12d0485b414addcea36c19b10e1edf588 Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Mon, 9 Dec 2024 23:43:28 +0100 Subject: [PATCH] protean host assimilation --- .../station/protean_vr/protean_blob.dm | 6 ++++ .../station/protean_vr/protean_powers.dm | 32 ++++++++++++++++++ .../station/protean_vr/protean_species.dm | 17 ++++++---- icons/mob/species/protean/protean_powers.dmi | Bin 2578 -> 2771 bytes 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 961fc177bc..669b71bc44 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -137,6 +137,12 @@ set hidden = 1 humanform.nano_latch() +/mob/living/simple_mob/protean_blob/proc/nano_assimilate() + set name = "Assimilate Host" + set desc = "Allows a protean to assimilate a latched host, allowing them to devour them right away." + set hidden = 1 + humanform.nano_assimilate() + /mob/living/simple_mob/protean_blob/Login() ..() plane_holder.set_vis(VIS_AUGMENTED, 1) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 0b0fc60284..640e214b00 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -595,6 +595,32 @@ else to_chat(protie, span_warning("You need to be grabbing a humanoid mob aggressively to latch onto them.")) +/mob/living/carbon/human/proc/nano_assimilate() + set name = "Assimilate Host" + set desc = "Allows a protean to assimilate a latched host, allowing them to devour them right away." + set hidden = 1 + + var/mob/living/protie = src + var/mob/living/carbon/human/target + var/datum/species/protean/S = src.species + if(nano_dead_check(src)) + return + if(temporary_form) + protie = temporary_form + if(protie.loc == S.OurRig) + target = S.OurRig.wearer + if(!target) + to_chat(protie, span_vwarning("You need a host to assimilate.")) + return + if(!protie.can_be_drop_pred || !target.can_be_drop_prey || !target.devourable) + to_chat(protie, span_vwarning("You can't assimilate your current host.")) + return + target.drop_from_inventory(S.OurRig) + to_chat(protie, span_vnotice("You assimilate your host.")) + to_chat(target, span_vwarning("You feel yourself sink deeper into the suit!")) + target.forceMove(protie.vore_selected) + nano_blobform(TRUE) + /// /// /// A helper to reuse /mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R) if(istype(R)) @@ -704,6 +730,12 @@ icon_state = "latch" to_call = /mob/living/carbon/human/proc/nano_latch +/obj/effect/protean_ability/assimilate_host + ability_name = "Assimilate Host" + desc = "Allows a protean to assimilate a latched host, allowing them to devour them right away." + icon_state = "assimilate" + to_call = /mob/living/carbon/human/proc/nano_assimilate + /obj/effect/protean_ability/copy_form ability_name = "Copy Form" desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)." diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 484ccdbc8b..b663d748e9 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -99,6 +99,7 @@ /mob/living/carbon/human/proc/nano_copy_body, /mob/living/carbon/human/proc/appearance_switch, /mob/living/carbon/human/proc/nano_latch, + /mob/living/carbon/human/proc/nano_assimilate, /mob/living/proc/set_size, /mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally, /mob/living/carbon/human/proc/shapeshifter_select_hair, @@ -239,20 +240,22 @@ /datum/species/protean/handle_death(var/mob/living/carbon/human/H) if(!H) return //No body? - if(OurRig.dead) - return - OurRig.dead = 1 + if(OurRig) + if(OurRig.dead) + return + OurRig.dead = 1 var/mob/temp = H if(H.temporary_form) temp = H.temporary_form playsound(temp, 'sound/voice/borg_deathsound.ogg', 50, 1) temp.visible_message(span_bold("[temp.name]") + " shudders and retreats inwards, coalescing into a single core componant!") to_chat(temp, span_warning("You've died as a Protean! While dead, you will be locked to your core RIG control module until you can be repaired. Instructions to your revival can be found in the Examine tab when examining your module.")) - if(H.temporary_form) - if(!istype(H.temporary_form.loc, /obj/item/rig/protean)) + if(OurRig) + if(H.temporary_form) + if(!istype(H.temporary_form.loc, /obj/item/rig/protean)) + H.nano_rig_transform(1) + else H.nano_rig_transform(1) - else - H.nano_rig_transform(1) pseudodead = 1 /datum/species/protean/handle_environment_special(var/mob/living/carbon/human/H) diff --git a/icons/mob/species/protean/protean_powers.dmi b/icons/mob/species/protean/protean_powers.dmi index efcd821a813507c566afa4be18c7e80062d41f98..2ae91c094711693b9b7e13a1b128b5d9f2151adc 100644 GIT binary patch delta 2485 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 bnJ@eYj~x(JggZQR00000NkvXXu0mjf&|oRo