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(