Buffs Morphs

Allows morphs a couple of neat new things

Resting:
While resting and morphed, morphs do not 'look strange'. 

If a morph stops resting while someone is on their turf, they may instantly, stealthily eat the person. (If prefs allow)

Take over prey:
A morph may choose to attempt to completely take over their prey's form, actually assuming control of their prey's body. 

This interaction allows the morph to pick any non-simple mob in any of their bellies that has a ckey. The morph gets a confirmation prompt, and the prey gets a double confirmation prompt. The prompt can only appear if the prey has the preference for allowing body impersonation enabled. 

For lack of an easy better option, this interaction is undone by way of the transformed morph ejecting the prey from their belly. Instead of actually ejecting the prey, it will restore both to their original conditions. (And THEN you can eject them if that's what you want to do) There is text explaining this to the morph when they succeed at the takeover.

OOC escape does also work with this, despite its complicated interaction. OOC escape returns both parties to their original bodies and undoes the effects of the interaction.
This commit is contained in:
VerySoft
2022-02-18 06:48:55 -05:00
parent 3a2f07a743
commit 21eb698c23
3 changed files with 116 additions and 2 deletions
@@ -42,6 +42,8 @@
showvoreprefs = 0
vore_active = 1
vore_default_mode = DM_HOLD
var/morphed = FALSE
var/tooltip = TRUE
@@ -50,6 +52,8 @@
var/atom/movable/form = null
var/morph_time = 0
var/our_size_multiplier = 1
var/original_ckey
var/prey_ckey
var/static/list/blacklist_typecache = typecacheof(list(
/obj/screen,
/obj/singularity,
@@ -58,6 +62,7 @@
/mob/living/simple_mob/vore/hostile/morph/Initialize()
verbs += /mob/living/proc/ventcrawl
verbs += /mob/living/simple_mob/vore/hostile/morph/proc/take_over_prey
return ..()
/mob/living/simple_mob/vore/hostile/morph/Destroy()
@@ -70,7 +75,7 @@
/mob/living/simple_mob/vore/hostile/morph/examine(mob/user)
if(morphed)
. = form.examine(user)
if(get_dist(user, src) <= 3)
if(get_dist(user, src) <= 3 && !resting)
. += "<span class='warning'>[form] doesn't look quite right...</span>"
else
. = ..()
@@ -193,6 +198,22 @@
var/temp_state = icon_state
..()
icon_state = temp_state
//Stolen from protean blobs, ambush noms from resting! Doesn't hide you any better, but makes noms sneakier.
if(resting)
plane = ABOVE_OBJ_PLANE
to_chat(src,"<span class='notice'>Your form settles in, appearing more 'normal'... laying in wait.</span>")
else
plane = MOB_PLANE
to_chat(src,"<span class='notice'>Your form quivers back to life, allowing you to move again!</span>")
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && target.devourable && target.can_be_drop_prey && vore_selected)
if(target.buckled)
target.buckled.unbuckle_mob(target, force = TRUE)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
else
..()
@@ -215,3 +236,88 @@
src.transform = M
else
..()
/mob/living/simple_mob/vore/hostile/morph/proc/take_over_prey()
set name = "Take Over Prey"
set category = "Abilities"
set desc = "Take command of your prey's body."
if(morphed)
to_chat(src, "<span class='warning'>You must restore to your original form first!</span>")
return
var/list/possible_mobs = list()
for(var/obj/belly/B in src.vore_organs)
for(var/mob/living/carbon/human/H in B)
if(ishuman(H) && H.ckey)
possible_mobs += H
else
continue
var/mob/living/carbon/human/M
var/input = tgui_input_list(src, "Select a mob to take over:", "Take Over Prey", possible_mobs)
if(!input)
return
M = input
if(!M)
return
if(M.resleeve_lock && ckey != M.resleeve_lock)
to_chat(src, "<span class='warning'>\The [M] cannot be impersonated!</span>")
return
if(tgui_alert(src, "You selected [M] to attempt to take over. Are you sure?", "Take Over Prey",list("No","Yes")) == "Yes")
log_admin("[key_name_admin(src)] offered [M] to swap bodies as a morph.")
if(tgui_alert(M, "\The [src] has elected to attempt to take over your body and control you. Is this something you will allow to happen?", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
if(tgui_alert(M, "Are you sure? The only way to undo this on your own is to OOC Escape.", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
original_ckey = ckey
log_and_message_admins("[key_name_admin(src)] has swapped bodies with [key_name_admin(M)] as a morph at [get_area(src)] - [COORD(src)].")
new /mob/living/simple_mob/vore/hostile/morph/dominated_prey(M.vore_selected, M.ckey, src, M)
else
to_chat(src, "<span class='warning'>\The [M] declined your request for control.</span>")
else
to_chat(src, "<span class='warning'>\The [M] declined your request for control.</span>")
/mob/living/simple_mob/vore/hostile/morph/dominated_prey
name = "subservient node"
color = "#171717"
digestable = 0
devourable = 0
var/mob/living/simple_mob/vore/hostile/morph/parent_morph
var/mob/living/carbon/human/prey_body
/mob/living/simple_mob/vore/hostile/morph/dominated_prey/New(loc, pckey, parent, prey)
. = ..()
if(pckey)
prey_ckey = pckey
parent_morph = parent
prey_body = prey
prey_body.forceMove(get_turf(parent_morph))
ckey = prey_ckey
prey_body.ckey = parent_morph.original_ckey
parent_morph.forceMove(src)
name = "[prey_body.name]"
to_chat(prey_body, "<span class='notice'>You have completely assumed the form of [prey_body]. Your form is now unable to change anymore until you restore control back to them. You can do this by 'ejecting' them from your [prey_body.vore_selected]. This will not actually release them from your body in this state, but instead return control to them, and restore you to your original form.</span>")
else
qdel(src)
/mob/living/simple_mob/vore/hostile/morph/dominated_prey/death(gibbed)
. = ..()
undo_prey_takeover(FALSE)
/mob/living/simple_mob/vore/hostile/morph/dominated_prey/Destroy()
. = ..()
parent_morph = null
prey_body = null
/mob/living/simple_mob/vore/hostile/morph/dominated_prey/proc/undo_prey_takeover(ooc_escape)
if(ooc_escape)
prey_body.forceMove(get_turf(src))
parent_morph.forceMove(get_turf(src))
parent_morph.ckey = parent_morph.original_ckey
prey_body.ckey = prey_ckey
log_and_message_admins("[key_name_admin(prey_body)] used the OOC escape button to get out of [key_name_admin(parent_morph)]. They have been returned to their original bodies. [ADMIN_FLW(src)]")
else
parent_morph.forceMove(get_turf(prey_body))
parent_morph.ckey = parent_morph.original_ckey
prey_body.ckey = prey_ckey
prey_body.forceMove(parent_morph.vore_selected)
log_and_message_admins("[key_name_admin(prey_body)] and [key_name_admin(parent_morph)] have been returned to their original bodies. [get_area(src)] - [COORD(src)].")
qdel(src)
+4
View File
@@ -354,6 +354,10 @@
if (!(M in contents))
return 0 // They weren't in this belly anyway
if(istype(M, /mob/living/simple_mob/vore/hostile/morph/dominated_prey))
var/mob/living/simple_mob/vore/hostile/morph/dominated_prey/p = M
p.undo_prey_takeover(FALSE)
return 0
for(var/mob/living/L in M.contents)
L.muffled = 0
for(var/obj/item/weapon/holder/H in M.contents)
+5 -1
View File
@@ -405,6 +405,11 @@
//You're in a belly!
if(isbelly(loc))
//You've been taken over by a morph
if(istype(src, /mob/living/simple_mob/vore/hostile/morph/dominated_prey))
var/mob/living/simple_mob/vore/hostile/morph/dominated_prey/s = src
s.undo_prey_takeover(TRUE)
return
var/obj/belly/B = loc
var/confirm = tgui_alert(src, "You're in a mob. Don't use this as a trick to get out of hostile animals. This is for escaping from preference-breaking and if you're otherwise unable to escape from endo (pred AFK for a long time).", "Confirmation", list("Okay", "Cancel"))
if(confirm != "Okay" || loc != B)
@@ -445,7 +450,6 @@
crystal.bound_mob = null
crystal.bound_mob = capture_crystal = 0
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [crystal] owned by [crystal.owner]. [ADMIN_FLW(src)]")
//Don't appear to be in a vore situation
else
to_chat(src,"<span class='alert'>You aren't inside anyone, though, is the thing.</span>")