mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Merge pull request #3694 from CHOMPStation2/upstream-merge-12264
[MIRROR] Buffs Morphs
This commit is contained in:
@@ -6,10 +6,11 @@
|
||||
desc = "A revolting, pulsating pile of flesh."
|
||||
tt_desc = "morphus shapeshiftus"
|
||||
icon = 'icons/mob/animal_vr.dmi'
|
||||
icon_state = "morph"
|
||||
icon_living = "morph"
|
||||
icon_dead = "morph_dead"
|
||||
icon_state = "new_morph"
|
||||
icon_living = "new_morph"
|
||||
icon_dead = "new_morph_dead"
|
||||
icon_rest = null
|
||||
color = "#658a62"
|
||||
movement_cooldown = 1
|
||||
status_flags = CANPUSH
|
||||
pass_flags = PASSTABLE
|
||||
@@ -25,8 +26,8 @@
|
||||
max_n2 = 0
|
||||
|
||||
minbodytemp = 0
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
taser_kill = FALSE
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 20
|
||||
@@ -42,6 +43,8 @@
|
||||
|
||||
showvoreprefs = 0
|
||||
vore_active = 1
|
||||
vore_default_mode = DM_HOLD
|
||||
|
||||
|
||||
var/morphed = FALSE
|
||||
var/tooltip = TRUE
|
||||
@@ -50,6 +53,8 @@
|
||||
var/atom/movable/form = null
|
||||
var/morph_time = 0
|
||||
var/our_size_multiplier = 1
|
||||
var/original_ckey
|
||||
var/chosen_color
|
||||
var/static/list/blacklist_typecache = typecacheof(list(
|
||||
/obj/screen,
|
||||
/obj/singularity,
|
||||
@@ -58,6 +63,10 @@
|
||||
|
||||
/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
|
||||
if(!istype(src, /mob/living/simple_mob/vore/hostile/morph/dominated_prey))
|
||||
verbs += /mob/living/simple_mob/vore/hostile/morph/proc/morph_color
|
||||
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_mob/vore/hostile/morph/Destroy()
|
||||
@@ -70,7 +79,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
|
||||
. = ..()
|
||||
@@ -100,6 +109,7 @@
|
||||
form = target
|
||||
|
||||
visible_message("<span class='warning'>[src] suddenly twists and changes shape, becoming a copy of [target]!</span>")
|
||||
color = null
|
||||
name = target.name
|
||||
desc = target.desc
|
||||
icon = target.icon
|
||||
@@ -146,6 +156,8 @@
|
||||
desc = initial(desc)
|
||||
|
||||
icon = initial(icon)
|
||||
if(chosen_color)
|
||||
color = chosen_color
|
||||
icon_state = initial(icon_state)
|
||||
|
||||
alpha = initial(alpha)
|
||||
@@ -193,6 +205,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 +243,99 @@
|
||||
src.transform = M
|
||||
else
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/vore/hostile/morph/proc/morph_color()
|
||||
set name = "Pick Color"
|
||||
set category = "Abilities"
|
||||
set desc = "You can set your color!"
|
||||
var/newcolor = input(usr, "Choose a color.", "", color) as color|null
|
||||
if(newcolor)
|
||||
color = newcolor
|
||||
chosen_color = newcolor
|
||||
|
||||
|
||||
/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
|
||||
var/prey_ckey
|
||||
|
||||
|
||||
/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)
|
||||
|
||||
@@ -412,6 +412,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)
|
||||
|
||||
@@ -428,6 +428,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, "Please feel free to press use this button at any time you are uncomfortable and in a belly. Consent is important.", "Confirmation", list("Okay", "Cancel")) //CHOMPedit
|
||||
if(confirm != "Okay" || loc != B)
|
||||
@@ -468,7 +473,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>")
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 36 KiB |
Reference in New Issue
Block a user