[MIRROR] Spooky/Horror modifier & various tweaks/fixes (#11004)

Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-06-04 10:30:24 -07:00
committed by GitHub
parent a929887fa5
commit c487e78339
22 changed files with 682 additions and 100 deletions

View File

@@ -1254,7 +1254,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/crew_quarters/gym_private /area/crew_quarters/gym_private
name = "\improper Gym Sideroom" name = "\improper Gym Sideroom"
icon_state = "pool" icon_state = "pool"
/area/crew_quarters/sauna /area/crew_quarters/sauna
name = "\improper Sauna" name = "\improper Sauna"

View File

@@ -881,7 +881,7 @@ var/list/sacrificed = list()
var/datum/gender/TU = GLOB.gender_datums[cultist.get_visible_gender()] var/datum/gender/TU = GLOB.gender_datums[cultist.get_visible_gender()]
to_chat(user, span_warning("You cannot summon \the [cultist], for [TU.his] shackles of blood are strong.")) to_chat(user, span_warning("You cannot summon \the [cultist], for [TU.his] shackles of blood are strong."))
return fizzle() return fizzle()
cultist.loc = src.loc cultist.forceMove(src.loc)
cultist.lying = 1 cultist.lying = 1
cultist.regenerate_icons() cultist.regenerate_icons()

View File

@@ -137,7 +137,7 @@
switch(severity) switch(severity)
if(1.0) if(1.0)
for(var/atom/movable/A as mob|obj in src) for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc A.forceMove(src.loc)
ex_act(severity) ex_act(severity)
//Foreach goto(35) //Foreach goto(35)
//SN src = null //SN src = null
@@ -146,7 +146,7 @@
if(2.0) if(2.0)
if (prob(50)) if (prob(50))
for(var/atom/movable/A as mob|obj in src) for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc A.forceMove(src.loc)
ex_act(severity) ex_act(severity)
//Foreach goto(108) //Foreach goto(108)
//SN src = null //SN src = null
@@ -155,7 +155,7 @@
if(3.0) if(3.0)
if (prob(25)) if (prob(25))
for(var/atom/movable/A as mob|obj in src) for(var/atom/movable/A as mob|obj in src)
A.loc = src.loc A.forceMove(src.loc)
ex_act(severity) ex_act(severity)
//Foreach goto(181) //Foreach goto(181)
//SN src = null //SN src = null

View File

@@ -207,7 +207,6 @@
entry_vent = null entry_vent = null
else if(entry_vent) else if(entry_vent)
if(get_dist(src, entry_vent) <= 1) if(get_dist(src, entry_vent) <= 1)
//VOREStation Edit Start
var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = get_safe_ventcrawl_target(entry_vent) var/obj/machinery/atmospherics/unary/vent_pump/exit_vent = get_safe_ventcrawl_target(entry_vent)
if(!exit_vent) if(!exit_vent)
return return
@@ -235,8 +234,6 @@
var/area/new_area = get_area(loc) var/area/new_area = get_area(loc)
if(new_area) if(new_area)
new_area.Entered(src) new_area.Entered(src)
//VOREStation Edit End
//=================
if(isturf(loc)) if(isturf(loc))
skitter() skitter()
@@ -325,3 +322,18 @@
for(var/atom/movable/A in contents) for(var/atom/movable/A in contents)
A.loc = src.loc A.loc = src.loc
return ..() return ..()
/obj/effect/spider/spiderling/non_growing/horror
icon_state = "tendrils"
/obj/effect/spider/spiderling/non_growing/horror/die()
visible_message(span_cult("[src] stops squirming."))
var/obj/effect/decal/cleanable/tendril_remains/remains = new /obj/effect/decal/cleanable/tendril_remains(src.loc)
remains.color = color
qdel(src)
/obj/effect/decal/cleanable/tendril_remains
name = "tendril remains"
desc = "A disgusting pile of unmoving fleshy tendrils."
icon = 'icons/effects/effects.dmi'
icon_state = "tendril_dead"

View File

@@ -165,6 +165,22 @@
reagents.add_reagent(REAGENT_ID_SHOCKCHEM, 6) reagents.add_reagent(REAGENT_ID_SHOCKCHEM, 6)
bitesize = 6 bitesize = 6
var/static/list/worm_meat_spawns = list (
/obj/random/junk = 30,
/obj/random/trash = 30,
/obj/random/maintenance/clean = 15,
/obj/random/tool = 15,
/obj/random/medical = 3,
/obj/random/bomb_supply = 7,
/obj/random/contraband = 3,
/obj/random/unidentified_medicine/old_medicine = 7,
/obj/item/strangerock = 3,
/obj/item/ore/phoron = 7,
/obj/random/handgun = 1,
/obj/random/toolbox = 4,
/obj/random/drinkbottle = 5
)
/obj/item/reagent_containers/food/snacks/meat/worm /obj/item/reagent_containers/food/snacks/meat/worm
name = "weird meat" name = "weird meat"
desc = "A chunk of pulsating meat." desc = "A chunk of pulsating meat."
@@ -183,20 +199,7 @@
/obj/item/reagent_containers/food/snacks/meat/worm/attackby(obj/item/W as obj, mob/user as mob) /obj/item/reagent_containers/food/snacks/meat/worm/attackby(obj/item/W as obj, mob/user as mob)
if(istype(W,/obj/item/material/knife)) if(istype(W,/obj/item/material/knife))
var/to_spawn = pickweight(/obj/random/junk = 30, var/to_spawn = pickweight(worm_meat_spawns)
/obj/random/trash = 30,
/obj/random/maintenance/clean = 15,
/obj/random/tool = 15,
/obj/random/medical = 3,
/obj/random/bomb_supply = 7,
/obj/random/contraband = 3,
/obj/random/unidentified_medicine/old_medicine = 7,
/obj/item/strangerock = 3,
/obj/item/ore/phoron = 7,
/obj/random/handgun = 1,
/obj/random/toolbox = 4,
/obj/random/drinkbottle = 5
)
new to_spawn(get_turf(src)) new to_spawn(get_turf(src))

View File

@@ -0,0 +1,318 @@
// These are modifiers used for various spooky areas that are meant to be SCARY and THREATENING.
// Outside of extreme circumstances, these should not be used.
// For the primary effect, if someone is not in one of the below 'redspace_areas' Then they can not have the modifier
// applied to them. This acts as a failsafe from it from accidentally being used outside of events.
// If you DO want to use this for an event, make the event area a child of /redgate or add it to the below areas list.
// These have some extremely spooky effects and players should know about it beforehand.
// REDSPACE AREAS
// This list needs expansion... Currently, we have very few proper redspace areas.
// Tossing /area/redgate in here as well. Entering one of these areas (unless coded to do such) doesn't apply
// the modifier, but if you're in one of these areas, you'll keep the modifier until you leave.
var/static/list/redspace_areas = list (
/area/redspace_abduction,
/area/redgate
)
/datum/modifier/redspace_drain
name = "redspace warp"
desc = "Your body is being slowly sapped of it's lifeforce, being used to fuel this hellish nightmare of a place."
on_created_text = span_cult("You feel your body slowly being drained and warped")
on_expired_text = span_notice("Your body feels more normal.")
stacks = MODIFIER_STACK_EXTEND
//mob_overlay_state = "redspace_aura" //Let's be secretive~
var/mob/living/carbon/human/unfortunate_soul //The human target of our modifier.
/datum/modifier/redspace_drain/can_apply(mob/living/L, suppress_output = TRUE)
if(ishuman(L) && !L.isSynthetic() && L.lastarea && is_type_in_list(L.lastarea, redspace_areas))
return TRUE
return FALSE
/datum/modifier/redspace_drain/on_applied()
unfortunate_soul = holder
to_chat(unfortunate_soul, span_cult("You feel as if your lifeforce is slowly being rended from your body."))
return
/datum/modifier/redspace_drain/on_expire()
if(QDELETED(holder))
unfortunate_soul = null
return //Don't do anything if we got QDEL'd, such as if we were gibbed
if(unfortunate_soul.stat == DEAD) //Only care if we're dead.
handle_corpse()
var/obj/effect/landmark/drop_point
drop_point = pick(GLOB.latejoin) //Can be changed to whatever exit list you want. By default, uses GLOB.latejoin
if(drop_point)
unfortunate_soul.forceMove(get_turf(drop_point))
unfortunate_soul.maxHealth = max(50, unfortunate_soul.maxHealth) //If they died, send them back with 50 maxHealth or their current maxHealth. Whatever's higher. We're evil, but not mean.
else
message_admins("Redspace Drain expired, but no drop point was found, leaving [unfortunate_soul] in limbo. This is a bug. Please report it with this info: redspace_drain/on_expire")
unfortunate_soul = null
/datum/modifier/redspace_drain/proc/handle_corpse()
return //Specialty stuff to do to a corpse other than teleport them.
/datum/modifier/redspace_drain/check_if_valid() //We don't call parent. This doesn't wear off without set conditions.
if(holder.stat == DEAD)
expire(silent = TRUE)
else if(holder.lastarea && !is_type_in_list(holder.lastarea, redspace_areas))
expire(silent = TRUE)
/datum/modifier/redspace_drain/tick()
if(isbelly(holder.loc)) //If you're eaten, let's hold off on doing anything spooky.
return
//The dangerous health effects.
unfortunate_soul.nutrition = max(0, unfortunate_soul.nutrition - 5) //Your nutrition is being sapped faster than usual.
if(unfortunate_soul.life_tick % 100 == 0)// Once every 100 ticks, we mutate some organs.
choose_organs()
become_drippy()
to_chat(unfortunate_soul, span_cult("You feel as if your organs are crawling around within your body."))
if(unfortunate_soul.life_tick % 5 == 0) //Once every 5 ticks, we chip away at them.
unfortunate_soul.drip(1) //Blood trail.
unfortunate_soul.take_overall_damage(1) //Small bit of damage
if(unfortunate_soul.bloodstr.get_reagent_amount(REAGENT_ID_NUMBENZYME) < 2) //We lose all feeling in our body. We can't tell how injured we are.
unfortunate_soul.bloodstr.add_reagent(REAGENT_ID_NUMBENZYME,1)
if(unfortunate_soul.life_tick % 10 == 0) //Once every 10 ticks, we permanetly cripple them.
unfortunate_soul.maxHealth = max(10, unfortunate_soul.maxHealth - 1) //Max health is reduced by 1, but never below 10. This is PERMANENT for the rest of the round or until resleeving.
//The mental effects.
unfortunate_soul.fear = min(100, unfortunate_soul.fear + 2) //Fear is increased by 1, but never above 100. You're in a scary place.
if(unfortunate_soul.life_tick % 20 == 0)
var/obj/item/organ/O = pick(unfortunate_soul.internal_organs)
if(!O) //If you don't have any internal organs, you know what? No spooky messages for you, freak.
var/spooky_message = pick("Join us...", "Stay with us...", "Stay forever...", "Don't leave us...", \
"Don't go...", "We can be as one...", "Become one with us...", \
"You can feel your [O] squirming inside of you, trying to get out...", "Your [O] is trying to escape...", \
"Your [O] itches.", "Your [O] is crawling around inside of you.")
to_chat(unfortunate_soul, span_cult(spooky_message))
unfortunate_soul.make_dizzy(20)
unfortunate_soul.stuttering = min(100, unfortunate_soul.stuttering + 10) //Stuttering is increased by 1, but never above 100. You're in a scary place.
return
/datum/modifier/redspace_drain/proc/choose_organs()
var/organs_to_replace = rand(2,3)
for(var/i = 0 to organs_to_replace)
var/organ_choice = pick("eyes", "heart", "lungs", "liver", "kidneys", "appendix", "voicebox", "spleen", "stomach", "intestine")
switch(organ_choice)
if("eyes")
var/obj/item/organ/internal/eyes/E = unfortunate_soul.internal_organs_by_name[O_EYES]
if(E)
replace_eyes(E)
if("heart")
var/obj/item/organ/internal/heart/H = unfortunate_soul.internal_organs_by_name[O_HEART]
if(H)
replace_heart(H)
if("lungs")
var/obj/item/organ/internal/lungs/L = unfortunate_soul.internal_organs_by_name[O_LUNGS]
if(L)
replace_lungs(L)
if("liver")
var/obj/item/organ/internal/liver/L = unfortunate_soul.internal_organs_by_name[O_LIVER]
if(L)
replace_liver(L)
if("kidneys")
var/obj/item/organ/internal/kidneys/K = unfortunate_soul.internal_organs_by_name[O_KIDNEYS]
if(K)
replace_kidneys(K)
if("appendix")
var/obj/item/organ/internal/appendix/A = unfortunate_soul.internal_organs_by_name[O_APPENDIX]
if(A)
replace_appendix(A)
if("voicebox")
var/obj/item/organ/internal/voicebox/V = unfortunate_soul.internal_organs_by_name[O_VOICE]
if(V)
replace_voicebox(V)
if("spleen")
var/obj/item/organ/internal/spleen/S = unfortunate_soul.internal_organs_by_name[O_SPLEEN]
if(S)
replace_spleen(S)
if("stomach")
var/obj/item/organ/internal/stomach/S = unfortunate_soul.internal_organs_by_name[O_STOMACH]
if(S)
replace_stomach(S)
if("intestine")
var/obj/item/organ/internal/intestine/E = unfortunate_soul.internal_organs_by_name[O_INTESTINE]
if(E)
replace_intestine(E)
/datum/modifier/redspace_drain/proc/replace_eyes(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/eyes/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/eyes/new_organ = new /obj/item/organ/internal/eyes/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_heart(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/heart/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/heart/new_organ = new /obj/item/organ/internal/heart/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_lungs(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/lungs/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/lungs/new_organ = new /obj/item/organ/internal/lungs/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_liver(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/liver/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/liver/new_organ = new /obj/item/organ/internal/liver/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_kidneys(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/kidneys/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/kidneys/new_organ = new /obj/item/organ/internal/kidneys/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_appendix(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/appendix/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/appendix/new_organ = new /obj/item/organ/internal/appendix/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_voicebox(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/voicebox/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/voicebox/new_organ = new /obj/item/organ/internal/voicebox/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_spleen(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/spleen/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/spleen/new_organ = new /obj/item/organ/internal/spleen/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_stomach(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/stomach/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/stomach/new_organ = new /obj/item/organ/internal/stomach/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/datum/modifier/redspace_drain/proc/replace_intestine(obj/item/organ/internal/O)
if(istype(O, /obj/item/organ/internal/intestine/horror))
return
var/organ_spot = O.parent_organ
var/obj/item/organ/internal/intestine/new_organ = new /obj/item/organ/internal/intestine/horror()
O.removed(unfortunate_soul)
qdel(O)
new_organ.replaced(unfortunate_soul,unfortunate_soul.get_organ(organ_spot))
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
new_organ.name = "[random_name] [initial(new_organ.name)]"
/*
/datum/modifier/redspace_drain/proc/replace_organ() //Old version of doing this WITHOUT the custom organs. Preserved as an alternative version / reference
var/obj/item/organ/O = pick(unfortunate_soul.internal_organs)
if(O)
var/random_name = pick("pulsating", "quivering", "throbbing", "crawling", "oozing", "melting", "gushing", "dripping", "twitching", "slimy", "gooey")
O.name = "[random_name] [initial(O.name)]"
O.desc = "A twisted, warped version of a [initial(O.name)] covered in thick, red, pulsating tendrils."
O.take_damage(3)
O.color = "#760b0b"
O.add_autopsy_data("ANOMALOUS FLESH GROWTH", 3)
O.decays = FALSE
O.meat_type = /obj/item/reagent_containers/food/snacks/meat/worm //It turns into 'weird meat' with the desc of 'A chunk of pulsating meat'
O.can_reject = FALSE
*/
/datum/modifier/redspace_drain/proc/become_drippy()
if(!(unfortunate_soul.species.flags & NO_DNA)) //Doing it as such in case drippy is ever made NOT a trait gene.
var/datum/gene/trait/drippy_trait = get_gene_from_trait(/datum/trait/neutral/drippy)
unfortunate_soul.dna.SetSEState(drippy_trait.block, TRUE)
domutcheck(unfortunate_soul, null, GENE_ALWAYS_ACTIVATE)
unfortunate_soul.UpdateAppearance()
/datum/modifier/redsight
name = "redsight"
desc = "You can see into the unknown."
client_color = "#ce6161"
on_created_text = span_alien("You feel as though you can see the horrors of reality!")
on_expired_text = span_notice("Your sight returns to what it once was.")
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/redsight/on_applied()
holder.see_invisible = 60
holder.see_invisible_default = 60
holder.vis_enabled += VIS_GHOSTS
holder.recalculate_vis()
/datum/modifier/redsight/on_expire()
holder.see_invisible_default = initial(holder.see_invisible_default)
holder.see_invisible = holder.see_invisible_default
holder.vis_enabled -= VIS_GHOSTS
holder.recalculate_vis()
/datum/modifier/redsight/can_apply(var/mob/living/L)
if(L.stat)
to_chat(L, span_warning("You can't be unconscious or dead to see the unknown."))
return FALSE
var/obj/item/organ/internal/eyes/E = L.internal_organs_by_name[O_EYES]
if(E && istype(E, /obj/item/organ/internal/eyes/horror))
return ..()
return FALSE
/datum/modifier/redsight/check_if_valid() //We don't call parent. This doesn't wear off without set conditions.
//Dead?
if(holder.stat == DEAD)
expire(silent = TRUE)
//We got eyes and they're special eyes?
var/obj/item/organ/internal/eyes/E = holder.internal_organs_by_name[O_EYES]
if(!E)
expire(silent = TRUE)
else if(!istype(E, /obj/item/organ/internal/eyes/horror))
expire(silent = TRUE)
/datum/modifier/redsight/tick()
..()

View File

@@ -48,6 +48,10 @@
if(holder.stat != DEAD) if(holder.stat != DEAD)
src.expire() src.expire()
/datum/modifier/bloodpump_corpse/expire(silent)
human_being_pumped = null
..()
//This INTENTIONALLY only happens on DEAD people. Alive people are metabolizing already (and can be healed quicker through things like brute packs) meaning they don't need this extra assistance! //This INTENTIONALLY only happens on DEAD people. Alive people are metabolizing already (and can be healed quicker through things like brute packs) meaning they don't need this extra assistance!
//Why does it not make you bleed out? Because we'll let medical have a few benefits that don't come with innate downsides. It takes 2 seconds to resleeve someone. It takes a good amount of time to repair a corpse. Let's make the latter more appealing. //Why does it not make you bleed out? Because we'll let medical have a few benefits that don't come with innate downsides. It takes 2 seconds to resleeve someone. It takes a good amount of time to repair a corpse. Let's make the latter more appealing.
/datum/modifier/bloodpump_corpse/tick() /datum/modifier/bloodpump_corpse/tick()

View File

@@ -7,7 +7,7 @@
var/desc = null // Ditto. var/desc = null // Ditto.
var/icon_state = null // See above. var/icon_state = null // See above.
var/mob/living/holder = null // The mob that this datum is affecting. var/mob/living/holder = null // The mob that this datum is affecting.
var/datum/weakref/origin = null // A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel(). var/datum/weakref/origin = null // A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel().
var/expire_at = null // world.time when holder's Life() will remove the datum. If null, it lasts forever or until it gets deleted by something else. var/expire_at = null // world.time when holder's Life() will remove the datum. If null, it lasts forever or until it gets deleted by something else.
var/on_created_text = null // Text to show to holder upon being created. var/on_created_text = null // Text to show to holder upon being created.
var/on_expired_text = null // Text to show to holder when it expires. var/on_expired_text = null // Text to show to holder when it expires.
@@ -20,7 +20,7 @@
var/light_intensity = null // Ditto. Not implemented yet. var/light_intensity = null // Ditto. Not implemented yet.
var/mob_overlay_state = null // Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented. var/mob_overlay_state = null // Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented.
var/client_color = null // If set, the client will have the world be shown in this color, from their perspective. var/client_color = null // If set, the client will have the world be shown in this color, from their perspective.
var/wire_colors_replace = null // If set, the client will have wires replaced by the given replacement list. For colorblindness. //VOREStation Add var/wire_colors_replace = null // If set, the client will have wires replaced by the given replacement list. For colorblindness.
var/list/filter_parameters = null // If set, will add a filter to the holder with the parameters in this var. Must be a list. var/list/filter_parameters = null // If set, will add a filter to the holder with the parameters in this var. Must be a list.
var/filter_priority = 1 // Used to make filters be applied in a specific order, if that is important. var/filter_priority = 1 // Used to make filters be applied in a specific order, if that is important.
var/filter_instance = null // Instance of a filter created with the `filter_parameters` list. This exists to make `animate()` calls easier. Don't set manually. var/filter_instance = null // Instance of a filter created with the `filter_parameters` list. This exists to make `animate()` calls easier. Don't set manually.

View File

@@ -84,14 +84,6 @@
else else
expire(silent = FALSE) expire(silent = FALSE)
/datum/modifier/shield_projection /datum/modifier/shield_projection
name = "Shield Projection" name = "Shield Projection"
desc = "You are currently protected by a shield, rendering nigh impossible to hit you through conventional means." desc = "You are currently protected by a shield, rendering nigh impossible to hit you through conventional means."

View File

@@ -205,10 +205,8 @@
return 0 return 0
languages.Add(new_language) languages.Add(new_language)
//VOREStation Addition Start
if(new_language.flags & HIVEMIND) if(new_language.flags & HIVEMIND)
add_verb(src, /mob/proc/adjust_hive_range) add_verb(src, /mob/proc/adjust_hive_range)
//VOREStation Addition End
return 1 return 1

View File

@@ -84,6 +84,7 @@
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_SPLEEN = /obj/item/organ/internal/spleen,
O_BRAIN = /obj/item/organ/internal/brain/shadekin, O_BRAIN = /obj/item/organ/internal/brain/shadekin,
O_EYES = /obj/item/organ/internal/eyes, O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach, O_STOMACH = /obj/item/organ/internal/stomach,

View File

@@ -267,10 +267,11 @@
O_LUNGS = /obj/item/organ/internal/lungs, O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_APPENDIX = /obj/item/organ/internal/appendix, O_APPENDIX = /obj/item/organ/internal/appendix,
O_EYES = /obj/item/organ/internal/eyes, O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach, O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine O_INTESTINE = /obj/item/organ/internal/intestine
) )

View File

@@ -40,6 +40,7 @@
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_APPENDIX = /obj/item/organ/internal/appendix, O_APPENDIX = /obj/item/organ/internal/appendix,
O_SPLEEN = /obj/item/organ/internal/spleen,
O_SPLEEN = /obj/item/organ/internal/spleen, O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes, O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach, O_STOMACH = /obj/item/organ/internal/stomach,
@@ -160,11 +161,12 @@
//No kidneys or appendix //No kidneys or appendix
has_organ = list( has_organ = list(
O_HEART = /obj/item/organ/internal/heart/unathi, O_HEART = /obj/item/organ/internal/heart/unathi,
O_LUNGS = /obj/item/organ/internal/lungs/unathi, O_LUNGS = /obj/item/organ/internal/lungs/unathi,
O_LIVER = /obj/item/organ/internal/liver/unathi, O_LIVER = /obj/item/organ/internal/liver/unathi,
O_BRAIN = /obj/item/organ/internal/brain/unathi, O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes/unathi, O_BRAIN = /obj/item/organ/internal/brain/unathi,
O_EYES = /obj/item/organ/internal/eyes/unathi,
O_STOMACH = /obj/item/organ/internal/stomach/unathi, O_STOMACH = /obj/item/organ/internal/stomach/unathi,
O_INTESTINE = /obj/item/organ/internal/intestine/unathi O_INTESTINE = /obj/item/organ/internal/intestine/unathi
) )
@@ -291,13 +293,14 @@
cold_discomfort_level = 215 cold_discomfort_level = 215
has_organ = list( //No appendix. has_organ = list( //No appendix.
O_HEART = /obj/item/organ/internal/heart/tajaran, O_HEART = /obj/item/organ/internal/heart/tajaran,
O_LUNGS = /obj/item/organ/internal/lungs/tajaran, O_LUNGS = /obj/item/organ/internal/lungs/tajaran,
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver/tajaran, O_LIVER = /obj/item/organ/internal/liver/tajaran,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes/tajaran, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes/tajaran,
O_STOMACH = /obj/item/organ/internal/stomach/tajaran, O_STOMACH = /obj/item/organ/internal/stomach/tajaran,
O_INTESTINE = /obj/item/organ/internal/intestine O_INTESTINE = /obj/item/organ/internal/intestine
) )
@@ -505,15 +508,16 @@
) )
has_organ = list( //No appendix. has_organ = list( //No appendix.
O_HEART = /obj/item/organ/internal/heart, O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs, O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes, O_BRAIN = /obj/item/organ/internal/brain,
O_STOMACH = /obj/item/organ/internal/stomach, O_EYES = /obj/item/organ/internal/eyes,
O_INTESTINE =/obj/item/organ/internal/intestine O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
) )
@@ -1176,13 +1180,14 @@
) )
has_organ = list( has_organ = list(
O_HEART = /obj/item/organ/internal/heart, O_HEART = /obj/item/organ/internal/heart,
O_LUNGS = /obj/item/organ/internal/lungs, O_LUNGS = /obj/item/organ/internal/lungs,
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain, O_SPLEEN = /obj/item/organ/internal/spleen,
O_EYES = /obj/item/organ/internal/eyes, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach, O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine O_INTESTINE = /obj/item/organ/internal/intestine
) )
@@ -1345,6 +1350,7 @@
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_SPLEEN = /obj/item/organ/internal/spleen,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes, O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach, O_STOMACH = /obj/item/organ/internal/stomach,
@@ -1703,6 +1709,7 @@
O_VOICE = /obj/item/organ/internal/voicebox, O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver, O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys, O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_SPLEEN = /obj/item/organ/internal/spleen,
O_BRAIN = /obj/item/organ/internal/brain, O_BRAIN = /obj/item/organ/internal/brain,
O_EYES = /obj/item/organ/internal/eyes, O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach, O_STOMACH = /obj/item/organ/internal/stomach,

View File

@@ -5,6 +5,7 @@
organ_tag = O_EYES organ_tag = O_EYES
parent_organ = BP_HEAD parent_organ = BP_HEAD
var/list/eye_colour = list(0,0,0) var/list/eye_colour = list(0,0,0)
var/innate_flash_protection = FLASH_PROTECTION_NONE
/obj/item/organ/internal/eyes/robotize() /obj/item/organ/internal/eyes/robotize()
..() ..()
@@ -100,7 +101,7 @@
owner.eye_blurry += 10 owner.eye_blurry += 10
/obj/item/organ/internal/eyes/proc/get_total_protection(var/flash_protection = FLASH_PROTECTION_NONE) /obj/item/organ/internal/eyes/proc/get_total_protection(var/flash_protection = FLASH_PROTECTION_NONE)
return (flash_protection) return (flash_protection + innate_flash_protection)
/obj/item/organ/internal/eyes/proc/additional_flash_effects(var/intensity) /obj/item/organ/internal/eyes/proc/additional_flash_effects(var/intensity)
return -1 return -1

View File

@@ -0,0 +1,248 @@
/obj/item/organ/internal/appendix/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of a appendix covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
/obj/item/organ/internal/appendix/horror/Initialize(mapload)
. = ..()
adjust_scale(1.5,1.5)
/obj/item/organ/internal/appendix/horror/process()
..()
if(!owner) return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(owner.life_tick % 60 == 0 && prob(10))
to_chat(owner, span_cult("You hear a whispering coming from your torso... " + pick("'You should come back'", "'Come back'", "'We're so empty without you'", "'You could stay forever'", "'Become one with us'")))
/obj/item/organ/internal/eyes/horror
name = "orbits"
color = "#660000"
desc = "A twisted, warped version of eyes covered in thick, red, pulsating tendrils."
innate_flash_protection = FLASH_PROTECTION_VULNERABLE //It's VERY good at seeing things...And it doesn't like light.
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
/obj/item/organ/internal/eyes/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
//Get our spooky vision
if(!owner.has_modifier_of_type(/datum/modifier/redsight))
owner.add_modifier(/datum/modifier/redsight)
if(owner.life_tick % 60 == 0 && prob(5))
owner.drip(1)
to_chat(owner, span_cult("Your eyes tear up and blood drips down your face."))
owner.automatic_custom_emote(VISIBLE_MESSAGE, "blinks, a drop of blood trailing from their eye!", check_stat = FALSE)
/obj/item/organ/internal/heart/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of a heart covered in thick, red, pulsating tendrils."
standard_pulse_level = PULSE_NONE //It's just quivering and pushing blood through in some strange method.
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
/obj/item/organ/internal/heart/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(owner.life_tick % 20 == 0 && prob(5))
owner.reagents.add_reagent(REAGENT_ID_NUMBENZYME, 0.2) //Lasts for 20 ticks. Their health hud will randomly go '?'
if(owner.life_tick % 60 == 0)
owner.reagents.add_reagent(REAGENT_ID_SPACEACILLIN, 1) //Keeping its host alive. 1u = 20 ticks
/obj/item/organ/internal/intestine/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of intestines covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
var/escaping = FALSE
var/escaping_attempts = 0
var/entering_vent = FALSE
var/obj/machinery/atmospherics/unary/vent_pump/entry_vent
/obj/item/organ/internal/intestine/horror/process()
..()
if(!owner && !escaping) return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(escaping && entry_vent)
if(get_dist(src, entry_vent) <= 1 && !entering_vent)
audible_message("[src] slithers into the [entry_vent.name]!", "You hear a wet, squelching sound.")
entering_vent = TRUE
mouse_opacity = 0 //No clicky
fade_towards(entry_vent,45)
QDEL_IN(src, 45)
else if(!entering_vent)
escaping_attempts += 1
if(escaping_attempts >= 5)
entry_vent = null
escaping = FALSE //We tried and failed...
escaping_attempts = 0
audible_message("[src] stops squirming around.")
/obj/item/organ/internal/intestine/horror/Destroy()
entry_vent = null
. = ..()
/obj/item/organ/internal/intestine/horror/handle_organ_mod_special(var/removed = FALSE)
..()
if(removed)
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
if(!v.welded)
entry_vent = v
audible_message("[src] tries to slither away!")
walk_to(src, entry_vent, 1, 5)
escaping = TRUE
break
/obj/item/organ/internal/kidneys/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of kidneys covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
/obj/item/organ/internal/kidneys/horror/process()
..()
if(!owner) return
if(is_bruised()) //They heal theirselves.
damage -= 1
var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list
if(coffee && owner.ingested)
for(var/datum/reagent/drink/coffee/R in owner.ingested.reagent_list)
R.holder.remove_reagent(REAGENT_ID_COFFEE, REM)
owner.bloodstr.add_reagent(REAGENT_ID_HYPERZINE, REM)
/obj/item/organ/internal/liver/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of a liver covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
/obj/item/organ/internal/liver/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
var/datum/reagent/toxin/toxins = locate(/datum/reagent/toxin) in owner.reagents.reagent_list
if(toxins)
for(var/datum/reagent/toxin/R in owner.bloodstr.reagent_list)
R.holder.remove_reagent(R.id, REM)
owner.bloodstr.add_reagent(REAGENT_ID_NECROXADONE, REM*5) //5 multiplier of toxins to biomass
owner.bloodstr.add_reagent(REAGENT_ID_MORTIFERIN, REM*3) //3x multiplier
/obj/item/organ/internal/lungs/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of lungs covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
/obj/item/organ/internal/lungs/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(owner.life_tick % 60 == 0 && prob(10))
to_chat(owner, span_cult("You feel something quivering in your chest, making breathing impossible!"))
owner.AdjustLosebreath(10)
owner.automatic_custom_emote(VISIBLE_MESSAGE, "gasps for air!", check_stat = TRUE)
/obj/item/organ/internal/spleen/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of a spleen covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
spleen_efficiency = 5
/obj/item/organ/internal/spleen/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(owner.vessel.total_volume < owner.vessel.maximum_volume) //Bloodloss
owner.bloodstr.add_reagent(REAGENT_ID_SYNTHBLOOD, REM) //Get a little bit of blood added into your blood stream (that then metabolizes into actual blood)
/obj/item/organ/internal/stomach/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of a stomach covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
var/spider_chance = 10 //for admemes
/obj/item/organ/internal/stomach/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(owner.life_tick % 60 == 0 && prob(spider_chance))
var/turf/T = get_turf(owner)
if(T)
to_chat(owner, span_cult("You feel something quivering in your chest!"))
owner.vomit(10, TRUE)
var/spiders_to_spawn = rand(3,5)
for(var/i = 0 to spiders_to_spawn)
var/obj/effect/spider/spiderling/non_growing/horror/spider = new /obj/effect/spider/spiderling/non_growing/horror(T)
spider.faction = owner.faction
spider.color = "[owner.species.blood_color]"
spider.name = "writhing tendril mass"
spider.desc = "A small, writhing mass of flesh and tendrils."
/obj/item/organ/internal/voicebox/horror
name = "mass"
color = "#660000"
desc = "A twisted, warped version of a voicebox covered in thick, red, pulsating tendrils."
decays = FALSE
can_reject = FALSE
meat_type = /obj/item/reagent_containers/food/snacks/meat/worm
will_assist_languages = list(LANGUAGE_DAEMON)
var/speak_chance = 25 //25% chance to speak Daemon every 10 ticks
var/datum/language/daemon //Storage for demon language so we don't have to constantly set it.
/obj/item/organ/internal/voicebox/horror/Initialize(mapload)
. = ..()
daemon = GLOB.all_languages[LANGUAGE_DAEMON]
/obj/item/organ/internal/voicebox/horror/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
..()
target.add_language(LANGUAGE_DAEMON) //Learn Daemon
target.default_language = daemon //Begin speaking Daemon.
/obj/item/organ/internal/voicebox/horror/process()
..()
if(!owner)
return
if(is_bruised()) //They heal theirselves.
damage -= 1
if(owner.life_tick % 10 == 0 && prob(speak_chance))
owner.default_language = daemon //Swap back to Daemon.
if(prob(5)) //1/20 on a 1/4 chance. 1/80 chance every 10 ticks.
owner.say(pick("Join us", "Become one with us", "Join the Flesh", "Come to us", "[owner.real_name] is just a vessel.", "You can be just like us."))

View File

@@ -421,11 +421,9 @@ var/list/organ_cache = list()
if(!istype(target)) return if(!istype(target)) return
// VOREstation edit begin - Posibrains don't have blood reagents, so they crash this
var/datum/reagent/blood/transplant_blood = null var/datum/reagent/blood/transplant_blood = null
if(reagents) if(reagents)
transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list
// VOREstation edit end
transplant_data = list() transplant_data = list()
if(!transplant_blood) if(!transplant_blood)
transplant_data["species"] = target?.species.name transplant_data["species"] = target?.species.name

View File

@@ -269,10 +269,10 @@
/datum/reagent/toxin/stimm/overdose(var/mob/living/carbon/M, var/alient, var/removed) /datum/reagent/toxin/stimm/overdose(var/mob/living/carbon/M, var/alient, var/removed)
..() ..()
if(prob(10)) // 1 in 10. This thing's made with welder fuel and fertilizer, what do you expect? if(prob(10)) // 1 in 10. This thing's made with welder fuel and fertilizer, what do you expect?
var/mob/living/carbon/human/H = M var/obj/item/organ/internal/heart/ht = M.internal_organs_by_name[O_HEART]
var/obj/item/organ/internal/heart/ht = H.internal_organs_by_name[O_HEART] if(ht)
ht?.take_damage(1) ht.take_damage(1)
to_chat(M, span_warning("Huh... Is this what a heart attack feels like?")) to_chat(M, span_warning("Huh... Is this what a heart attack feels like?"))
/datum/reagent/toxin/potassium_chloride /datum/reagent/toxin/potassium_chloride
name = REAGENT_POTASSIUMCHLORIDE name = REAGENT_POTASSIUMCHLORIDE

View File

@@ -185,7 +185,7 @@
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ] var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(istype(I) && I.parent_organ == target_zone) if(istype(I) && I.parent_organ == target_zone)
removable_organs |= organ removable_organs[I.name] = organ
if(!removable_organs.len) if(!removable_organs.len)
return 0 return 0
@@ -198,16 +198,16 @@
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ] var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(istype(I) && I.parent_organ == target_zone) if(istype(I) && I.parent_organ == target_zone)
removable_organs |= organ removable_organs[I.name] = organ
var/organ_to_remove = tgui_input_list(user, "Which organ do you want to tear out?", "Organ Choice", removable_organs) var/organ_to_remove = tgui_input_list(user, "Which organ do you want to tear out?", "Organ Choice", removable_organs)
if(!organ_to_remove) //They decided to cancel. Let's slowly pull the tool back... if(!organ_to_remove) //They decided to cancel. Let's slowly pull the tool back...
to_chat(user, span_warning("You decide against ripping out any organs.")) to_chat(user, span_warning("You decide against ripping out any organs."))
user.visible_message("[user] starts pulling their [tool] out from [target]'s [affected.name] with \the [tool].", \ user.visible_message("[user] starts pulling their [tool] out from [target]'s [affected] with \the [tool].", \
"You start pulling your \the [tool] out of [target]'s [affected.name].") "You start pulling your \the [tool] out of [target]'s [affected].")
target.custom_pain("Someone's moving something around in your [affected.name]!", 100) target.custom_pain("Someone's moving something around in your [affected]!", 100)
else if(organ_to_remove) else if(organ_to_remove)
target.op_stage.current_organ = organ_to_remove target.op_stage.current_organ = removable_organs[organ_to_remove]
user.visible_message("[user] starts ripping [target]'s [target.op_stage.current_organ] out with \the [tool].", \ user.visible_message("[user] starts ripping [target]'s [target.op_stage.current_organ] out with \the [tool].", \
"You start ripping [target]'s [target.op_stage.current_organ] out with \the [tool].") "You start ripping [target]'s [target.op_stage.current_organ] out with \the [tool].")
target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100) target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100)

