diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 256656dfa31..b7798ac1c28 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -336,6 +336,7 @@
H.emote("gasp")
if(!H.undergoing_cardiac_arrest() && (prob(10) || defib.combat)) // Your heart explodes.
H.set_heartattack(TRUE)
+ H.shock_internal_organs(100)
add_attack_logs(user, M, "Stunned with [src]")
defib.deductcharge(revivecost)
cooldown = 1
@@ -386,6 +387,7 @@
update_icon()
return
H.set_heartattack(FALSE)
+ H.shock_internal_organs(100)
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)
@@ -420,6 +422,7 @@
H.emote("gasp")
if(tplus > tloss)
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
+ H.shock_internal_organs(100)
H.med_hud_set_health()
H.med_hud_set_status()
defib.deductcharge(revivecost)
@@ -482,6 +485,7 @@
H.Weaken(5)
if(!H.undergoing_cardiac_arrest() && prob(10)) // Your heart explodes.
H.set_heartattack(TRUE)
+ H.shock_internal_organs(100)
playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1)
H.emote("gasp")
add_attack_logs(user, M, "Stunned with [src]")
@@ -537,6 +541,7 @@
H.emote("gasp")
if(tplus > tloss)
H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100))))
+ H.shock_internal_organs(100)
if(isrobot(user))
var/mob/living/silicon/robot/R = user
R.cell.use(revivecost)
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 960374cb647..f33fc7240d2 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -172,6 +172,10 @@
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
return
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.shock_internal_organs(33)
+
L.Stun(stunforce)
L.Weaken(stunforce)
L.apply_effect(STUTTER, stunforce)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index e5122c70604..0e921e7953e 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -147,6 +147,7 @@
if(reagents.has_reagent("teslium"))
shock_damage *= 1.5 //If the mob has teslium in their body, shocks are 50% more damaging!
take_overall_damage(0,shock_damage, TRUE, used_weapon = "Electrocution")
+ shock_internal_organs(shock_damage)
visible_message(
"[src] was shocked by \the [source]!", \
"You feel a powerful shock coursing through your body!", \
@@ -1116,3 +1117,7 @@ so that different stomachs can handle things in different ways VB*/
if(I.flags_inv & HIDEMASK || forced)
update_inv_wear_mask()
update_inv_head()
+
+/mob/living/carbon/proc/shock_internal_organs(intensity)
+ for(var/obj/item/organ/O in internal_organs)
+ O.shock_organ(intensity)
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index ce98cdd4c1e..f7ce8a26daf 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -522,6 +522,16 @@
build_path = /obj/item/organ/internal/heart/cybernetic
category = list("Medical")
+/datum/design/cybernetic_heart_u
+ name = "Upgraded Cybernetic Heart"
+ desc = "An upgraded cybernetic heart."
+ id = "cybernetic_heart_u"
+ req_tech = list("biotech" = 5, "materials" = 5, "engineering" = 5)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500)
+ build_path = /obj/item/organ/internal/heart/cybernetic/upgraded
+ category = list("Medical")
+
/datum/design/cybernetic_lungs
name = "Cybernetic Lungs"
desc = "A pair of cybernetic lungs."
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index a536e4397a1..9342b3afd29 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -33,9 +33,8 @@
..()
to_chat(user, "[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.")
-/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/W, mob/user, params)
- ..()
- if(isscrewdriver(W))
+/obj/item/organ/internal/cyberimp/arm/attackby(obj/item/I, mob/user, params)
+ if(isscrewdriver(I))
if(parent_organ == "r_arm")
parent_organ = "l_arm"
else
@@ -43,8 +42,8 @@
slot = parent_organ + "_device"
to_chat(user, "You modify [src] to be installed on the [parent_organ == "r_arm" ? "right" : "left"] arm.")
update_icon()
- else if(istype(W, /obj/item/card/emag))
- emag_act()
+ else
+ return ..()
/obj/item/organ/internal/cyberimp/arm/remove(mob/living/carbon/M, special = 0)
Retract()
@@ -126,7 +125,7 @@
// You can emag the arm-mounted implant by activating it while holding emag in it's hand.
var/arm_slot = (parent_organ == "r_arm" ? slot_r_hand : slot_l_hand)
- if(istype(owner.get_item_by_slot(arm_slot), /obj/item/card/emag) && emag_act())
+ if(istype(owner.get_item_by_slot(arm_slot), /obj/item/card/emag) && emag_act(owner))
return
if(!holder || (holder in src))
@@ -205,12 +204,12 @@
/obj/item/organ/internal/cyberimp/arm/toolset/l
parent_organ = "l_arm"
-/obj/item/organ/internal/cyberimp/arm/toolset/emag_act()
+/obj/item/organ/internal/cyberimp/arm/toolset/emag_act(mob/user)
if(!(locate(/obj/item/kitchen/knife/combat/cyborg) in items_list))
- to_chat(usr, "You unlock [src]'s integrated knife!")
+ to_chat(user, "You unlock [src]'s integrated knife!")
items_list += new /obj/item/kitchen/knife/combat/cyborg(src)
- return 1
- return 0
+ return TRUE
+ return FALSE
/obj/item/organ/internal/cyberimp/arm/esword
name = "arm-mounted energy blade"
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index bd7cca63779..d6b0399eea4 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -147,4 +147,105 @@
icon_base = "heart-c"
dead_icon = "heart-c-off"
origin_tech = "biotech=5"
- status = ORGAN_ROBOT
\ No newline at end of file
+ status = ORGAN_ROBOT
+
+/obj/item/organ/internal/heart/cybernetic/upgraded
+ name = "upgraded cybernetic heart"
+ desc = "A more advanced version of a cybernetic heart. Grants the user additional stamina and heart stability, but the electronics are vulnerable to shock."
+ icon_state = "heart-c-u-on"
+ icon_base = "heart-c-u"
+ dead_icon = "heart-c-u-off"
+ origin_tech = "biotech=6"
+ var/emagged = FALSE
+ var/attempted_restart = FALSE
+
+/obj/item/organ/internal/heart/cybernetic/upgraded/on_life()
+ if(!ishuman(owner))
+ return
+ if(!(status & ORGAN_DEAD) && !attempted_restart && !beating)
+ to_chat(owner, "Your [name] detects a cardiac event and attempts to return to its normal rhythm!")
+ if(prob(20) && emagged)
+ attempted_restart = TRUE
+ Restart()
+ addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] returns to its normal rhythm!"), 30)
+ addtimer(CALLBACK(src, .proc/recharge), 200)
+ else if(prob(10))
+ attempted_restart = TRUE
+ Restart()
+ addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] returns to its normal rhythm!"), 30)
+ addtimer(CALLBACK(src, .proc/recharge), 300)
+ else
+ attempted_restart = TRUE
+ if(emagged)
+ addtimer(CALLBACK(src, .proc/recharge), 200)
+ else
+ addtimer(CALLBACK(src, .proc/recharge), 300)
+ addtimer(CALLBACK(src, .proc/message_to_owner, owner, "Your [name] fails to return to its normal rhythm!"), 30)
+
+ if(!(status & ORGAN_DEAD))
+ var/boost = emagged ? 2 : 1
+ owner.AdjustDrowsy(-4 * boost)
+ owner.AdjustParalysis(-1 * boost)
+ owner.AdjustStunned(-1 * boost)
+ owner.AdjustWeakened(-1 * boost)
+ owner.SetSleeping(0)
+ owner.adjustStaminaLoss(-1 * boost)
+
+
+/obj/item/organ/internal/heart/cybernetic/upgraded/proc/message_to_owner(mob/M, message)
+ to_chat(M, message)
+
+
+/obj/item/organ/internal/heart/cybernetic/upgraded/proc/recharge()
+ attempted_restart = FALSE
+
+
+/obj/item/organ/internal/heart/cybernetic/upgraded/emag_act(mob/user)
+ if(!emagged)
+ to_chat(user, "You disable the safeties on [src]")
+ emagged = TRUE
+ else
+ to_chat(user, "You re-enable the safeties on [src]")
+ emagged = FALSE
+
+
+/obj/item/organ/internal/heart/cybernetic/upgraded/emp_act(severity)
+ ..()
+ if(emp_proof)
+ return
+ necrotize()
+
+
+/obj/item/organ/internal/heart/cybernetic/upgraded/shock_organ(intensity)
+ if(!ishuman(owner))
+ return
+ intensity = min(intensity, 100)
+ var/numHigh = round(intensity / 5)
+ var/numMid = round(intensity / 10)
+ var/numLow = round(intensity / 20)
+ if(emagged && !(status & ORGAN_DEAD))
+ if(prob(numHigh))
+ to_chat(owner, "Your [name] spasms violently!")
+ owner.adjustBruteLoss(numHigh)
+ if(prob(numHigh))
+ to_chat(owner, "Your [name] shocks you painfully!")
+ owner.adjustFireLoss(numHigh)
+ if(prob(numMid))
+ to_chat(owner, "Your [name] lurches awkwardly!")
+ Stop()
+ if(prob(numMid))
+ to_chat(owner, "Your [name] stops beating!")
+ Stop()
+ if(prob(numLow))
+ to_chat(owner, "Your [name] shuts down!")
+ necrotize()
+ else if(!emagged && !(status & ORGAN_DEAD))
+ if(prob(numMid))
+ to_chat(owner, "Your [name] spasms violently!")
+ owner.adjustBruteLoss(numMid)
+ if(prob(numMid))
+ to_chat(owner, "Your [name] shocks you painfully!")
+ owner.adjustFireLoss(numMid)
+ if(prob(numLow))
+ to_chat(owner, "Your [name] lurches awkwardly!")
+ Stop()
\ No newline at end of file
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index a6165c77f41..a5e85bf572c 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -63,6 +63,15 @@
if(species_override)
dna.species = new species_override
+/obj/item/organ/attackby(obj/item/I, mob/user, params)
+ if(is_robotic() && istype(I, /obj/item/stack/nanopaste))
+ var/obj/item/stack/nanopaste/nano = I
+ nano.use(1)
+ rejuvenate()
+ to_chat(user, "You repair the damage on [src].")
+ return
+ return ..()
+
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
dna = new_dna.Clone()
@@ -138,7 +147,10 @@
/obj/item/organ/examine(mob/user)
..(user)
if(status & ORGAN_DEAD)
- to_chat(user, "The decay has set in.")
+ if(!is_robotic())
+ to_chat(user, "The decay has set in.")
+ else
+ to_chat(user, "It looks in need of repairs.")
/obj/item/organ/proc/handle_germ_effects()
//** Handle the effects of infections
@@ -171,6 +183,7 @@
/obj/item/organ/proc/rejuvenate()
damage = 0
germ_level = 0
+ surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else
@@ -269,6 +282,9 @@
if(2)
receive_damage(7, 1)
+/obj/item/organ/proc/shock_organ(intensity)
+ return
+
/obj/item/organ/proc/remove(var/mob/living/user,special = 0)
if(!istype(owner))
return
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index f39967cc3a2..f8534ffe078 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -262,6 +262,7 @@ This function completely restores a damaged organ to perfect condition.
*/
/obj/item/organ/external/rejuvenate()
damage_state = "00"
+ surgeryize()
if(is_robotic()) //Robotic organs stay robotic.
status = ORGAN_ROBOT
else
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 0a0f90c45dd..bc36cdaaa8f 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