diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 6a7ed02f7bf..3f0be9ca684 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -81,7 +81,7 @@ // /mob/living signals #define COMSIG_LIVING_STUN_EFFECT "stun_effect_act" //mob/living/proc/stun_effect_act() -#define COMSIG_CARBON_HAPPY "carbon_happy" //drugs o ethanol in blood +#define COMSIG_CARBON_HAPPY "carbon_happy" //drugs or ethanol in blood // /mob/living/carbon signals #define COMSIG_CARBON_ELECTROCTE "carbon_electrocute act" //mob/living/carbon/electrocute_act() diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm index 15569b74105..56711c3c5a0 100644 --- a/code/datums/outfits/jobs/science.dm +++ b/code/datums/outfits/jobs/science.dm @@ -31,11 +31,10 @@ name = OUTFIT_JOB_NAME("Moebius Roboticist") uniform = /obj/item/clothing/under/rank/roboticist suit = /obj/item/clothing/suit/storage/robotech_jacket - belt = /obj/item/storage/belt/utility/full + belt = /obj/item/storage/belt/utility/roboticist pda_slot = slot_r_store id_type = /obj/item/card/id/dkgrey pda_type = /obj/item/modular_computer/pda/moebius/roboticist - l_hand = /obj/item/storage/toolbox/mechanical /decl/hierarchy/outfit/job/science/roboticist/New() ..() diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index e1cb24453e0..762e704c7a9 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -80,7 +80,7 @@ new /obj/item/tool/wirecutters(src) new /obj/item/stack/cable_coil/random(src) -/obj/item/storage/belt/utility/technomancer +/obj/item/storage/belt/utility/technomancer spawn_blacklisted = TRUE /obj/item/storage/belt/utility/technomancer/populate_contents() @@ -92,6 +92,18 @@ new /obj/item/tool/shovel/power(src) new /obj/item/stack/cable_coil/random(src) +/obj/item/storage/belt/utility/roboticist + spawn_blacklisted = TRUE + +/obj/item/storage/belt/utility/roboticist/populate_contents() + new /obj/item/tool/screwdriver(src) + new /obj/item/tool/wrench(src) + new /obj/item/tool/weldingtool(src) + new /obj/item/tool/crowbar(src) + new /obj/item/tool/wirecutters/pliers(src) + new /obj/item/stack/cable_coil/random(src) + new /obj/item/tool/multitool(src) + /obj/item/storage/belt/utility/neotheology name = "neotheology utility belt" desc = "Waist-held holy items." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bdb97628fc2..639e5f002d4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -4,6 +4,7 @@ voice_name = "unknown" icon = 'icons/mob/human.dmi' icon_state = "body_m_s" + status_flags = REBUILDING_ORGANS //will protect from gibbing before organs are built. flag should be removed by set_species in initialize var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. @@ -1020,6 +1021,10 @@ var/list/rank_prefix = list(\ for(var/obj/item/organ/internal/carrion/C in organs_to_readd) C.replaced(get_organ(C.parent_organ_base)) + for(var/obj/item/organ/internal/I in internal_organs) + I.status &= ~ORGAN_CUT_AWAY + I.handle_organ_eff() + status_flags &= ~REBUILDING_ORGANS species.organs_spawned(src) @@ -1348,21 +1353,32 @@ var/list/rank_prefix = list(\ reset_view(A) /mob/living/carbon/human/proc/resuscitate() + var/obj/item/organ/internal/vital/heart_organ = random_organ_by_process(OP_HEART) var/obj/item/organ/internal/vital/brain_organ = random_organ_by_process(BP_BRAIN) - if(!is_asystole() && !(heart_organ && brain_organ) || (heart_organ.is_broken() || brain_organ.is_broken())) + if((!heart_organ || heart_organ.is_broken()) && (!brain_organ || brain_organ.is_broken())) + resuscitate_notify(1) + return 0 + + if(!heart_organ || heart_organ.is_broken()) + resuscitate_notify(2) + return 0 + + if(!brain_organ || brain_organ.is_broken()) + resuscitate_notify(3) return 0 if(world.time >= (timeofdeath + NECROZTIME)) + resuscitate_notify(4) return 0 var/oxyLoss = getOxyLoss() if(oxyLoss > 20) setOxyLoss(20) - if(health <= (HEALTH_THRESHOLD_DEAD - oxyLoss)) - visible_message(SPAN_WARNING("\The [src] twitches a bit, but their body is too damaged to sustain life!")) + if(getBruteLoss() + getFireLoss() >= abs(HEALTH_THRESHOLD_DEAD)) + resuscitate_notify(5) timeofdeath = 0 return 0 @@ -1384,6 +1400,34 @@ var/list/rank_prefix = list(\ break return 1 +/mob/living/carbon/human/proc/resuscitate_notify(type) + if(prob(50)) + return + visible_message(SPAN_WARNING("\The [src] twitches and twists intensely")) + for(var/mob/O in viewers(world.view, src.loc)) + if(O == src) + continue + if(!Adjacent(O)) + continue + var/bio_stat = 0 + if(O.stats) + bio_stat = O.stats.getStat(STAT_BIO) + + if(bio_stat >= STAT_LEVEL_ADEPT) + switch(type) + if(1) //brain and heart fail + to_chat(O, "You can identify that [src]'s circulatory and central neural systems are failing, preventing them from resurrection.") + if(2) //heart fail + to_chat(O, "You can identify that [src]'s circulatory system is unable to restart in this state.") + if(3) //brain fail + to_chat(O, "You can identify that [src]'s central neural system is too damaged to be resurrected.") + if(4) //corpse is too old + to_chat(O, "You see that rotting process in [src]'s body already gone too far. This is nothing but a corpse now.") + if(5) //too much damage + to_chat(O, "[src]'s body is too damaged to sustain life.") + else + to_chat(O, "You're too unskilled to understand what's happening...") + /mob/living/carbon/human/proc/generate_dna() if(!b_type) b_type = pick(GLOB.blood_types) diff --git a/code/modules/organs/external/dismemberment.dm b/code/modules/organs/external/dismemberment.dm index 026406752d5..61741a08578 100644 --- a/code/modules/organs/external/dismemberment.dm +++ b/code/modules/organs/external/dismemberment.dm @@ -70,6 +70,7 @@ for(var/obj/item/organ/I in internal_organs) I.removed() I.forceMove(get_turf(src)) + I.status |= ORGAN_CUT_AWAY for(var/obj/item/I in src) if(I.w_class > ITEM_SIZE_SMALL) @@ -88,6 +89,7 @@ I.removed() I.forceMove(get_turf(src)) I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) + I.status |= ORGAN_CUT_AWAY for(var/mob/living/I in src) // check for mobs inside you... yeah if(istype(I, /mob/living/simple_animal/borer/)) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index 159ab29d34f..0c703eb6026 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -7,6 +7,7 @@ min_bruised_damage = IORGAN_STANDARD_BRUISE min_broken_damage = IORGAN_STANDARD_BREAK desc = "A vital organ." + status = ORGAN_CUT_AWAY var/list/owner_verbs = list() var/list/initial_owner_verbs = list() var/list/organ_efficiency = list() //Efficency of an organ, should become the most important variable @@ -35,6 +36,10 @@ ..() handle_blood() +/obj/item/organ/internal/die() + handle_organ_eff() + ..() + /obj/item/organ/internal/Destroy() QDEL_LIST(item_upgrades) for(var/comp in GetComponents(/datum/component/internal_wound)) @@ -85,7 +90,10 @@ for(var/process in organ_efficiency) if(!islist(owner.internal_organs_by_efficiency[process])) owner.internal_organs_by_efficiency[process] = list() - owner.internal_organs_by_efficiency[process] += src + if(is_usable()) + owner.internal_organs_by_efficiency[process] += src + else + owner.internal_organs_by_efficiency[process] -= src for(var/proc_path in owner_verbs) verbs |= proc_path @@ -93,6 +101,13 @@ if(GetComponent(/datum/component/internal_wound/organic/parenchyma)) owner.mutation_index++ +/obj/item/organ/internal/proc/handle_organ_eff() + for(var/process in organ_efficiency) + if(is_usable()) + owner.internal_organs_by_efficiency[process] += src + else + owner.internal_organs_by_efficiency[process] -= src + /obj/item/organ/internal/proc/get_process_efficiency(process_define) var/organ_eff = organ_efficiency[process_define] return organ_eff - (organ_eff * (damage / max_damage)) diff --git a/code/modules/organs/internal/carrion.dm b/code/modules/organs/internal/carrion.dm index 01177f80772..f35cff889dc 100644 --- a/code/modules/organs/internal/carrion.dm +++ b/code/modules/organs/internal/carrion.dm @@ -32,6 +32,7 @@ /obj/item/organ/internal/carrion max_damage = 15 //resilient scanner_hidden = TRUE //sneaky + status = 0 // Carrion organs are attached by default because they are only grown inside and not printed /obj/item/organ/internal/carrion/chemvessel name = "chemical vessel" diff --git a/code/modules/organs/internal/internal_wounds/_internal_wound.dm b/code/modules/organs/internal/internal_wounds/_internal_wound.dm index d07f1323dfe..e323dedf459 100644 --- a/code/modules/organs/internal/internal_wounds/_internal_wound.dm +++ b/code/modules/organs/internal/internal_wounds/_internal_wound.dm @@ -181,7 +181,7 @@ is_treated = TRUE else is_treated = S.use(charges_needed) - if(istype(I)) // check for using items without stacks + else if(istype(I)) // check for using items without stacks is_treated = TRUE qdel(I) if(is_treated) diff --git a/code/modules/organs/internal/internal_wounds/eyes.dm b/code/modules/organs/internal/internal_wounds/eyes.dm index dea26b94b80..78da8a5633e 100644 --- a/code/modules/organs/internal/internal_wounds/eyes.dm +++ b/code/modules/organs/internal/internal_wounds/eyes.dm @@ -82,12 +82,14 @@ treatments_tool = list(QUALITY_RETRACTING = FAILCHANCE_HARD) scar = /datum/component/internal_wound/organic/eyes_deep_burn -/datum/component/internal_wound/organic/eyes_deep_burn //stage 2 +/datum/component/internal_wound/organic/eyes_deep_burn/stage2 //stage 2 name = "scorched deep tissue" - severity = 3 // starts with max damage as it is a second stage - severity_max = 3 treatments_item = list(/obj/item/stack/medical/advanced/ointment = 2) treatments_chem = list(CE_EYEHEAL = 1) + severity = 3 //starting at max damage because stage 2 + severity_max = 3 + hal_damage = IWOUND_HEAVY_DAMAGE + diagnosis_difficulty = STAT_LEVEL_EXPERT // Tox (toxins) /datum/component/internal_wound/organic/eyes_poisoning diff --git a/code/modules/organs/internal/internal_wounds/organic.dm b/code/modules/organs/internal/internal_wounds/organic.dm index 8993c851293..d9189fc3376 100644 --- a/code/modules/organs/internal/internal_wounds/organic.dm +++ b/code/modules/organs/internal/internal_wounds/organic.dm @@ -138,7 +138,7 @@ treatments_tool = list(QUALITY_CUTTING = FAILCHANCE_NORMAL) treatments_chem = list(CE_ANTITOX = 2) severity = 0 - severity_max = 3 + severity_max = 4 hal_damage = IWOUND_LIGHT_DAMAGE /// Cheap hack, but prevents unbalanced toxins from killing someone immediately diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm index 23bda10f1d2..29d85b7072b 100644 --- a/code/modules/reagents/reagents/other.dm +++ b/code/modules/reagents/reagents/other.dm @@ -492,15 +492,17 @@ /datum/reagent/resuscitator/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/vital/heart/heart = H.random_organ_by_process(OP_HEART) - if(BP_IS_ROBOTIC(heart)) // neither it should work on robotic hearts, chemistry and stuf - return - if(heart) - heart.damage += 0.5 + var/obj/item/organ/internal/vital/heart = H.random_organ_by_process(OP_HEART) + if(heart) //Check for existence of the heart BEFORE checking for robotic heart, otherwise function WILL return null + if(BP_IS_ROBOTIC(heart)) // neither it should work on robotic hearts, chemistry and stuff + return + heart.take_damage(64, TOX) if(prob(30)) to_chat(H, SPAN_DANGER("Your heart feels like it's going to tear itself out of you!")) - if(H.stat == DEAD) - H.resuscitate() + if(H.stat == DEAD) + H.resuscitate() + else + H.resuscitate() //it will fail and give explanations why /datum/reagent/resuscitator/overdose(mob/living/carbon/M, alien) . = ..() diff --git a/code/modules/surgery/organic.dm b/code/modules/surgery/organic.dm index d88108af39c..5053331eb04 100644 --- a/code/modules/surgery/organic.dm +++ b/code/modules/surgery/organic.dm @@ -142,7 +142,7 @@ ) organ.status &= ~ORGAN_CUT_AWAY - organ.replaced(organ.get_limb()) + organ.handle_organ_eff() //organ is attached. Refreshing eff. list /datum/surgery_step/attach_organ/fail_step(mob/living/user, obj/item/organ/internal/organ, obj/item/stack/tool) user.visible_message( @@ -178,6 +178,7 @@ SPAN_NOTICE("You separate [organ.get_surgery_name()] with \the [tool].") ) organ.status |= ORGAN_CUT_AWAY + organ.handle_organ_eff() //detach of organ. Refreshing eff. list /datum/surgery_step/detach_organ/fail_step(mob/living/user, obj/item/organ/internal/organ, obj/item/stack/tool) user.visible_message( diff --git a/code/modules/surgery/robotic.dm b/code/modules/surgery/robotic.dm index 1b81628f5ca..75d55353d23 100644 --- a/code/modules/surgery/robotic.dm +++ b/code/modules/surgery/robotic.dm @@ -67,8 +67,10 @@ ) if(organ.status & ORGAN_CUT_AWAY) organ.status &= ~ORGAN_CUT_AWAY + organ.handle_organ_eff() else organ.status |= ORGAN_CUT_AWAY + organ.handle_organ_eff() /datum/surgery_step/robotic/connect_organ/fail_step(mob/living/user, obj/item/organ/internal/organ, obj/item/stack/tool) user.visible_message(