View File

@@ -27,8 +27,8 @@
/obj/item/stack/medical/bruise_pack = 20 /obj/item/stack/medical/bruise_pack = 20
) )
min_duration = 60 //CHOMPedit min_duration = 60
max_duration = 60 //CHOMPedit max_duration = 60
/datum/surgery_step/internal/fix_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/internal/fix_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target)) if (!hasorgans(target))
@@ -129,8 +129,8 @@
/obj/item/storage/toolbox = 10 //Percussive Maintenance /obj/item/storage/toolbox = 10 //Percussive Maintenance
) )
min_duration = 60 //CHOMPedit min_duration = 60
max_duration = 60 //CHOMPedit max_duration = 60
/datum/surgery_step/fix_organic_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/fix_organic_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!hasorgans(target)) if (!hasorgans(target))
@@ -206,8 +206,8 @@
/obj/item/material/shard = 50, \ /obj/item/material/shard = 50, \
) )
min_duration = 60 //CHOMPedit min_duration = 60
max_duration = 60 //CHOMPedit max_duration = 60
/datum/surgery_step/internal/detatch_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/internal/detatch_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!..()) if (!..())
@@ -227,15 +227,17 @@
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ] var/obj/item/organ/I = target.internal_organs_by_name[organ]
if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
attached_organs |= organ attached_organs[I.name] = organ
var/organ_to_remove = tgui_input_list(user, "Which organ do you want to prepare for removal?", "Organ Choice", attached_organs) var/organ_to_remove = tgui_input_list(user, "Which organ do you want to prepare for removal?", "Organ Choice", attached_organs)
if(!organ_to_remove) if(!organ_to_remove)
return 0 return 0
if(!attached_organs[organ_to_remove])
return 0
target.op_stage.current_organ = organ_to_remove target.op_stage.current_organ = attached_organs[organ_to_remove]
return ..() && organ_to_remove return ..() && attached_organs[organ_to_remove]
/datum/surgery_step/internal/detatch_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/internal/detatch_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone) var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -277,7 +279,7 @@
allowed_procs = list(IS_WIRECUTTER = 100) //FBP code also uses this, so let's be nice. Roboticists won't know to use hemostats. allowed_procs = list(IS_WIRECUTTER = 100) //FBP code also uses this, so let's be nice. Roboticists won't know to use hemostats.
min_duration = 60 min_duration = 60
max_duration = 60 //CHOMPedit max_duration = 60
/datum/surgery_step/internal/remove_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/internal/remove_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if (!..()) if (!..())
@@ -303,7 +305,7 @@
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/internal/I = target.internal_organs_by_name[organ] var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
removable_organs |= organ removable_organs[I.name] = organ
var/organ_to_remove = tgui_input_list(user, "Which organ do you want to remove?", "Organ Choice", removable_organs) var/organ_to_remove = tgui_input_list(user, "Which organ do you want to remove?", "Organ Choice", removable_organs)
if(!organ_to_remove) //They chose cancel! if(!organ_to_remove) //They chose cancel!
@@ -311,9 +313,10 @@
user.visible_message(span_filter_notice("[user] starts pulling \the [tool] from [target]'s [affected]."), \ user.visible_message(span_filter_notice("[user] starts pulling \the [tool] from [target]'s [affected]."), \
span_filter_notice("You start pulling \the [tool] from [target]'s [affected].")) span_filter_notice("You start pulling \the [tool] from [target]'s [affected]."))
user.balloon_alert_visible("starts pulling \the [tool] from [target]'s [affected]", "pulling \the [tool] from \the [affected]") user.balloon_alert_visible("starts pulling \the [tool] from [target]'s [affected]", "pulling \the [tool] from \the [affected]")
if(!removable_organs[organ_to_remove])
return return
target.op_stage.current_organ = organ_to_remove target.op_stage.current_organ = removable_organs[organ_to_remove]
user.visible_message(span_filter_notice("[user] starts removing [target]'s [target.op_stage.current_organ] with \the [tool]."), \ user.visible_message(span_filter_notice("[user] starts removing [target]'s [target.op_stage.current_organ] with \the [tool]."), \
span_filter_notice("You start removing [target]'s [target.op_stage.current_organ] with \the [tool].")) span_filter_notice("You start removing [target]'s [target.op_stage.current_organ] with \the [tool]."))
@@ -355,8 +358,8 @@
/obj/item/organ = 100 /obj/item/organ = 100
) )
min_duration = 40 //CHOMPedit min_duration = 40
max_duration = 40 //CHOMPedit max_duration = 40
/datum/surgery_step/internal/replace_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/internal/replace_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/internal/O = tool var/obj/item/organ/internal/O = tool
@@ -380,15 +383,9 @@
to_chat(user, span_danger("You have no idea what species this person is. Report this on the bug tracker.")) to_chat(user, span_danger("You have no idea what species this person is. Report this on the bug tracker."))
return SURGERY_FAILURE return SURGERY_FAILURE
//var/o_is = (O.gender == PLURAL) ? "are" : "is"
var/o_a = (O.gender == PLURAL) ? "" : "a " var/o_a = (O.gender == PLURAL) ? "" : "a "
var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't" var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't"
/* CHOMPedit begin, allow rotten/damaged organs to be inserted again to allow for organ repair in the case of worst-case-scenerio gib situation. Also to make a funny if lets say, a doctor didnt examine a damaged organ and inserted it anyway.
if(O.damage > (O.max_damage * 0.75))
to_chat(user, span_warning("\The [O.organ_tag] [o_is] in no state to be transplanted."))
return SURGERY_FAILURE
*/
if(!target.internal_organs_by_name[O.organ_tag]) if(!target.internal_organs_by_name[O.organ_tag])
organ_missing = 1 organ_missing = 1
else else
@@ -471,13 +468,13 @@
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ] var/obj/item/organ/I = target.internal_organs_by_name[organ]
if(istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone) if(istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
removable_organs |= organ removable_organs[I.name] = organ
var/organ_to_replace = tgui_input_list(user, "Which organ do you want to reattach?", "Organ Choice", removable_organs) var/organ_to_replace = tgui_input_list(user, "Which organ do you want to reattach?", "Organ Choice", removable_organs)
if(!organ_to_replace) if(!organ_to_replace)
return 0 return 0
target.op_stage.current_organ = organ_to_replace target.op_stage.current_organ = removable_organs[organ_to_replace]
return ..() return ..()
/datum/surgery_step/internal/attach_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) /datum/surgery_step/internal/attach_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 449 KiB

