diff --git a/code/WorkInProgress/surgery.dm b/code/WorkInProgress/surgery.dm index a7210ee6e0a..cf36046dec1 100644 --- a/code/WorkInProgress/surgery.dm +++ b/code/WorkInProgress/surgery.dm @@ -57,6 +57,15 @@ proc/build_surgery_steps_list() var/datum/surgery_step/S = new T surgery_steps += S +proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) + if(!istype(user) || !istype(E)) return + + var/germ_level = user.germ_level + if(user.gloves) + germ_level = user.gloves.germ_level + + E.germ_level = germ_level + ////////////////////////////////////////////////////////////////// // COMMON STEPS // @@ -90,6 +99,7 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts the incision on [target]'s [affected.display_name] with \the [tool].", \ "You start the incision on [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.display_name]!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -97,6 +107,7 @@ proc/build_surgery_steps_list() "\blue You have made an incision on [target]'s [affected.display_name] with \the [tool].",) affected.open = 1 affected.createwound(CUT, 1) + spread_germs_to_organ(affected, user) if (target_zone == "head") target.brain_op_stage = 1 @@ -119,13 +130,15 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] starts clamping bleeders in [target]'s [affected.display_name] with \the [tool].", \ "You start clamping bleeders in [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("The pain in your [affected.display_name] is maddening!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] clamps bleeders in [target]'s [affected.display_name] with \the [tool].", \ "\blue You clamp bleeders in [target]'s [affected.display_name] with \the [tool].") - affected.bandage() + affected.clamp() affected.status &= ~ORGAN_BLEEDING + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -153,6 +166,7 @@ proc/build_surgery_steps_list() msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." user.visible_message(msg, self_msg) + target.custom_pain("It feels like the skin on your [affected.display_name] is on fire!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -166,6 +180,7 @@ proc/build_surgery_steps_list() self_msg = "\blue You keep the incision open on [target]'s lower abdomen with \the [tool]." user.visible_message(msg, self_msg) affected.open = 2 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -193,12 +208,14 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool]." , \ "You are beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("Your [affected.display_name] is being burned!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] cauterizes the incision on [target]'s [affected.display_name] with \the [tool].", \ "\blue You cauterize the incision on [target]'s [affected.display_name] with \the [tool].") affected.open = 0 + affected.germ_level = 0 affected.status &= ~ORGAN_BLEEDING fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -235,6 +252,7 @@ proc/build_surgery_steps_list() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts to separating [target]'s appendix from the abdominal wall with \the [tool].", \ "You start to separating [target]'s appendix from the abdominal wall with \the [tool]." ) + target.custom_pain("The pain in your abdomen is living hell!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\blue [user] has separated [target]'s appendix with \the [tool]." , \ @@ -259,6 +277,7 @@ proc/build_surgery_steps_list() begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user] starts removing [target]'s appendix with \the [tool].", \ "You start removing [target]'s appendix with \the [tool].") + target.custom_pain("Someone's ripping out your bowels!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("\blue [user] has removed [target]'s appendix with \the [tool].", \ @@ -282,7 +301,7 @@ proc/build_surgery_steps_list() ////////////////////////////////////////////////////////////////// -// INTERNAL WOUND PATCHING // +// INTERNAL WOUND PATCHING // ////////////////////////////////////////////////////////////////// @@ -304,6 +323,7 @@ proc/build_surgery_steps_list() if (affected.stage == 0) user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.display_name] with \the [tool]." , \ "You start patching the damaged vein in [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("The pain in [affected.display_name] is unbearable!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -340,12 +360,14 @@ proc/build_surgery_steps_list() if (affected.stage == 0) user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool]." , \ "You start applying medication to the damaged bones in [target]'s [affected.display_name] with \the [tool].") + target.custom_pain("Something in your [affected.display_name] is causing you a lot of pain!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] applies some [tool] to [target]'s bone in [affected.display_name]", \ "\blue You apply some [tool] to [target]'s bone in [affected.display_name] with \the [tool].") affected.stage = 1 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -366,6 +388,7 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] is beginning to set the bone in [target]'s [affected.display_name] in place with \the [tool]." , \ "You are beginning to set the bone in [target]'s [target_zone] in place with \the [tool].") + target.custom_pain("The pain in your [affected.display_name] is going to make you pass out!",1) end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -373,10 +396,12 @@ proc/build_surgery_steps_list() user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name] in place with \the [tool].", \ "\blue You set the bone in [target]'s [affected.display_name] in place with \the [tool].") affected.stage = 2 + spread_germs_to_organ(affected, user) else user.visible_message("\blue [user] sets the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].", \ "\blue You set the bone in [target]'s [affected.display_name]\red in the WRONG place with \the [tool].") affected.fracture() + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -403,6 +428,7 @@ proc/build_surgery_steps_list() user.visible_message("\blue [user] sets [target]'s [affected.display_name] skull with \the [tool]." , \ "\blue You set [target]'s [affected.display_name] skull with \the [tool].") affected.stage = 2 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -435,6 +461,7 @@ proc/build_surgery_steps_list() affected.status &= ~ORGAN_SPLINTED affected.stage = 0 affected.perma_injury = 0 + spread_germs_to_organ(affected, user) fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/datum/organ/external/affected = target.get_organ(target_zone) @@ -691,7 +718,7 @@ proc/build_surgery_steps_list() "You begin to cut through [target]'s skull with \the [tool].") end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \ + user.visible_message("\blue [user] has cut through [target]'s skull open with \the [tool].", \ "\blue You have cut through [target]'s skull open with \the [tool].") target.brain_op_stage = 2 @@ -976,4 +1003,148 @@ proc/build_surgery_steps_list() var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ "\red Your hand slips, damaging connectors on [target]'s [affected.display_name]!") - target.apply_damage(10, BRUTE, affected) \ No newline at end of file + target.apply_damage(10, BRUTE, affected) + + +////////////////////////////////////////////////////////////////// +// ALIEN SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/alien + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/embryo = 0 + for(var/datum/disease/alien_embryo/A in target.viruses) + embryo = 1 + break + + return embryo && target_zone == "chest" + +/datum/surgery_step/alien/saw_ribcage + required_tool = /obj/item/weapon/circular_saw + + min_duration = 50 + max_duration = 70 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/affected = target.get_organ(target_zone) + return ..() && target.embryo_op_stage == 0 && affected.open >= 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to cut through [target]'s ribcage with \the [tool].", \ + "You begin to cut through [target]'s ribcage with \the [tool].") + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("\blue [user] has cut through [target]'s ribcage open with \the [tool].", \ + "\blue You have cut through [target]'s ribcage open with \the [tool].") + target.embryo_op_stage = 1 + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("\red [user]'s hand slips, cracking [target]'s ribcage with \the [tool]!" , \ + "\red Your hand slips, cracking [target]'s ribcage with \the [tool]!" ) + + +/datum/surgery_step/alien/retract_ribcage + required_tool = /obj/item/weapon/retractor + + min_duration = 30 + max_duration = 40 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.embryo_op_stage == 1 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts to force open the ribcage in [target]'s torso with \the [tool]." + var/self_msg = "You start to force open the ribcage in [target]'s torso with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "\blue [user] forces open [target]'s ribcage with \the [tool]." + var/self_msg = "\blue You force open [target]'s ribcage with \the [tool]." + user.visible_message(msg, self_msg) + target.embryo_op_stage = 2 + + // Whoops! + if(prob(10)) + var/datum/organ/external/affected = target.get_organ(target_zone) + affected.fracture() + + fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "\red [user]'s hand slips, breaking [target]'s ribcage!" + var/self_msg = "\red Your hand slips, breaking [target]'s ribcage!" + user.visible_message(msg, self_msg) + var/datum/organ/external/affected = target.get_organ(target_zone) + affected.fracture() + +/datum/surgery_step/alien/remove_embryo + required_tool = /obj/item/weapon/hemostat + + min_duration = 80 + max_duration = 100 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.embryo_op_stage == 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]." + var/self_msg = "You start to pull something out from [target]'s ribcage with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("\red [user] rips the larva out of [target]'s ribcage!", + "You rip the larva out of [target]'s ribcage!") + + var/mob/living/carbon/alien/larva/stupid = new(target.loc) + stupid.death(0) + + target.embryo_op_stage = 3 + + for(var/datum/disease/alien_embryo in target.viruses) + alien_embryo.cure() + +/datum/surgery_step/alien/close_ribcage + required_tool = /obj/item/weapon/retractor + + min_duration = 20 + max_duration = 40 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return target.embryo_op_stage >= 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts bending [target]'s ribcage back into place with \the [tool]." + var/self_msg = "You start bending [target]'s ribcage back into place with \the [tool]." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] bends [target]'s ribcage back into place with \the [tool]." + var/self_msg = "You bends [target]'s ribcage back into place with \the [tool]." + user.visible_message(msg, self_msg) + + target.embryo_op_stage = 1 + +/datum/surgery_step/alien/mend_ribcage + required_tool = /obj/item/weapon/bonegel + + min_duration = 20 + max_duration = 40 + + can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return target.embryo_op_stage == 1 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] starts applying \the [tool] to [target]'s ribcage." + var/self_msg = "You start applying \the [tool] to [target]'s ribcage." + user.visible_message(msg, self_msg) + target.custom_pain("Something hurts horribly in your chest!",1) + + + end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/msg = "[user] applied \the [tool] to [target]'s ribcage." + var/self_msg = "You applied \the [tool] to [target]'s ribcage." + user.visible_message(msg, self_msg) + + target.embryo_op_stage = 0 diff --git a/code/datums/diseases/alien_embryo.dm b/code/datums/diseases/alien_embryo.dm index 0e9f41e8b50..91dcf517981 100644 --- a/code/datums/diseases/alien_embryo.dm +++ b/code/datums/diseases/alien_embryo.dm @@ -40,6 +40,7 @@ permeability_mod = 15//likely to infect can_carry = 0 var/gibbed = 0 + stage_minimum_age = 300 /datum/disease/alien_embryo/stage_act() ..() diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 79374d24788..ee579a294d5 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -12,7 +12,7 @@ severity = "Medium" longevity = 1000 hidden = list(0, 1) - stage_minimum_age = 100 // at least 100 life ticks per stage + stage_minimum_age = 300 // at least 200 life ticks per stage /datum/disease/appendicitis/stage_act() ..() diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 0c953e6843a..0a6d312bd9b 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -33,6 +33,9 @@ var/open = 0 var/stage = 0 + // INTERNAL germs inside the organ, this is BAD if it's greater 0 + var/germ_level = 0 + // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 20 // update every 20 ticks(roughly every minute) New(var/datum/organ/external/P) @@ -183,8 +186,8 @@ // let the GC handle the deletion of the wound if(W.internal && !W.is_treated()) // internal wounds get worse over time - W.open_wound(0.5 * wound_update_accuracy) - owner.vessel.remove_reagent("blood",0.1 * W.damage * wound_update_accuracy) + W.open_wound(0.1 * wound_update_accuracy) + owner.vessel.remove_reagent("blood",0.2 * W.damage * wound_update_accuracy) if(W.is_treated()) // slow healing @@ -195,6 +198,15 @@ // amount of healing is spread over all the wounds W.heal_damage((wound_update_accuracy * amount * W.amount * config.organ_regeneration_multiplier) / (20*owner.number_wounds+1)) + if(W.germ_level > 100 && prob(10)) + owner.adjustToxLoss(1 * wound_update_accuracy) + if(W.germ_level > 1000) + owner.adjustToxLoss(1 * wound_update_accuracy) + + // Salving also helps against infection + if(W.germ_level > 0 && W.salved && prob(2)) + W.germ_level = 0 + // sync the organ's damage with its wounds src.update_damages() @@ -206,6 +218,14 @@ W.bandaged = 1 return rval + proc/clamp() + var/rval = 0 + for(var/datum/wound/W in wounds) + if(W.internal) continue + rval |= !W.clamped + W.clamped = 1 + return rval + proc/salve() var/rval = 0 for(var/datum/wound/W in wounds) @@ -222,6 +242,12 @@ proc/get_damage_fire() return burn_dam + proc/is_infected() + for(var/datum/wound/W in wounds) + if(W.germ_level > 100) + return 1 + return 0 + process() // process wounds, doing healing etc., only do this every 4 ticks to save processing power if(owner.life_tick % wound_update_accuracy == 0) @@ -239,6 +265,9 @@ return if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) src.fracture() + if(germ_level > 0) + for(var/datum/wound/W in wounds) if(!W.bandaged && !W.salved) + W.germ_level = max(W.germ_level, germ_level) return proc/fracture() @@ -433,7 +462,10 @@ W = new wound_type(damage) - + // Possibly trigger an internal wound, too. + if(damage > 10 && prob(damage)) + var/datum/wound/internal_bleeding/I = new (15) + wounds += I // check whether we can add the wound to an existing wound for(var/datum/wound/other in wounds) @@ -694,4 +726,4 @@ obj/item/weapon/organ/r_hand icon_state = "r_hand_l" obj/item/weapon/organ/r_leg name = "right leg" - icon_state = "r_leg_l" \ No newline at end of file + icon_state = "r_leg_l" diff --git a/code/datums/organs/pain.dm b/code/datums/organs/pain.dm index d1e3ef9a081..750cd75f33a 100644 --- a/code/datums/organs/pain.dm +++ b/code/datums/organs/pain.dm @@ -42,6 +42,22 @@ mob/proc/pain(var/partname, var/amount, var/force, var/burning = 0) src << msg next_pain_time = world.time + (100 - amount) + +// message is the custom message to be displayed +// flash_strength is 0 for weak pain flash, 1 for strong pain flash +mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength) + if(stat >= 1) return + if(reagents.has_reagent("tramadol")) + return + if(reagents.has_reagent("oxycodone")) + return + if(analgesic) + return + var/msg = "\red [message]" + if(flash_strength >= 1) + msg = "\red [message]" + src << msg + mob/living/carbon/human/proc/handle_pain() // not when sleeping if(stat >= 2) return diff --git a/code/datums/organs/wound.dm b/code/datums/organs/wound.dm index 024419e1818..c9ef227c904 100644 --- a/code/datums/organs/wound.dm +++ b/code/datums/organs/wound.dm @@ -25,6 +25,8 @@ // is the wound bandaged? var/tmp/bandaged = 0 + // Similar to bandaged, but works differently + var/tmp/clamped = 0 // is the wound salved? var/tmp/salved = 0 // is the wound disinfected? @@ -41,6 +43,9 @@ // internal wounds can only be fixed through surgery var/internal = 0 + // amount of germs in the wound + var/germ_level = 0 + // helper lists var/tmp/list/desc_list = list() var/tmp/list/damage_list = list() @@ -94,8 +99,7 @@ // heal the given amount of damage, and if the given amount of damage was more // than what needed to be healed, return how much heal was left // set @heals_internal to also heal internal organ damage - // TODO: set heals_internal to 0 by default - proc/heal_damage(amount, heals_internal = 1) + proc/heal_damage(amount, heals_internal = 0) if(src.internal && !heals_internal) // heal nothing return amount @@ -124,7 +128,7 @@ proc/bleeding() // internal wounds don't bleed in the sense of this function - return (!bandaged && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal) + return (!(bandaged||clamped) && (damage_type == BRUISE && damage >= 20 || damage_type == CUT) && current_stage <= max_bleeding_stage && !src.internal) /** CUTS **/ /datum/wound/cut @@ -143,7 +147,7 @@ /datum/wound/gaping_wound max_bleeding_stage = 2 stages = list("gaping wound" = 50, "large blood soaked clot" = 25, "large clot" = 15, "small angry scar" = 5, \ - "small straight scar" = 0) + "small straight scar" = 0) /datum/wound/big_gaping_wound max_bleeding_stage = 2 @@ -229,4 +233,4 @@ stages = list("severed vein" = 30, "cut vein" = 20, "damaged vein" = 10, "bruised vein" = 5) max_bleeding_stage = 0 - needs_treatment = 1 \ No newline at end of file + needs_treatment = 1 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8187ca46277..313a9106f48 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -9,6 +9,7 @@ var/last_bumped = 0 var/pass_flags = 0 var/throwpass = 0 + var/germ_level = 0 // The higher the germ level, the more germ on the atom. ///Chemistry. var/datum/reagents/reagents = null @@ -121,7 +122,7 @@ * Recursevly searches all atom contens (including contents contents and so on). * * ARGS: path - search atom contents for atoms of this type - * list/filter_path - if set, contents of atoms not of types in this list are excluded from search. + * list/filter_path - if set, contents of atoms not of types in this list are excluded from search. * * RETURNS: list of found atoms */ @@ -419,8 +420,8 @@ its easier to just keep the beam vertical. A.fingerprints = list() if(!istype(A.fingerprintshidden,/list)) A.fingerprintshidden = list() - A.fingerprints |= fingerprints //detective - A.fingerprintshidden |= fingerprintshidden //admin + A.fingerprints |= fingerprints //detective + A.fingerprintshidden |= fingerprintshidden //admin A.fingerprintslast = fingerprintslast @@ -555,6 +556,7 @@ its easier to just keep the beam vertical. /atom/proc/clean_blood() clean_prints() + src.germ_level = 0 if(istype(blood_DNA, /list)) del(blood_DNA) return 1 diff --git a/code/game/dna.dm b/code/game/dna.dm index 1af645e2942..d4628e6f9a7 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -395,6 +395,7 @@ M.dna.check_integrity() M.disabilities = 0 + M.sdisabilities = 0 var/old_mutations = M.mutations M.mutations = list() @@ -454,7 +455,7 @@ M << "\blue Your muscles hurt." M.mutations.Add(HULK) if (isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK)) - M.disabilities |= 2 + M.disabilities |= EPILEPSY M << "\red You get a headache." if (isblockon(getblock(M.dna.struc_enzymes, FAKEBLOCK,3),FAKEBLOCK)) M << "\red You feel strange." @@ -466,13 +467,13 @@ else randmutg(M) if (isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK)) - M.disabilities |= 4 + M.disabilities |= COUGHING M << "\red You start coughing." if (isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK)) M << "\red You feel lightheaded." M.mutations.Add(CLUMSY) if (isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK)) - M.disabilities |= 8 + M.disabilities |= TOURETTES M << "\red You twitch." if (isblockon(getblock(M.dna.struc_enzymes, XRAYBLOCK,3),XRAYBLOCK)) if(probinj(30,inj) || (XRAY in old_mutations)) @@ -482,25 +483,25 @@ M.see_invisible = 2 M.mutations.Add(XRAY) if (isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK)) - M.disabilities |= 16 + M.disabilities |= NERVOUS M << "\red You feel nervous." if (isblockon(getblock(M.dna.struc_enzymes, FIREBLOCK,3),FIREBLOCK)) if(probinj(30,inj) || (COLD_RESISTANCE in old_mutations)) M << "\blue Your body feels warm." M.mutations.Add(COLD_RESISTANCE) if (isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK)) - M.disabilities |= 128 + M.sdisabilities |= BLIND M << "\red You can't seem to see anything." if (isblockon(getblock(M.dna.struc_enzymes, TELEBLOCK,3),TELEBLOCK)) if(probinj(15,inj) || (TK in old_mutations)) M << "\blue You feel smarter." M.mutations.Add(TK) if (isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK)) - M.disabilities |= 32 + M.sdisabilities |= DEAF M.ear_deaf = 1 M << "\red Its kinda quiet.." if (isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK)) - M.disabilities |= 1 + M.disabilities |= NEARSIGHTED M << "Your eyes feel weird..." /* If you want the new mutations to work, UNCOMMENT THIS. diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 6976b83d636..facc5f88eb6 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -307,22 +307,17 @@ sleep(100) */ + command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert") + sleep(600) for(var/mob/living/carbon/human/H in living_mob_list) if(istype(H,/mob/living/carbon/human)) H.apply_effect((rand(15,75)),IRRADIATE,0) if (prob(5)) H.apply_effect((rand(90,150)),IRRADIATE,0) - if (prob(25)) - if (prob(75)) - randmutb(H) - domutcheck(H,null,1) - else - randmutg(H) - domutcheck(H,null,1) for(var/mob/living/carbon/monkey/M in living_mob_list) M.apply_effect((rand(15,75)),IRRADIATE,0) sleep(100) - command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert") + command_alert("Radiation levels are within standard parameters again.", "Anomaly Alert") world << sound('sound/AI/radiation.ogg') diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index c5471bd696b..15dbadb0061 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -280,7 +280,7 @@ var/splint = "" var/internal_bleeding = "" for(var/datum/wound/W in e.wounds) if(W.internal) - internal_bleeding = "Internal Bleeding:" + internal_bleeding = "
Internal Bleeding" break if(e.status & ORGAN_SPLINTED) splint = "Splinted:" @@ -293,7 +293,7 @@ if(e.implant) imp = "Implanted:" if(!AN && !open && !infected & !imp) - AN = "None" + AN = "None:" if(!(e.status & ORGAN_DESTROYED)) dat += "[e.display_name][e.burn_dam][e.brute_dam][bled][AN][splint][open][infected][imp][internal_bleeding]" else @@ -306,4 +306,4 @@ dat = " Error: No Body Scanner connected." dat += text("

