From af6e039bba031a75d83e60317c05b94a5e9b9f53 Mon Sep 17 00:00:00 2001 From: SatinIsle Date: Tue, 10 Dec 2024 13:07:48 +0000 Subject: [PATCH] Shapeshifter love Added a fully reform ability to lleill, hanner and gamma replicants. Works the same as protean regeneration except without the option to heal yourself. Copies the appearance of your current slot minus any prosthetics (they get replaced with organic equivalents, so you don't just lose a hand, etc). Added the ability to copy form to lleill, hanner and gamma replicants. This works the same as the protean version, except it ignores prosthetics instead of forcing them. Allows the user to copy the appearance of someone they have grabbed, but only with their OOC consent. As lleill aren't technically shapeshifters codewise, they will still have to use the "select body type" verb to match the other person, but all other appearance bits are copied over fine. --- .../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 444139ce21..55663e30b6 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 )