diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 538477b73d..1bd72d94e3 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -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 name = "\improper Gym Sideroom" - icon_state = "pool" + icon_state = "pool" /area/crew_quarters/sauna name = "\improper Sauna" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 26dcd1a9d0..e0c239797f 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -881,7 +881,7 @@ var/list/sacrificed = list() 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.")) return fizzle() - cultist.loc = src.loc + cultist.forceMove(src.loc) cultist.lying = 1 cultist.regenerate_icons() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 33c1f06908..bb88a32d27 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -137,7 +137,7 @@ switch(severity) if(1.0) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.forceMove(src.loc) ex_act(severity) //Foreach goto(35) //SN src = null @@ -146,7 +146,7 @@ if(2.0) if (prob(50)) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.forceMove(src.loc) ex_act(severity) //Foreach goto(108) //SN src = null @@ -155,7 +155,7 @@ if(3.0) if (prob(25)) for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc + A.forceMove(src.loc) ex_act(severity) //Foreach goto(181) //SN src = null diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index ebd610e3fb..13a9cb5ba4 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -207,7 +207,6 @@ entry_vent = null else if(entry_vent) 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) if(!exit_vent) return @@ -235,8 +234,6 @@ var/area/new_area = get_area(loc) if(new_area) new_area.Entered(src) - //VOREStation Edit End - //================= if(isturf(loc)) skitter() @@ -325,3 +322,18 @@ for(var/atom/movable/A in contents) A.loc = src.loc 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" diff --git a/code/modules/food/food/snacks/meat.dm b/code/modules/food/food/snacks/meat.dm index 33f1419307..5cfa50a6e2 100644 --- a/code/modules/food/food/snacks/meat.dm +++ b/code/modules/food/food/snacks/meat.dm @@ -165,6 +165,22 @@ reagents.add_reagent(REAGENT_ID_SHOCKCHEM, 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 name = "weird 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) if(istype(W,/obj/item/material/knife)) - var/to_spawn = pickweight(/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 - ) + var/to_spawn = pickweight(worm_meat_spawns) new to_spawn(get_turf(src)) diff --git a/code/modules/mob/_modifiers/horror.dm b/code/modules/mob/_modifiers/horror.dm new file mode 100644 index 0000000000..8735af39f9 --- /dev/null +++ b/code/modules/mob/_modifiers/horror.dm @@ -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() + ..() diff --git a/code/modules/mob/_modifiers/medical.dm b/code/modules/mob/_modifiers/medical.dm index cfa4193fd6..61501fa2af 100644 --- a/code/modules/mob/_modifiers/medical.dm +++ b/code/modules/mob/_modifiers/medical.dm @@ -48,6 +48,10 @@ if(holder.stat != DEAD) 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! //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() diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm index 3f3908820d..9ab9048102 100644 --- a/code/modules/mob/_modifiers/modifiers.dm +++ b/code/modules/mob/_modifiers/modifiers.dm @@ -7,7 +7,7 @@ var/desc = null // Ditto. var/icon_state = null // See above. 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/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. @@ -20,7 +20,7 @@ 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/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/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. diff --git a/code/modules/mob/_modifiers/modifiers_vr.dm b/code/modules/mob/_modifiers/modifiers_vr.dm index 6dab50a53f..bd6361225f 100644 --- a/code/modules/mob/_modifiers/modifiers_vr.dm +++ b/code/modules/mob/_modifiers/modifiers_vr.dm @@ -84,14 +84,6 @@ else expire(silent = FALSE) - - - - - - - - /datum/modifier/shield_projection name = "Shield Projection" desc = "You are currently protected by a shield, rendering nigh impossible to hit you through conventional means." diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index cdd87a3a8f..c65f23d09f 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -205,10 +205,8 @@ return 0 languages.Add(new_language) - //VOREStation Addition Start if(new_language.flags & HIVEMIND) add_verb(src, /mob/proc/adjust_hive_range) - //VOREStation Addition End return 1 diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index 75eadd4c98..9f568db941 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -84,6 +84,7 @@ O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen, O_BRAIN = /obj/item/organ/internal/brain/shadekin, O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 95a323000b..77e5f3f7ed 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -267,10 +267,11 @@ O_LUNGS = /obj/item/organ/internal/lungs, O_VOICE = /obj/item/organ/internal/voicebox, 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_APPENDIX = /obj/item/organ/internal/appendix, - O_EYES = /obj/item/organ/internal/eyes, + O_APPENDIX = /obj/item/organ/internal/appendix, + O_SPLEEN = /obj/item/organ/internal/spleen, + O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, O_INTESTINE = /obj/item/organ/internal/intestine ) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index c3b91e3df1..284aa3e156 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -40,6 +40,7 @@ O_KIDNEYS = /obj/item/organ/internal/kidneys, O_BRAIN = /obj/item/organ/internal/brain, O_APPENDIX = /obj/item/organ/internal/appendix, + O_SPLEEN = /obj/item/organ/internal/spleen, O_SPLEEN = /obj/item/organ/internal/spleen, O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, @@ -160,11 +161,12 @@ //No kidneys or appendix has_organ = list( - O_HEART = /obj/item/organ/internal/heart/unathi, - O_LUNGS = /obj/item/organ/internal/lungs/unathi, - O_LIVER = /obj/item/organ/internal/liver/unathi, - O_BRAIN = /obj/item/organ/internal/brain/unathi, - O_EYES = /obj/item/organ/internal/eyes/unathi, + O_HEART = /obj/item/organ/internal/heart/unathi, + O_LUNGS = /obj/item/organ/internal/lungs/unathi, + O_LIVER = /obj/item/organ/internal/liver/unathi, + O_SPLEEN = /obj/item/organ/internal/spleen, + 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_INTESTINE = /obj/item/organ/internal/intestine/unathi ) @@ -291,13 +293,14 @@ cold_discomfort_level = 215 has_organ = list( //No appendix. - O_HEART = /obj/item/organ/internal/heart/tajaran, - O_LUNGS = /obj/item/organ/internal/lungs/tajaran, - O_VOICE = /obj/item/organ/internal/voicebox, - O_LIVER = /obj/item/organ/internal/liver/tajaran, - O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes/tajaran, + O_HEART = /obj/item/organ/internal/heart/tajaran, + O_LUNGS = /obj/item/organ/internal/lungs/tajaran, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver/tajaran, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen, + O_BRAIN = /obj/item/organ/internal/brain, + O_EYES = /obj/item/organ/internal/eyes/tajaran, O_STOMACH = /obj/item/organ/internal/stomach/tajaran, O_INTESTINE = /obj/item/organ/internal/intestine ) @@ -505,15 +508,16 @@ ) has_organ = list( //No appendix. - O_HEART = /obj/item/organ/internal/heart, - O_LUNGS = /obj/item/organ/internal/lungs, - O_VOICE = /obj/item/organ/internal/voicebox, - O_LIVER = /obj/item/organ/internal/liver, - O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes, - O_STOMACH = /obj/item/organ/internal/stomach, - O_INTESTINE =/obj/item/organ/internal/intestine + O_HEART = /obj/item/organ/internal/heart, + O_LUNGS = /obj/item/organ/internal/lungs, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen, + O_BRAIN = /obj/item/organ/internal/brain, + O_EYES = /obj/item/organ/internal/eyes, + O_STOMACH = /obj/item/organ/internal/stomach, + O_INTESTINE = /obj/item/organ/internal/intestine ) @@ -1176,13 +1180,14 @@ ) has_organ = list( - O_HEART = /obj/item/organ/internal/heart, - O_LUNGS = /obj/item/organ/internal/lungs, - O_VOICE = /obj/item/organ/internal/voicebox, - O_LIVER = /obj/item/organ/internal/liver, - O_KIDNEYS = /obj/item/organ/internal/kidneys, - O_BRAIN = /obj/item/organ/internal/brain, - O_EYES = /obj/item/organ/internal/eyes, + O_HEART = /obj/item/organ/internal/heart, + O_LUNGS = /obj/item/organ/internal/lungs, + O_VOICE = /obj/item/organ/internal/voicebox, + O_LIVER = /obj/item/organ/internal/liver, + O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen, + O_BRAIN = /obj/item/organ/internal/brain, + O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, O_INTESTINE = /obj/item/organ/internal/intestine ) @@ -1345,6 +1350,7 @@ O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen, O_BRAIN = /obj/item/organ/internal/brain, O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, @@ -1703,6 +1709,7 @@ O_VOICE = /obj/item/organ/internal/voicebox, O_LIVER = /obj/item/organ/internal/liver, O_KIDNEYS = /obj/item/organ/internal/kidneys, + O_SPLEEN = /obj/item/organ/internal/spleen, O_BRAIN = /obj/item/organ/internal/brain, O_EYES = /obj/item/organ/internal/eyes, O_STOMACH = /obj/item/organ/internal/stomach, diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index 37a38a8736..1e3bc1a0ce 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -5,6 +5,7 @@ organ_tag = O_EYES parent_organ = BP_HEAD var/list/eye_colour = list(0,0,0) + var/innate_flash_protection = FLASH_PROTECTION_NONE /obj/item/organ/internal/eyes/robotize() ..() @@ -100,7 +101,7 @@ owner.eye_blurry += 10 /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) return -1 diff --git a/code/modules/organs/internal/horror.dm b/code/modules/organs/internal/horror.dm new file mode 100644 index 0000000000..0d479ac7ba --- /dev/null +++ b/code/modules/organs/internal/horror.dm @@ -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.")) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 69f3cd1245..d4fcc7570c 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -421,11 +421,9 @@ var/list/organ_cache = list() if(!istype(target)) return - // VOREstation edit begin - Posibrains don't have blood reagents, so they crash this var/datum/reagent/blood/transplant_blood = null if(reagents) transplant_blood = locate(/datum/reagent/blood) in reagents.reagent_list - // VOREstation edit end transplant_data = list() if(!transplant_blood) transplant_data["species"] = target?.species.name diff --git a/code/modules/reagents/reagents/toxins.dm b/code/modules/reagents/reagents/toxins.dm index 5b8e7f890b..fe30cbf0e4 100644 --- a/code/modules/reagents/reagents/toxins.dm +++ b/code/modules/reagents/reagents/toxins.dm @@ -269,10 +269,10 @@ /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? - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/heart/ht = H.internal_organs_by_name[O_HEART] - ht?.take_damage(1) - to_chat(M, span_warning("Huh... Is this what a heart attack feels like?")) + var/obj/item/organ/internal/heart/ht = M.internal_organs_by_name[O_HEART] + if(ht) + ht.take_damage(1) + to_chat(M, span_warning("Huh... Is this what a heart attack feels like?")) /datum/reagent/toxin/potassium_chloride name = REAGENT_POTASSIUMCHLORIDE diff --git a/code/modules/surgery/organ_ripper.dm b/code/modules/surgery/organ_ripper.dm index 6dfda37132..270dd2d53e 100644 --- a/code/modules/surgery/organ_ripper.dm +++ b/code/modules/surgery/organ_ripper.dm @@ -185,7 +185,7 @@ for(var/organ in target.internal_organs_by_name) var/obj/item/organ/internal/I = target.internal_organs_by_name[organ] if(istype(I) && I.parent_organ == target_zone) - removable_organs |= organ + removable_organs[I.name] = organ if(!removable_organs.len) return 0 @@ -198,16 +198,16 @@ for(var/organ in target.internal_organs_by_name) var/obj/item/organ/internal/I = target.internal_organs_by_name[organ] 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) 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.")) - user.visible_message("[user] starts pulling their [tool] out from [target]'s [affected.name] with \the [tool].", \ - "You start pulling your \the [tool] out of [target]'s [affected.name].") - target.custom_pain("Someone's moving something around in your [affected.name]!", 100) + 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].") + target.custom_pain("Someone's moving something around in your [affected]!", 100) 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].", \ "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) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 71ed33837d..e9779eeeab 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -27,8 +27,8 @@ /obj/item/stack/medical/bruise_pack = 20 ) - min_duration = 60 //CHOMPedit - max_duration = 60 //CHOMPedit + min_duration = 60 + max_duration = 60 /datum/surgery_step/internal/fix_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) @@ -129,8 +129,8 @@ /obj/item/storage/toolbox = 10 //Percussive Maintenance ) - min_duration = 60 //CHOMPedit - max_duration = 60 //CHOMPedit + min_duration = 60 + 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) if (!hasorgans(target)) @@ -206,8 +206,8 @@ /obj/item/material/shard = 50, \ ) - min_duration = 60 //CHOMPedit - max_duration = 60 //CHOMPedit + min_duration = 60 + max_duration = 60 /datum/surgery_step/internal/detatch_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!..()) @@ -227,15 +227,17 @@ for(var/organ in target.internal_organs_by_name) var/obj/item/organ/I = target.internal_organs_by_name[organ] 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) if(!organ_to_remove) 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) 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. 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) if (!..()) @@ -303,7 +305,7 @@ for(var/organ in target.internal_organs_by_name) 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) - 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) 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]."), \ 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]") + if(!removable_organs[organ_to_remove]) 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]."), \ span_filter_notice("You start removing [target]'s [target.op_stage.current_organ] with \the [tool].")) @@ -355,8 +358,8 @@ /obj/item/organ = 100 ) - min_duration = 40 //CHOMPedit - max_duration = 40 //CHOMPedit + min_duration = 40 + max_duration = 40 /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 @@ -380,15 +383,9 @@ to_chat(user, span_danger("You have no idea what species this person is. Report this on the bug tracker.")) return SURGERY_FAILURE - //var/o_is = (O.gender == PLURAL) ? "are" : "is" var/o_a = (O.gender == PLURAL) ? "" : "a " 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]) organ_missing = 1 else @@ -471,13 +468,13 @@ for(var/organ in target.internal_organs_by_name) 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) - 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) if(!organ_to_replace) return 0 - target.op_stage.current_organ = organ_to_replace + target.op_stage.current_organ = removable_organs[organ_to_replace] return ..() /datum/surgery_step/internal/attach_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 62cd57f9cb..aac10a8ed7 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/modifier_effects.dmi b/icons/mob/modifier_effects.dmi index 99a4f6e4ed..6898103bb8 100644 Binary files a/icons/mob/modifier_effects.dmi and b/icons/mob/modifier_effects.dmi differ diff --git a/vorestation.dme b/vorestation.dme index d5b224b262..39d05fc4a0 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3187,6 +3187,7 @@ #include "code\modules\mob\_modifiers\crusher_mark.dm" #include "code\modules\mob\_modifiers\feysight.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\modifiers.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\eyes.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\kidneys.dm" #include "code\modules\organs\internal\liver.dm"