diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 0196f326792..1cb8f1fc468 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -640,3 +640,4 @@ proc/dd_sortedObjectList(list/incoming)
// LAZYING PT 2: THE LAZENING
#define LAZYREINITLIST(L) LAZYCLEARLIST(L); LAZYINITLIST(L);
+#define LAZYQDELLIST(L) if(L) { for(var/o in L) qdel(o); L.Cut() }
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 70c955c2169..af66a54010d 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -34,6 +34,7 @@
var/obj/effect/countdown/clonepod/countdown
+ var/list/brine_types = list("corazone", "salbutamol", "hydrocodone")
var/list/missing_organs
var/organs_number = 0
@@ -86,21 +87,9 @@
/obj/machinery/clonepod/Destroy()
if(connected)
connected.pods -= src
-<<<<<<< HEAD
QDEL_NULL(Radio)
QDEL_NULL(countdown)
-=======
- if(Radio)
- qdel(Radio)
- Radio = null
- if(countdown)
- qdel(countdown)
- countdown = null
- for(var/i in missing_organs)
- qdel(i)
- LAZYCLEARLIST(missing_organs)
- missing_organs = null
->>>>>>> Cloning now puts you together bit by bit
+ LAZYDESTROYLIST(missing_organs)
return ..()
/obj/machinery/clonepod/RefreshParts()
@@ -280,6 +269,7 @@
H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it
H.UpdateAppearance()
+ check_brine()
//Get the clone body ready
maim_clone(H)
H.Paralyse(4)
@@ -332,21 +322,24 @@
//Slowly get that clone healed and finished.
occupant.adjustCloneLoss(-((speed_coeff/2)))
- var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
- progress += (100 - MINIMUM_HEAL_LEVEL)
- var/milestone = CLONE_INITIAL_DAMAGE / organs_number
- var/installed = organs_number - LAZYLEN(missing_organs)
+ // For human species that lack non-vital parts for some weird reason
+ if(organs_number)
+ var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss()
+ progress += (100 - MINIMUM_HEAL_LEVEL)
+ var/milestone = CLONE_INITIAL_DAMAGE / organs_number
+// Doing this as a #define so that the value can change when evaluated multiple times
+#define INSTALLED (organs_number - LAZYLEN(missing_organs))
- while((progress / milestone) > installed && LAZYLEN(missing_organs))
- var/obj/item/organ/I = pick_n_take(missing_organs)
- I.replaced(occupant)
+ while((progress / milestone) > INSTALLED && LAZYLEN(missing_organs))
+ var/obj/item/organ/I = pick_n_take(missing_organs)
+ I.replaced(occupant)
+
+#undef INSTALLED
//Premature clones may have brain damage.
occupant.adjustBrainLoss(-((speed_coeff/20)*efficiency))
- //So clones don't die of oxyloss in a running pod.
- if(occupant.reagents.get_reagent_amount("salbutamol") < 5)
- occupant.reagents.add_reagent("salbutamol", 5)
+ check_brine()
//Also heal some oxyloss ourselves just in case!!
occupant.adjustOxyLoss(-4)
@@ -562,7 +555,10 @@
var/obj/item/organ/O = o
if(!istype(O) || O.vital)
continue
- var/obj/item/I = O.remove(H, TRUE)
+
+ // Let's non-specially remove all non-vital organs
+ // What could possibly go wrong
+ var/obj/item/I = O.remove(H)
// Make this support stuff that turns into items when removed
I.forceMove(src)
missing_organs += I
@@ -570,12 +566,19 @@
var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg")
for(var/zone in zones)
var/obj/item/organ/external/E = H.get_organ(zone)
- var/obj/item/I = E.remove(H, TRUE)
+ var/obj/item/I = E.remove(H)
I.forceMove(src)
missing_organs += I
organs_number = LAZYLEN(missing_organs)
+/obj/machinery/clonepod/proc/check_brine()
+ // Clones are in a pickled bath of mild chemicals, keeping
+ // them alive, despite their lack of internal organs
+ for(var/bt in brine_types)
+ if(occupant.reagents.get_reagent_amount(bt) < 1)
+ occupant.reagents.add_reagent(bt, 1)
+
/*
* Diskette Box
*/
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index a2fd5881ca7..b3b6648f773 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -240,7 +240,7 @@ REAGENT SCANNER
if(H.species.exotic_blood)
user.show_message("Subject possesses exotic blood.")
user.show_message("Exotic blood type: [blood_type].")
- if(H.heart_attack && H.stat != DEAD)
+ if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
user.show_message("Subject suffering from heart attack: Apply defibrillator immediately.")
user.show_message("Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.")
var/implant_detect
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 5d0dcebcacc..e332011d2ee 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -330,8 +330,8 @@
H.updatehealth() //forces health update before next life tick
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
- if(!H.heart_attack && (prob(10) || defib.combat)) // Your heart explodes.
- H.heart_attack = 1
+ if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
+ H.set_heartattack(TRUE)
add_logs(user, M, "stunned", object="defibrillator")
defib.deductcharge(revivecost)
cooldown = 1
@@ -368,7 +368,7 @@
busy = 0
update_icon()
return
- if(H.heart_attack)
+ if(H.undergoing_cardiac_arrest())
if(!H.get_int_organ(/obj/item/organ/internal/heart) && !H.get_int_organ(/obj/item/organ/internal/brain/slime)) //prevents defibing someone still alive suffering from a heart attack attack if they lack a heart
user.visible_message("[defib] buzzes: Resuscitation failed - Failed to pick up any heart electrical activity.")
playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0)
@@ -376,7 +376,7 @@
update_icon()
return
else
- H.heart_attack = 0
+ H.set_heartattack(FALSE)
user.visible_message("[defib] pings: Cardiac arrhythmia corrected.")
M.visible_message("[M]'s body convulses a bit.")
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
@@ -474,8 +474,8 @@
H.adjustStaminaLoss(50)
H.Weaken(5)
H.updatehealth() //forces health update before next life tick
- if(!H.heart_attack && prob(10)) // Your heart explodes.
- H.heart_attack = 1
+ if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
+ H.set_heartattack(TRUE)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
add_logs(user, M, "stunned", object="defibrillator")
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index e900fc10517..6e34291caae 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -20,7 +20,6 @@
var/pulse = PULSE_NORM //current pulse level
- var/heart_attack = 0
var/wetlevel = 0 //how wet the mob is
var/oxygen_alert = 0
@@ -29,4 +28,4 @@
var/fire_alert = 0
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
- var/co2overloadtime = null
\ No newline at end of file
+ var/co2overloadtime = null
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index b3580778d22..69e86de81e6 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -99,7 +99,7 @@
stat = DEAD
SetDizzy(0)
SetJitter(0)
- heart_attack = 0
+ set_heartattack(FALSE)
//Handle species-specific deaths.
if(species) species.handle_death(src)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index cc2458c7cf4..54782f869db 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -759,9 +759,9 @@
if(species)
species_siemens_coeff = species.siemens_coeff
siemens_coeff = gloves_siemens_coeff * species_siemens_coeff
- if(heart_attack)
+ if(undergoing_cardiac_arrest())
if(shock_damage * siemens_coeff >= 1 && prob(25))
- heart_attack = 0
+ set_heartattack(FALSE)
if(stat == CONSCIOUS)
to_chat(src, "You feel your heart beating again!")
. = ..()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index be265669b79..b9ce09f88a9 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1032,7 +1032,7 @@
if(stat == DEAD)
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
- if(heart_attack)
+ if(undergoing_cardiac_arrest())
return PULSE_NONE
var/temp = PULSE_NORM
@@ -1175,14 +1175,37 @@
return stuttering
+
+/mob/living/carbon/human/proc/can_heartattack()
+ if(species.flags & NO_BLOOD)
+ return FALSE
+ return TRUE
+
+/mob/living/carbon/human/proc/undergoing_cardiac_arrest()
+ if(!can_heartattack())
+ return FALSE
+ var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
+ if(istype(heart) && heart.beating)
+ return FALSE
+ return TRUE
+
+/mob/living/carbon/human/proc/set_heartattack(status)
+ if(!can_heartattack())
+ return FALSE
+
+ var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
+ if(!istype(heart))
+ return FALSE
+
+ heart.beating = !status
+
/mob/living/carbon/human/proc/handle_heartattack()
- if(!heart_attack)
+ if(!can_heartattack() || !undergoing_cardiac_arrest() || reagents.has_reagent("corazone"))
return
- else
- AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
- adjustOxyLoss(5)
- Paralyse(4)
- adjustBruteLoss(2)
+ AdjustLoseBreath(2, bound_lower = 0, bound_upper = 3)
+ adjustOxyLoss(5)
+ Paralyse(4)
+ adjustBruteLoss(2)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 525559e8e6c..1af74e9234a 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -377,7 +377,6 @@
if(iscarbon(src))
var/mob/living/carbon/C = src
C.handcuffed = initial(C.handcuffed)
- C.heart_attack = 0
for(var/datum/disease/D in C.viruses)
D.cure(0)
@@ -385,6 +384,7 @@
// restore all of the human's blood and reset their shock stage
if(ishuman(src))
human_mob = src
+ human_mob.set_heartattack(FALSE)
human_mob.restore_blood()
human_mob.shock_stage = 0
human_mob.decaylevel = 0
diff --git a/code/modules/reagents/chemistry/reagents/disease.dm b/code/modules/reagents/chemistry/reagents/disease.dm
index f9fbf930e3e..7db78883e90 100644
--- a/code/modules/reagents/chemistry/reagents/disease.dm
+++ b/code/modules/reagents/chemistry/reagents/disease.dm
@@ -141,11 +141,11 @@
can_synth = 0
/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
- if(volume >=5)
+ if(volume >= 5)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1 // rip in pepperoni
+ if(!H.undergoing_cardiac_arrest())
+ H.set_heartattack(TRUE) // rip in pepperoni
//virus foods
@@ -183,4 +183,4 @@
/datum/reagent/plasma_dust/plasmavirusfood/weak
name = "weakened virus plasma"
id = "weakplasmavirusfood"
- color = "#CEC3C6" // rgb: 206,195,198
\ No newline at end of file
+ color = "#CEC3C6" // rgb: 206,195,198
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index 082b6496357..a18f1c01c42 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -772,8 +772,8 @@
M.Weaken(1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1
+ if(!H.undergoing_cardiac_arrest())
+ H.set_heartattack(TRUE)
..()
/datum/reagent/fungus
@@ -847,7 +847,7 @@
if(volume >= 5 && !istype(T, /turf/space))
new /obj/effect/decal/cleanable/vomit/green(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
-
+
////Lavaland Flora Reagents////
/datum/reagent/consumable/entpoly
@@ -878,7 +878,7 @@
if(!light_activated)
M.set_light(2)
light_activated = 1
- ..()
+ ..()
/datum/reagent/consumable/tinlux/on_mob_delete(mob/living/M)
M.set_light(0)
@@ -894,4 +894,4 @@
if(prob(80))
M.adjustBruteLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
M.adjustFireLoss(-1 * REAGENTS_EFFECT_MULTIPLIER)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index a8fcf888318..452f9f6d2ff 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -1023,3 +1023,11 @@
/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
M.SetHallucinate(min(max(0, M.hallucination + 10), 50))
M.adjustToxLoss(5 * REAGENTS_EFFECT_MULTIPLIER)
+
+/datum/reagent/medicine/corazone
+ name = "Corazone"
+ id = "corazone"
+ description = "A medication used to treat pain, fever, and inflammation, along with heart attacks."
+ color = "#F5F5F5"
+
+// This reagent's effects are handled in heart attack handling code
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 8fabc46db00..40d9cb1c481 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -648,8 +648,8 @@
M.Weaken(2)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.heart_attack = 1 // rip in pepperoni
+ if(!H.undergoing_cardiac_arrest())
+ H.set_heartattack(TRUE) // rip in pepperoni
..()
/datum/reagent/pancuronium
@@ -1090,4 +1090,4 @@
shock_timer = 0
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index ffd0b4f0b1e..278941d87e4 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -249,9 +249,9 @@
if(istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/H = owner
if(H.stat != DEAD && prob(50 / severity))
- H.heart_attack = 1
+ H.set_heartattack(TRUE)
spawn(600 / severity)
- H.heart_attack = 0
+ H.set_heartattack(FALSE)
if(H.stat == CONSCIOUS)
to_chat(H, "You feel your heart beating again!")
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 084e16f877e..95a71a5ce84 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -286,7 +286,7 @@ var/list/organ_cache = list()
/obj/item/organ/internal/heart/emp_act(intensity)
if(owner && robotic == 2)
- owner.heart_attack = 1
+ Stop() // In the name of looooove~!
owner.visible_message("[owner] clutches their chest and gasps!","You clutch your chest in pain!")
else if(owner && robotic == 1)
take_damage(11,1)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 7a87d3c6b39..e1bcaffbf65 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -165,11 +165,9 @@
. = ..()
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.stat == DEAD || H.heart_attack)
+ if(H.stat == DEAD)
Stop()
return
- if(!special)
- H.heart_attack = 1
spawn(120)
if(!owner)
@@ -183,15 +181,6 @@
if(!owner)
Stop()
-
-/obj/item/organ/internal/heart/insert(mob/living/carbon/M, special = 0)
- ..()
- if(ishuman(M) && beating)
- var/mob/living/carbon/human/H = M
- if(H.heart_attack)
- H.heart_attack = 0
- return
-
/obj/item/organ/internal/heart/proc/Stop()
beating = 0
update_icon()