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