mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
[MIRROR] up ports misc gripper, gargoyle, petrification, some message fixes (#9566)
Co-authored-by: Heroman3003 <31296024+Heroman3003@users.noreply.github.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
b4c7c534a9
commit
03e4547819
@@ -1,101 +0,0 @@
|
||||
/datum/component/gargoyle
|
||||
var/energy = 100
|
||||
var/transformed = FALSE
|
||||
var/paused = FALSE
|
||||
var/paused_loc
|
||||
var/cooldown
|
||||
|
||||
var/mob/living/carbon/human/gargoyle //easy reference
|
||||
var/obj/structure/gargoyle/statue //another easy ref
|
||||
|
||||
//Adjustable mod
|
||||
var/identifier = "statue"
|
||||
var/adjective = "hardens"
|
||||
var/material = "stone"
|
||||
var/tint = "#FFFFFF"
|
||||
|
||||
/datum/component/gargoyle/Initialize()
|
||||
if (!ishuman(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
gargoyle = parent
|
||||
add_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_transformation) //CHOMPEdit TGPanel
|
||||
add_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_pause) //CHOMPEdit TGPanel
|
||||
add_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_checkenergy) //CHOMPEdit TGPanel
|
||||
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/datum/component/gargoyle/process()
|
||||
if (QDELETED(gargoyle))
|
||||
return
|
||||
if (paused && gargoyle.loc != paused_loc)
|
||||
unpause()
|
||||
if (energy > 0)
|
||||
if (!transformed && !paused)
|
||||
energy = max(0,energy-0.05)
|
||||
else if (!transformed && isturf(gargoyle.loc))
|
||||
gargoyle.gargoyle_transformation()
|
||||
if (transformed)
|
||||
if (!statue)
|
||||
transformed = FALSE
|
||||
statue.damage(-0.5)
|
||||
energy = min(energy+0.3, 100)
|
||||
|
||||
/datum/component/gargoyle/proc/unpause()
|
||||
if (!paused || transformed)
|
||||
paused = FALSE
|
||||
paused_loc = null
|
||||
UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING)
|
||||
return
|
||||
if (gargoyle?.loc != paused_loc)
|
||||
paused = FALSE
|
||||
paused_loc = null
|
||||
energy = max(energy - 5, 0)
|
||||
if (energy == 0)
|
||||
gargoyle.gargoyle_transformation()
|
||||
UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING)
|
||||
|
||||
//verbs or action buttons...?
|
||||
/mob/living/carbon/human/proc/gargoyle_transformation()
|
||||
set name = "Gargoyle - Petrification"
|
||||
set category = "Abilities.Gargoyle"
|
||||
set desc = "Turn yourself into (or back from) being a gargoyle."
|
||||
|
||||
if (stat == DEAD)
|
||||
return
|
||||
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
if (comp.energy <= 0 && isturf(loc))
|
||||
to_chat(src, span_danger("You suddenly turn into a [comp.identifier] as you run out of energy!"))
|
||||
else if (comp.cooldown > world.time)
|
||||
var/time_to_wait = (comp.cooldown - world.time) / (1 SECONDS)
|
||||
to_chat(src, span_warning("You can't transform just yet again! Wait for another [round(time_to_wait,0.1)] seconds!"))
|
||||
return
|
||||
if (istype(loc, /obj/structure/gargoyle))
|
||||
qdel(loc)
|
||||
else if (isturf(loc))
|
||||
new /obj/structure/gargoyle(loc, src)
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_pause()
|
||||
set name = "Gargoyle - Pause"
|
||||
set category = "Abilities.Gargoyle"
|
||||
set desc = "Pause your energy while standing still, so you don't use up any more, though you will lose a small amount upon moving again."
|
||||
|
||||
if (stat)
|
||||
return
|
||||
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp && !comp.transformed && !comp.paused)
|
||||
comp.paused = TRUE
|
||||
comp.paused_loc = loc
|
||||
comp.RegisterSignal(src, COMSIG_ATOM_ENTERING, /datum/component/gargoyle/proc/unpause)
|
||||
to_chat(src, span_notice("You start conserving your energy."))
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_checkenergy()
|
||||
set name = "Gargoyle - Check Energy"
|
||||
set category = "Abilities.Gargoyle"
|
||||
set desc = "Check how much energy you have remaining as a gargoyle."
|
||||
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
to_chat(src, span_notice("You have [round(comp.energy,0.01)] energy remaining. It is currently [comp.paused ? "stable" : (comp.transformed ? "increasing" : "decreasing")]."))
|
||||
@@ -1,254 +0,0 @@
|
||||
/obj/machinery/petrification
|
||||
name = "odd interface"
|
||||
desc = "An odd looking machine with an interface, some buttons and a tiny keyboard on the side."
|
||||
icon = 'modular_chomp/icons/obj/machines/other.dmi'
|
||||
icon_state = "petrification"
|
||||
|
||||
idle_power_usage = 100
|
||||
active_power_usage = 1000
|
||||
use_power = USE_POWER_IDLE
|
||||
anchored = TRUE
|
||||
unacidable = TRUE
|
||||
dir = EAST
|
||||
var/material = "stone"
|
||||
var/identifier = "statue"
|
||||
var/adjective = "hardens"
|
||||
var/tint = "#ffffff"
|
||||
var/able_to_unpetrify = TRUE
|
||||
var/discard_clothes = TRUE
|
||||
var/mob/living/carbon/human/target
|
||||
var/list/remotes = list()
|
||||
|
||||
/obj/machinery/petrification/New()
|
||||
. = ..()
|
||||
if(!pixel_x && !pixel_y)
|
||||
pixel_x = (dir & 3) ? 0 : (dir == 4 ? 26 : -26)
|
||||
pixel_y = (dir & 3) ? (dir == 1 ? 26 : -26) : 0
|
||||
|
||||
/obj/machinery/petrification/proc/get_viable_targets()
|
||||
var/list/targets = list()
|
||||
//dir is the opposite of whichever direction we want to scan
|
||||
var/turf/center
|
||||
center = get_step(src, turn(dir, 180))
|
||||
if (!center)
|
||||
return
|
||||
//square of 3x3 in front of the device
|
||||
for (var/n = center.x-1; n <= center.x+1; n++)
|
||||
for (var/m = center.y-1; m <= center.y+1; m++)
|
||||
var/turf/T = locate(n,m,z)
|
||||
if (!isturf(T))
|
||||
continue
|
||||
for (var/mob/living/carbon/human/H in T)
|
||||
if (H.stat == DEAD)
|
||||
continue
|
||||
var/option = "[H]["[H]" != H.real_name ? " ([H.real_name])" : ""]"
|
||||
var/r = 1
|
||||
if (option in targets)
|
||||
while ("[option] ([r])" in targets)
|
||||
r += 1
|
||||
option = "[option] ([r])"
|
||||
targets[option] = H
|
||||
return targets
|
||||
|
||||
/obj/machinery/petrification/proc/is_valid_target(var/mob/living/carbon/human/H)
|
||||
if (QDELETED(H) || !istype(H) || !H.client)
|
||||
return FALSE
|
||||
var/turf/T = H.loc
|
||||
if (!isturf(T))
|
||||
return FALSE
|
||||
var/turf/center
|
||||
center = get_step(get_turf(src), turn(dir, 180))
|
||||
if (!center)
|
||||
return
|
||||
if (T.z != z || T.x > center.x + 1 || T.x < center.x - 1 || T.y > center.y + 1 || T.y < center.y - 1)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/petrification/proc/popup_msg(var/message, var/notice = TRUE)
|
||||
if (notice)
|
||||
message = "A notice pops up on the interface: \"[message]\""
|
||||
if (target)
|
||||
to_chat(usr, span_notice("[message]"))
|
||||
|
||||
/obj/machinery/petrification/proc/petrify(var/obj/item/petrifier/petrifier = null)
|
||||
. = FALSE
|
||||
var/mat = material
|
||||
var/idt = identifier
|
||||
var/adj = adjective
|
||||
var/tnt = tint
|
||||
var/can_unpetrify = able_to_unpetrify
|
||||
var/no_clothes = discard_clothes
|
||||
var/mob/living/carbon/human/statue = target
|
||||
if (petrifier && istype(petrifier))
|
||||
mat = petrifier.material
|
||||
idt = petrifier.identifier
|
||||
adj = petrifier.adjective
|
||||
tnt = petrifier.tint
|
||||
can_unpetrify = petrifier.able_to_unpetrify
|
||||
no_clothes = petrifier.discard_clothes
|
||||
statue = petrifier.target
|
||||
if (QDELETED(statue) || !istype(statue))
|
||||
popup_msg("Invalid target.")
|
||||
return
|
||||
if (statue.stat == DEAD)
|
||||
popup_msg("The target must be alive.")
|
||||
return
|
||||
if (!statue.client)
|
||||
popup_msg("The target must be capable of conscious thought.")
|
||||
return
|
||||
if (!istext(mat) || !istext(idt) || !istext(adj) || !istext(tnt))
|
||||
popup_msg("Invalid options.")
|
||||
var/turf/T = statue.loc
|
||||
if (!istype(T))
|
||||
popup_msg("They must be visible to the [petrifier ? "device" : "machine"].")
|
||||
if (!petrifier)
|
||||
var/turf/center = get_step(get_turf(src), turn(dir, 180))
|
||||
if (!center)
|
||||
return
|
||||
if (T.z != z || T.x > center.x + 1 || T.x < center.x - 1 || T.y > center.y + 1 || T.y < center.y - 1)
|
||||
popup_msg("They are out of range. They must be standing within a 3x3 square in front of the machine.")
|
||||
return
|
||||
else
|
||||
var/turf/center = get_turf(petrifier)
|
||||
if (!center)
|
||||
return
|
||||
if (T.z != center.z || get_dist(center, T) > 4)
|
||||
popup_msg("They are out of range. They must be standing within 4 tiles of the device.")
|
||||
return
|
||||
var/datum/component/gargoyle/comp = statue.GetComponent(/datum/component/gargoyle)
|
||||
if (no_clothes)
|
||||
for(var/obj/item/W in statue)
|
||||
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
|
||||
continue
|
||||
statue.drop_from_inventory(W)
|
||||
|
||||
var/obj/structure/gargoyle/G = new(T, statue, idt, mat, adj, tnt, can_unpetrify, no_clothes)
|
||||
G.was_rayed = TRUE
|
||||
|
||||
if (can_unpetrify)
|
||||
add_verb(statue,/mob/living/carbon/human/proc/gargoyle_transformation) //CHOMPEdit TGPanel
|
||||
comp?.cooldown = 0
|
||||
else
|
||||
remove_verb(statue,/mob/living/carbon/human/proc/gargoyle_transformation) //CHOMPEdit
|
||||
remove_verb(statue,/mob/living/carbon/human/proc/gargoyle_pause) //CHOMPEdit
|
||||
remove_verb(statue,/mob/living/carbon/human/proc/gargoyle_checkenergy) //CHOMPEdit
|
||||
comp?.cooldown = INFINITY
|
||||
|
||||
if (!petrifier)
|
||||
visible_message(span_notice("A ray of purple light streams out of \the [src], aimed directly at [statue]. Everywhere the light touches on them quickly [adj] into [mat]."))
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/petrification/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
user.set_machine(src)
|
||||
tgui_interact(user)
|
||||
|
||||
/obj/machinery/petrification/tgui_interact(mob/user, datum/tgui/ui = null)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
if(!ui)
|
||||
ui = new(user, src, "PetrificationInterface", name)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/petrification/tgui_data(mob/user)
|
||||
var/list/data = list()
|
||||
data["material"] = material
|
||||
data["identifier"] = identifier
|
||||
data["adjective"] = adjective
|
||||
data["tint"] = tint
|
||||
var/list/h = rgb2num(tint)
|
||||
data["t"] = ((h[1]*0.299)+(h[2]*0.587)+(h[3]*0.114)) > 102 //0.4 luminance
|
||||
data["target"] = "[target ? target : "None"]"
|
||||
data["able_to_unpetrify"] = able_to_unpetrify
|
||||
data["discard_clothes"] = discard_clothes
|
||||
data["can_remote"] = is_valid_target(target) && istext(material) && istext(identifier) && istext(adjective) && istext(tint)
|
||||
return data
|
||||
|
||||
/obj/machinery/petrification/proc/set_input(var/option)
|
||||
var/list/only_these = list("tint","material","identifier","adjective","able_to_unpetrify","discard_clothes","target")
|
||||
if (!(option in only_these))
|
||||
return
|
||||
switch(option)
|
||||
if("tint")
|
||||
var/new_color = input(usr, "Choose the color for the [identifier] to be:", "Statue color", tint) as color|null
|
||||
if (new_color)
|
||||
tint = new_color
|
||||
if("material","identifier","adjective")
|
||||
var/input = tgui_input_text(usr, "What should the [option] be?", "Statue [option]", vars[option], MAX_NAME_LEN)
|
||||
input = sanitizeSafe(input, 25)
|
||||
if (length(input) <= 0)
|
||||
return
|
||||
if (option == "adjective")
|
||||
if (copytext_char(input, -1) != "s")
|
||||
switch(copytext_char(input, -2))
|
||||
if ("ss")
|
||||
input += "es"
|
||||
if ("sh")
|
||||
input += "es"
|
||||
if ("ch")
|
||||
input += "es"
|
||||
else
|
||||
switch(copytext_char(input, -1))
|
||||
if("s", "x", "z")
|
||||
input += "es"
|
||||
else
|
||||
input += "s"
|
||||
vars[option] = input
|
||||
if("able_to_unpetrify", "discard_clothes")
|
||||
vars[option] = !vars[option]
|
||||
if("target")
|
||||
var/list/targets = get_viable_targets()
|
||||
if (!length(targets))
|
||||
popup_msg("No targets within range. Make sure there is a humanoid being within a 3x3 metre square in front of the interface.")
|
||||
return
|
||||
var/selected = input(usr, "Choose the target.", "Petrification Target") as null|anything in targets
|
||||
if (selected && ishuman(targets[selected]) && is_valid_target(targets[selected]))
|
||||
var/confirmation = tgui_alert(targets[selected], "You have been selected as a petrification target. If you press confirm, you will possibly be turned into a statue, and if the option is selected, possibly one that cannot be reverted back from a statue at all.","Petrification Target",list("Confirm", "Cancel"))
|
||||
if (confirmation != "Confirm")
|
||||
popup_msg("They declined the request.", FALSE)
|
||||
return
|
||||
var/double = tgui_alert(targets[selected], "This is your last warning, are you -certain-?","Petrification Target",list("Confirm", "Cancel"))
|
||||
if (confirmation == "Confirm" && double == "Confirm")
|
||||
target = targets[selected]
|
||||
else
|
||||
popup_msg("They declined the request.", FALSE)
|
||||
|
||||
/obj/machinery/petrification/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
|
||||
if(..())
|
||||
return TRUE
|
||||
|
||||
if (usr)
|
||||
add_fingerprint(usr)
|
||||
|
||||
switch(action)
|
||||
if("set_option")
|
||||
if (params["option"])
|
||||
set_input(params["option"])
|
||||
SStgui.update_uis(src)
|
||||
return TRUE
|
||||
if("petrify")
|
||||
petrify()
|
||||
return TRUE
|
||||
if("remote")
|
||||
if (is_valid_target(target) && istext(material) && istext(identifier) && istext(adjective) && istext(tint))
|
||||
var/obj/item/petrifier/PE = remotes[target]
|
||||
if (!QDELETED(PE))
|
||||
PE.visible_message(span_warning("\The [PE] disappears!"))
|
||||
qdel(PE)
|
||||
var/obj/item/petrifier/P = new(loc, src)
|
||||
P.material = material
|
||||
P.identifier = identifier
|
||||
P.adjective = adjective
|
||||
P.tint = tint
|
||||
P.able_to_unpetrify = able_to_unpetrify
|
||||
P.discard_clothes = discard_clothes
|
||||
P.target = target
|
||||
remotes[target] = P
|
||||
usr.put_in_hands(P)
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
/obj/item/paper/petrification_notes
|
||||
name = "written notes"
|
||||
info = "<font face=\"Times New Roman\">" + span_italics("Found this buried in the machine over there after digging through it a bit- I hooked it up to one of our displays so it was a bit more usable- seems to be a spare part, it was right next to another one that actually " + span_bold("was") + " hooked up. Turns things into other materials, probably one of the components that makes that machine work.") + "</font>"
|
||||
@@ -1,28 +0,0 @@
|
||||
/obj/item/petrifier
|
||||
name = "odd button"
|
||||
desc = "A metal device with a single, purple button on it, and a tiny interface."
|
||||
icon = 'modular_chomp/icons/obj/machines/other.dmi'
|
||||
icon_state = "petrifier"
|
||||
|
||||
var/mob/living/carbon/human/target
|
||||
var/identifier = "statue"
|
||||
var/material = "stone"
|
||||
var/adjective = "hardens"
|
||||
var/tint = "#FFFFFF"
|
||||
var/discard_clothes = TRUE
|
||||
var/able_to_unpetrify = TRUE
|
||||
var/obj/machinery/petrification/linked
|
||||
|
||||
/obj/item/petrifier/Initialize(mapload, var/to_link)
|
||||
. = ..()
|
||||
linked = to_link
|
||||
|
||||
/obj/item/petrifier/attack_self(var/mob/user)
|
||||
. = ..()
|
||||
if (!isturf(user.loc) && user.get_ultimate_mob() != target)
|
||||
to_chat(user, span_warning("The device beeps but does nothing."))
|
||||
return
|
||||
if (linked?.petrify(src))
|
||||
visible_message(span_notice("A ray of purple light streams out of \the [src], aimed directly at [target]. Everywhere the light touches on them quickly [adjective] into [material]."))
|
||||
to_chat(user, span_warning("The device fizzles and crumbles into dust."))
|
||||
qdel(src)
|
||||
@@ -1,293 +0,0 @@
|
||||
/obj/structure/gargoyle
|
||||
name = "statue"
|
||||
desc = "A very lifelike carving."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/mob/living/carbon/human/gargoyle
|
||||
var/initial_sleep
|
||||
var/initial_blind
|
||||
var/initial_is_shifted
|
||||
var/initial_lying
|
||||
var/initial_lying_prev
|
||||
var/wagging
|
||||
var/flapping
|
||||
var/obj_integrity = 100
|
||||
var/original_int = 100
|
||||
var/max_integrity = 100
|
||||
var/stored_examine
|
||||
var/identifier = "statue"
|
||||
var/material = "stone"
|
||||
var/adjective = "hardens"
|
||||
var/list/tail_lower_dirs = list(SOUTH, EAST, WEST)
|
||||
var/image/tail_image
|
||||
var/tail_alt = TAIL_UPPER_LAYER
|
||||
|
||||
var/can_revert = TRUE
|
||||
var/was_rayed = FALSE
|
||||
|
||||
/obj/structure/gargoyle/Initialize(mapload, var/mob/living/carbon/human/H, var/ident_ovr, var/mat_ovr, var/adj_ovr, var/tint_ovr, var/revert = TRUE, var/discard_clothes)
|
||||
. = ..()
|
||||
if (isspace(loc) || isopenspace(loc))
|
||||
anchored = FALSE
|
||||
if (!istype(H) || !isturf(H.loc))
|
||||
return
|
||||
var/datum/component/gargoyle/comp = H.GetComponent(/datum/component/gargoyle)
|
||||
var/tint = "#FFFFFF"
|
||||
if (comp)
|
||||
comp.cooldown = world.time + (15 SECONDS)
|
||||
comp.statue = src
|
||||
comp.transformed = TRUE
|
||||
comp.paused = FALSE
|
||||
identifier = length(comp.identifier) > 0 ? comp.identifier : initial(identifier)
|
||||
material = length(comp.material) > 0 ? comp.material : initial(material)
|
||||
tint = length(comp.tint) > 0 ? comp.tint : initial(tint)
|
||||
adjective = length(comp.adjective) > 0 ? comp.adjective : initial(adjective)
|
||||
if (copytext_char(adjective, -1) != "s")
|
||||
adjective += "s"
|
||||
gargoyle = H
|
||||
|
||||
if (H.get_effective_size(TRUE) < 0.5) // "So small! I can step over it!"
|
||||
density = FALSE
|
||||
|
||||
if (ident_ovr)
|
||||
identifier = ident_ovr
|
||||
if (mat_ovr)
|
||||
material = mat_ovr
|
||||
if (adj_ovr)
|
||||
adjective = adj_ovr
|
||||
if (tint_ovr)
|
||||
tint = tint_ovr
|
||||
|
||||
if (H.tail_style?.clip_mask_state)
|
||||
tail_lower_dirs.Cut()
|
||||
else if (H.tail_style)
|
||||
tail_lower_dirs = H.tail_style.lower_layer_dirs.Copy()
|
||||
tail_alt = H.tail_alt ? TAIL_UPPER_LAYER_ALT : TAIL_UPPER_LAYER
|
||||
|
||||
max_integrity = H.getMaxHealth() + 100
|
||||
obj_integrity = H.health + 100
|
||||
original_int = obj_integrity
|
||||
name = "[identifier] of [H.name]"
|
||||
desc = "A very lifelike [identifier] made of [material]."
|
||||
stored_examine = H.examine(H)
|
||||
description_fluff = H.get_description_fluff()
|
||||
|
||||
if (H.buckled)
|
||||
H.buckled.unbuckle_mob(H, TRUE)
|
||||
//icon = H.icon
|
||||
//copy_overlays(H)
|
||||
|
||||
//calculate our tints
|
||||
var/list/RGB = rgb2num(tint)
|
||||
|
||||
var/colorr = rgb(RGB[1]*0.299, RGB[2]*0.299, RGB[3]*0.299)
|
||||
var/colorg = rgb(RGB[1]*0.587, RGB[2]*0.587, RGB[3]*0.587)
|
||||
var/colorb = rgb(RGB[1]*0.114, RGB[2]*0.114, RGB[3]*0.114)
|
||||
|
||||
var/tint_color = list(colorr, colorg, colorb, "#000000")
|
||||
|
||||
var/list/body_layers = HUMAN_BODY_LAYERS
|
||||
var/list/other_layers = HUMAN_OTHER_LAYERS
|
||||
for (var/i = 1; i <= length(H.overlays_standing); i++)
|
||||
if (i in other_layers)
|
||||
continue
|
||||
if (discard_clothes && !(i in body_layers))
|
||||
continue
|
||||
if (istype(H.overlays_standing[i], /image) && (i in body_layers))
|
||||
var/image/old_image = H.overlays_standing[i]
|
||||
var/image/new_image = image(old_image)
|
||||
if (i == TAIL_LOWER_LAYER || i == TAIL_UPPER_LAYER || i == TAIL_UPPER_LAYER_ALT)
|
||||
tail_image = new_image
|
||||
new_image.color = tint_color
|
||||
new_image.layer = old_image.layer
|
||||
add_overlay(new_image)
|
||||
else
|
||||
if (!isnull(H.overlays_standing[i]))
|
||||
add_overlay(H.overlays_standing[i])
|
||||
|
||||
initial_sleep = H.sleeping
|
||||
initial_blind = H.eye_blind
|
||||
initial_is_shifted = H.is_shifted
|
||||
transform = H.transform
|
||||
layer = H.layer
|
||||
pixel_x = H.pixel_x
|
||||
pixel_y = H.pixel_y
|
||||
dir = H.dir
|
||||
initial_lying = H.lying
|
||||
initial_lying_prev = H.lying_prev
|
||||
H.sdisabilities |= MUTE
|
||||
if (H.appearance_flags & PIXEL_SCALE)
|
||||
appearance_flags |= PIXEL_SCALE
|
||||
wagging = H.wagging
|
||||
H.transforming = TRUE
|
||||
flapping = H.flapping
|
||||
H.toggle_tail(FALSE, FALSE)
|
||||
H.toggle_wing(FALSE, FALSE)
|
||||
H.visible_message(span_warning("[H]'s skin rapidly [adjective] as they turn to [material]!"), span_warning("Your skin abruptly [adjective] as you turn to [material]!"))
|
||||
H.forceMove(src)
|
||||
H.SetBlinded(0)
|
||||
H.SetSleeping(0)
|
||||
H.status_flags |= GODMODE
|
||||
H.updatehealth()
|
||||
H.canmove = 0
|
||||
|
||||
can_revert = revert
|
||||
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/obj/structure/gargoyle/Destroy()
|
||||
STOP_PROCESSING(SSprocessing, src)
|
||||
if (!gargoyle)
|
||||
return ..()
|
||||
if (can_revert)
|
||||
unpetrify(deleting = FALSE) //don't delete if we're already deleting!
|
||||
else
|
||||
visible_message(span_warning("The [identifier] loses shape and crumbles into a pile of [material]!"))
|
||||
. = ..()
|
||||
|
||||
/obj/structure/gargoyle/process()
|
||||
if (!gargoyle)
|
||||
qdel(src)
|
||||
if (gargoyle.loc != src)
|
||||
can_revert = TRUE //something's gone wrong, they escaped, lets not qdel them
|
||||
unpetrify(deal_damage = FALSE, deleting = TRUE)
|
||||
|
||||
/obj/structure/gargoyle/examine_icon()
|
||||
var/icon/examine_icon = icon(icon=src.icon, icon_state=src.icon_state, dir=SOUTH, frame=1, moving=0) //CHOMPEdit might be needed
|
||||
examine_icon.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
return examine_icon
|
||||
|
||||
/obj/structure/gargoyle/get_description_info()
|
||||
if (gargoyle)
|
||||
if (isspace(loc) || isopenspace(loc))
|
||||
return
|
||||
return "It can be [anchored ? "un" : ""]anchored with a wrench."
|
||||
|
||||
/obj/structure/gargoyle/examine(mob/user)
|
||||
. = ..()
|
||||
if (gargoyle && stored_examine)
|
||||
. += "The [identifier] seems to have a bit more to them..."
|
||||
. += stored_examine
|
||||
return
|
||||
|
||||
/obj/structure/gargoyle/proc/unpetrify(var/deal_damage = TRUE, var/deleting = FALSE)
|
||||
if (!gargoyle)
|
||||
return
|
||||
var/datum/component/gargoyle/comp = gargoyle.GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
comp.cooldown = world.time + (15 SECONDS)
|
||||
comp.statue = null
|
||||
comp.transformed = FALSE
|
||||
else
|
||||
if (was_rayed)
|
||||
remove_verb(gargoyle,/mob/living/carbon/human/proc/gargoyle_transformation) //CHOMPEdit
|
||||
if (gargoyle.loc == src)
|
||||
gargoyle.forceMove(loc)
|
||||
gargoyle.transform = transform
|
||||
gargoyle.pixel_x = pixel_x
|
||||
gargoyle.pixel_y = pixel_y
|
||||
gargoyle.is_shifted = initial_is_shifted
|
||||
gargoyle.dir = dir
|
||||
gargoyle.lying = initial_lying
|
||||
gargoyle.lying_prev = initial_lying_prev
|
||||
gargoyle.toggle_tail(wagging, FALSE)
|
||||
gargoyle.toggle_wing(flapping, FALSE)
|
||||
gargoyle.sdisabilities &= ~MUTE //why is there no ADD_TRAIT etc here that's actually ussssed
|
||||
gargoyle.status_flags &= ~GODMODE
|
||||
gargoyle.SetBlinded(initial_blind)
|
||||
gargoyle.SetSleeping(initial_sleep)
|
||||
gargoyle.transforming = FALSE
|
||||
gargoyle.canmove = 1
|
||||
gargoyle.update_canmove()
|
||||
var/hurtmessage = ""
|
||||
if (deal_damage)
|
||||
if (obj_integrity < original_int)
|
||||
var/f = (original_int - obj_integrity) / 10
|
||||
for (var/x in 1 to 10)
|
||||
gargoyle.adjustBruteLoss(f)
|
||||
hurtmessage = " " + span_bold("You feel your body take the damage that was dealt while being [material]!")
|
||||
gargoyle.updatehealth()
|
||||
alpha = 0
|
||||
gargoyle.visible_message(span_warning("[gargoyle]'s skin rapidly reverts, returning them to normal!"), span_warning("Your skin reverts, freeing your movement once more![hurtmessage]"))
|
||||
gargoyle = null
|
||||
if (deleting)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/gargoyle/return_air()
|
||||
return return_air_for_internal_lifeform()
|
||||
|
||||
/obj/structure/gargoyle/return_air_for_internal_lifeform(var/mob/living/lifeform)
|
||||
var/air_type = /datum/gas_mixture/belly_air
|
||||
if(istype(lifeform))
|
||||
air_type = lifeform.get_perfect_belly_air_type()
|
||||
var/air = new air_type(1000)
|
||||
return air
|
||||
|
||||
/obj/structure/gargoyle/proc/damage(var/damage)
|
||||
if (was_rayed)
|
||||
return //gargoyle quick regenerates, the others don't, so let's not have them getting too damaged
|
||||
obj_integrity = min(obj_integrity-damage, max_integrity)
|
||||
if(obj_integrity <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/gargoyle/take_damage(var/damage)
|
||||
damage(damage)
|
||||
|
||||
/obj/structure/gargoyle/attack_generic(var/mob/user, var/damage, var/attack_message = "hits")
|
||||
user.do_attack_animation(src)
|
||||
visible_message(span_danger("[user] [attack_message] the [src]!"))
|
||||
damage(damage)
|
||||
|
||||
/obj/structure/gargoyle/attackby(var/obj/item/W as obj, var/mob/living/user as mob)
|
||||
if(W.is_wrench())
|
||||
if (isspace(loc) || isopenspace(loc))
|
||||
to_chat(user, span_warning("You can't anchor that here!"))
|
||||
anchored = FALSE
|
||||
return ..()
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
if (do_after(user, (2 SECONDS) * W.toolspeed, target = src))
|
||||
to_chat(user, span_notice("You [anchored ? "un" : ""]anchor the [src]."))
|
||||
anchored = !anchored
|
||||
else if(!isrobot(user) && gargoyle && gargoyle.vore_selected && gargoyle.trash_catching)
|
||||
if(istype(W,/obj/item/grab || /obj/item/holder))
|
||||
gargoyle.vore_attackby(W, user)
|
||||
return
|
||||
if(gargoyle.adminbus_trash || is_type_in_list(W,edible_trash) && W.trash_eatable && !is_type_in_list(W,item_vore_blacklist))
|
||||
to_chat(user, span_warning("You slip [W] into [gargoyle]'s [lowertext(gargoyle.vore_selected.name)] ."))
|
||||
user.drop_item()
|
||||
W.forceMove(gargoyle.vore_selected)
|
||||
return
|
||||
else if (!(W.flags & NOBLUDGEON))
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
if(W.damtype == BRUTE || W.damtype == BURN)
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, W.hitsound, 50, 1)
|
||||
damage(W.force)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/gargoyle/set_dir(var/new_dir)
|
||||
. = ..()
|
||||
if(. && tail_image)
|
||||
cut_overlay(tail_image)
|
||||
tail_image.layer = BODY_LAYER + ((dir in tail_lower_dirs) ? TAIL_LOWER_LAYER : tail_alt)
|
||||
add_overlay(tail_image)
|
||||
|
||||
/obj/structure/gargoyle/hitby(atom/movable/AM as mob|obj,var/speed = THROWFORCE_SPEED_DIVISOR)
|
||||
if(istype(AM,/obj/item) && gargoyle && gargoyle.vore_selected && gargoyle.trash_catching)
|
||||
var/obj/item/I = AM
|
||||
if(gargoyle.adminbus_trash || is_type_in_list(I,edible_trash) && I.trash_eatable && !is_type_in_list(I,item_vore_blacklist))
|
||||
gargoyle.hitby(AM, speed)
|
||||
return
|
||||
else if(istype(AM,/mob/living) && gargoyle)
|
||||
var/mob/living/L = AM
|
||||
if(gargoyle.throw_vore && L.throw_vore && gargoyle.can_be_drop_pred && L.can_be_drop_prey)
|
||||
var/drop_prey_temp = FALSE
|
||||
if(gargoyle.can_be_drop_prey)
|
||||
drop_prey_temp = TRUE
|
||||
gargoyle.can_be_drop_prey = FALSE //Making sure the original gargoyle body is not the one getting throwvored instead.
|
||||
gargoyle.hitby(L, speed)
|
||||
if(drop_prey_temp)
|
||||
gargoyle.can_be_drop_prey = TRUE
|
||||
return
|
||||
return ..()
|
||||
@@ -1,17 +0,0 @@
|
||||
//CHOMPADDITIONS
|
||||
/obj/item/gripper/scene
|
||||
name = "misc gripper"
|
||||
desc = "A simple grasping tool that can hold a variety of 'general' objects..."
|
||||
|
||||
can_hold = list(
|
||||
/obj/item/capture_crystal,
|
||||
/obj/item/clothing,
|
||||
/obj/item/implanter,
|
||||
/obj/item/disk/nifsoft/compliance,
|
||||
/obj/item/handcuffs,
|
||||
/obj/item/toy,
|
||||
/obj/item/petrifier,
|
||||
/obj/item/dice,
|
||||
/obj/item/casino_platinum_chip,
|
||||
/obj/item/spacecasinocash
|
||||
)
|
||||
Reference in New Issue
Block a user