Close", user) user << browse(dat, "window=scanconsole;size=430x600") - return \ No newline at end of file + return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 74b3f42f133..647168dbc13 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -221,7 +221,7 @@ msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])") //BS12 EDIT ALG - //spawn(1800) // this wont work right + //spawn(1800) // this wont work right // M.lastattacker = null ///////////////////////// @@ -624,7 +624,7 @@ user << "\red You're going to need to remove that mask/helmet/glasses first." return - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes! + if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/metroid))//Aliens don't have eyes./N Metroids also don't have eyes! user << "\red You cannot locate any eyes on this creature!" return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 0a781c81b7c..6155dd6a767 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -1,4 +1,3 @@ - /* CONTAINS: T-RAY @@ -124,9 +123,12 @@ MASS SPECTROMETER TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" - if(M.status_flags & FAKEDEATH) + if(M.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") + if (istype(M, /mob/living/carbon/human)) + if(M:virus2 || M:reagents.total_volume > 0) + user.show_message(text("\red Warning: Unknown substance detected in subject's blood.")) if (M.getCloneLoss()) user.show_message("\red Subject appears to have been imperfectly cloned.") for(var/datum/disease/D in M.viruses) @@ -148,6 +150,9 @@ MASS SPECTROMETER if(e.status & ORGAN_BROKEN) if(((e.name == "l_arm") || (e.name == "r_arm") || (e.name == "l_leg") || (e.name == "r_leg")) && (!(e.status & ORGAN_SPLINTED))) user << "\red Unsecured fracture in subject [limb]. Splinting recommended for transport." + if(e.is_infected()) + user << "\red Infected wound detected in subject [limb]. Disinfection recommended." + for(var/name in H.organs_by_name) var/datum/organ/external/e = H.organs_by_name[name] if(e.status & ORGAN_BROKEN) diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 396a97a79eb..35f43aed2ae 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -55,6 +55,12 @@ icon_state = "david_fanning_1" item_state = "david_fanning_1" +/obj/item/fluff/john_mckeever_1 //kirbyelder: John McKeever + name = "Suspicious Paper" + desc = "A piece of paper reading: Smash = 1/3 Leaf Juice, 1/3 Tricker, 1/3 Aajkli Extract" + icon_state = "paper" + item_state = "paper" + ////////////////////////////////// ////////// Usable Items ////////// ////////////////////////////////// diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 53f0571301e..0ef35d726dc 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -353,10 +353,12 @@ if(H.gloves) if(H.gloves.clean_blood()) H.update_inv_gloves(0) + H.gloves.germ_level = 0 else if(H.bloody_hands) H.bloody_hands = 0 H.update_inv_gloves(0) + H.germ_level = 0 update_icons() //apply the now updated overlays to the mob diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 430f01c80fd..a3c046db523 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -2,6 +2,7 @@ gender = MALE var/list/stomach_contents = list() var/brain_op_stage = 0.0 + var/embryo_op_stage = 0 /* var/eye_op_stage = 0.0 var/appendix_op_stage = 0.0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 5a2118aa359..362d8d0918a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -280,6 +280,8 @@ var/this_wound_desc = W.desc if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]" else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]" + if(W.germ_level > 1000) this_wound_desc = "badly infected [this_wound_desc]" + else if(W.germ_level > 100) this_wound_desc = "lightly infected [this_wound_desc]" if(this_wound_desc in wound_descriptors) wound_descriptors[this_wound_desc] += W.amount continue diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b6ec67a6d5d..45008dc63e2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -944,6 +944,12 @@ return NEUTER return gender +/mob/living/carbon/human/proc/increase_germ_level(n) + if(gloves) + gloves.germ_level += n + else + germ_level += n + /mob/living/carbon/human/revive() for (var/datum/organ/external/O in organs) O.status &= ~ORGAN_BROKEN @@ -964,4 +970,4 @@ del(H) - ..() + ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 93561990654..04e0c916434 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1168,6 +1168,13 @@ if(druggy) druggy = max(druggy-1, 0) + + // Increase germ_level regularly + if(prob(40)) + germ_level += 1 + // If you're dirty, your gloves will become dirty, too. + if(gloves && germ_level > gloves.germ_level && prob(10)) + gloves.germ_level += 1 return 1 proc/handle_regular_hud_updates() @@ -1537,4 +1544,4 @@ Paralyse(rand(15,28)) #undef HUMAN_MAX_OXYLOSS -#undef HUMAN_CRIT_MAX_OXYLOSS \ No newline at end of file +#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/config/custom_items.txt b/config/custom_items.txt index e7454b7555f..c5a4c37f99a 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -20,6 +20,7 @@ foolamancer: Edvin Telephosphor: /obj/item/clothing/head/fluff/edvin_telephospho furohman: Fay Sullivan: /obj/item/weapon/lighter/zippo/fluff/fay_sullivan_1 gvazdas: Sarah Carbrokes: /obj/item/fluff/sarah_carbrokes_1 jamini: Edwin Atweeke: /obj/item/clothing/suit/labcoat/fluff/burnt +kirbyelder: John McKeever: /obj/item/paper/fluff/john_mckeever_1 leonheart11: Johann Erzatz: /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/johann_erzatz_1 lexusjjss: Lexus Langg: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask lexusjjss: Zachary Tomlinson: /obj/item/weapon/clipboard/fluff/smallnote, /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/shinyflask diff --git a/html/changelog.html b/html/changelog.html index dbfbcce1b1a..b2f8706ef7e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,15 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +
+

November 12th

+

CIB updated:

+ +
+

November 11th

CIB updated: