From 61613bfceb7ce22ad314973d3007130d8323b317 Mon Sep 17 00:00:00 2001 From: CHOMPStation2StaffMirrorBot <94713762+CHOMPStation2StaffMirrorBot@users.noreply.github.com> Date: Wed, 11 Dec 2024 00:40:43 -0700 Subject: [PATCH] [MIRROR] Shapeshifter love (#9621) Co-authored-by: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> --- .../carbon/human/species/lleill/hanner.dm | 2 + .../carbon/human/species/lleill/lleill.dm | 2 + .../human/species/species_shapeshift_vr.dm | 99 +++++++++++++++++++ .../human/species/station/replicant_crew.dm | 4 +- 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species/lleill/hanner.dm b/code/modules/mob/living/carbon/human/species/lleill/hanner.dm index 39fb9f749a..276be69091 100644 --- a/code/modules/mob/living/carbon/human/species/lleill/hanner.dm +++ b/code/modules/mob/living/carbon/human/species/lleill/hanner.dm @@ -90,6 +90,8 @@ /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears, /mob/living/carbon/human/proc/shapeshifter_select_eye_colour, /mob/living/proc/set_size, + /mob/living/carbon/human/proc/shapeshifter_copy_body, + /mob/living/carbon/human/proc/shapeshifter_regenerate, // /mob/living/carbon/human/proc/lleill_contact, // /mob/living/carbon/human/proc/lleill_alchemy, // /mob/living/carbon/human/proc/hanner_beast_form diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm index 23df1e2ca2..3f8f8de048 100644 --- a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm +++ b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm @@ -84,6 +84,8 @@ /mob/living/carbon/human/proc/shapeshifter_select_ears, /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears, /mob/living/proc/set_size, + /mob/living/carbon/human/proc/shapeshifter_copy_body, + /mob/living/carbon/human/proc/shapeshifter_regenerate, // /mob/living/carbon/human/proc/lleill_invisibility, // /mob/living/carbon/human/proc/lleill_transmute, // /mob/living/carbon/human/proc/lleill_rings, diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm index 6dc8616210..35548d6288 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift_vr.dm @@ -223,3 +223,102 @@ if (visible) visible_message(span_filter_notice(span_bold("\The [src]") + " shifts and contorts, taking the form of \a [new_species]!")) regenerate_icons() + + +//////////////////// Shapeshifter copy-body powers +/// Copied from the protean version, but with some tweaks to match non-protean shapeshifters such as lleill, hanner and replicants + +/mob/living/carbon/human/proc/shapeshifter_regenerate() + set name = "Fully Reform" + set desc = "Reload your appearance from whatever character slot you have loaded." + set category = "Abilities.Shapeshift" + var/mob/living/character = src + if(temporary_form) + character = temporary_form + var/input = tgui_alert(character,{"Do you want to copy the appearance data of your currently loaded save slot?"},"Reformation",list("Reform","Cancel")) + if(input == "Cancel" || !input) + return + else + input = tgui_alert(character,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/flavour = 0 + if(input == "Yes") + flavour = 1 + input = tgui_alert(character,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/oocnotes = 0 + if(input == "Yes") + oocnotes = 1 + to_chat(character, span_notify("You begin to reform. You will need to remain still.")) + character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reform.")) + if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE)) + if(character.client.prefs) //Make sure we didn't d/c + character.client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE) + character.visible_message(span_notify("[character] adopts a new form!"), span_danger("You have reformed.")) + +/mob/living/carbon/human/proc/shapeshifter_copy_body() + set name = "Copy Form" + set desc = "If you are aggressively grabbing someone, with their consent, you can turn into a copy of them. (Without their name)." + set category = "Abilities.Shapeshift" + var/mob/living/character = src + if(temporary_form) + character = temporary_form + + var/grabbing_but_not_enough + var/mob/living/carbon/human/victim = null + for(var/obj/item/grab/G in character) + if(G.state < GRAB_AGGRESSIVE) + grabbing_but_not_enough = TRUE + return + else + victim = G.affecting + if (!victim) + if (grabbing_but_not_enough) + to_chat(character, span_warning("You need a better grip to do that!")) + else + to_chat(character, span_notice("You need to be aggressively grabbing someone before you can copy their form.")) + return + if (!istype(victim)) + to_chat(character, span_warning("You can only perform this on human mobs!")) + return + if (!victim.client) + to_chat(character, span_notice("The person you try this on must have a client!")) + return + + + to_chat(character, span_notice("Waiting for other person's consent.")) + var/consent = tgui_alert(victim, "Allow [src] to copy what you look like?", "Consent", list("Yes", "No")) + if (consent != "Yes") + to_chat(character, span_notice("They declined your request.")) + return + + var/input = tgui_alert(character,{"Copy [victim]'s flavourtext?"},"Copy Form",list("Yes","No","Cancel")) + if(input == "Cancel" || !input) + return + var/flavour = 0 + if(input == "Yes") + flavour = 1 + + var/checking = FALSE + for(var/obj/item/grab/G in character) + if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) + checking = TRUE + if (!checking) + to_chat(character, span_warning("You lost your grip on [victim]!")) + return + + to_chat(character, span_notify("You begin to reassemble into [victim]. You will need to remain still.")) + character.visible_message(span_notify("[character] rapidly contorts and shifts!"), span_danger("You begin to reassemble into [victim].")) + if(do_after(character, 40,exclusive = TASK_ALL_EXCLUSIVE)) + checking = FALSE + for(var/obj/item/grab/G in character) + if(G.affecting == victim && G.state >= GRAB_AGGRESSIVE) + checking = TRUE + if (!checking) + to_chat(character, span_warning("You lost your grip on [victim]!")) + return + if(character.client) //Make sure we didn't d/c + transform_into_other_human(victim, FALSE, flavour, FALSE) + character.visible_message(span_notify("[character] adopts the form of [victim]!"), span_danger("You have reassembled into [victim].")) diff --git a/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm b/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm index c8e7b769c3..c841ae4109 100644 --- a/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm +++ b/code/modules/mob/living/carbon/human/species/station/replicant_crew.dm @@ -47,5 +47,7 @@ /mob/living/carbon/human/proc/shapeshifter_select_ears, /mob/living/carbon/human/proc/shapeshifter_select_secondary_ears, /mob/living/carbon/human/proc/shapeshifter_select_eye_colour, - /mob/living/proc/set_size + /mob/living/proc/set_size, + /mob/living/carbon/human/proc/shapeshifter_copy_body, + /mob/living/carbon/human/proc/shapeshifter_regenerate )