After

Width:  |  Height:  |  Size: 447 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -3187,6 +3187,7 @@
#include "code\modules\mob\_modifiers\crusher_mark.dm" #include "code\modules\mob\_modifiers\crusher_mark.dm"
#include "code\modules\mob\_modifiers\feysight.dm" #include "code\modules\mob\_modifiers\feysight.dm"
#include "code\modules\mob\_modifiers\fire.dm" #include "code\modules\mob\_modifiers\fire.dm"
#include "code\modules\mob\_modifiers\horror.dm"
#include "code\modules\mob\_modifiers\medical.dm" #include "code\modules\mob\_modifiers\medical.dm"
#include "code\modules\mob\_modifiers\modifiers.dm" #include "code\modules\mob\_modifiers\modifiers.dm"
#include "code\modules\mob\_modifiers\modifiers_misc.dm" #include "code\modules\mob\_modifiers\modifiers_misc.dm"
@@ -3927,6 +3928,7 @@
#include "code\modules\organs\internal\brain.dm" #include "code\modules\organs\internal\brain.dm"
#include "code\modules\organs\internal\eyes.dm" #include "code\modules\organs\internal\eyes.dm"
#include "code\modules\organs\internal\heart.dm" #include "code\modules\organs\internal\heart.dm"
#include "code\modules\organs\internal\horror.dm"
#include "code\modules\organs\internal\intestine.dm" #include "code\modules\organs\internal\intestine.dm"
#include "code\modules\organs\internal\kidneys.dm" #include "code\modules\organs\internal\kidneys.dm"
#include "code\modules\organs\internal\liver.dm" #include "code\modules\organs\internal\liver.dm"