From 5ce256b73c0917316258e73b4afaada5a1fdeb15 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Thu, 19 Dec 2013 07:25:55 -0500 Subject: [PATCH] Organ/Surgery Overhaul Part 1 --- baystation12.dme | 1 - code/ZAS/Plasma.dm | 6 +- code/game/machinery/Sleeper.dm | 29 ++++++--- code/game/machinery/adv_med.dm | 16 ++++- code/game/machinery/flasher.dm | 10 +-- code/game/objects/items.dm | 33 +++++----- code/game/objects/items/devices/flashlight.dm | 1 + .../objects/items/devices/laserpointer.dm | 10 +-- .../items/weapons/grenades/flashbang.dm | 16 ++--- code/game/objects/items/weapons/tools.dm | 20 +++--- .../mob/living/carbon/human/human_defense.dm | 3 + .../mob/living/carbon/human/human_defines.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 4 -- code/modules/mob/mob_defines.dm | 1 - code/modules/organs/blood.dm | 13 ++-- code/modules/organs/organ.dm | 2 +- code/modules/organs/organ_internal.dm | 38 ++++++++++- code/modules/reagents/Chemistry-Reagents.dm | 33 +++++++++- code/modules/reagents/Chemistry-Recipes.dm | 8 +++ code/modules/surgery/eye.dm | 14 +++- code/modules/surgery/ribcage.dm | 65 +++++++++++++++++-- 21 files changed, 241 insertions(+), 84 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 012e9819e10..5ac21d3e793 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -140,7 +140,6 @@ #include "code\datums\diseases\advance\symptoms\sneeze.dm" #include "code\datums\diseases\advance\symptoms\stimulant.dm" #include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\visionloss.dm" #include "code\datums\diseases\advance\symptoms\vitiligo.dm" #include "code\datums\diseases\advance\symptoms\voice_change.dm" #include "code\datums\diseases\advance\symptoms\vomit.dm" diff --git a/code/ZAS/Plasma.dm b/code/ZAS/Plasma.dm index 9f0e95f6617..716ea216403 100644 --- a/code/ZAS/Plasma.dm +++ b/code/ZAS/Plasma.dm @@ -118,12 +118,12 @@ obj/var/contaminated = 0 /mob/living/carbon/human/proc/burn_eyes() //The proc that handles eye burning. if(prob(20)) src << "\red Your eyes burn!" - eye_stat += 2.5 + var/datum/organ/internal/eyes/E = internal_organs["eyes"] + E.damage += 2.5 eye_blurry = min(eye_blurry+1.5,50) - if (prob(max(0,eye_stat - 20) + 1) &&!eye_blind) + if (prob(max(0,E.damage - 15) + 1) &&!eye_blind) src << "\red You are blinded!" eye_blind += 20 - eye_stat = 0 /mob/living/carbon/human/proc/pl_head_protected() //Checks if the head is adequately sealed. diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 81a4338e733..154bbd047d7 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -11,6 +11,11 @@ density = 1 var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r" +/obj/machinery/sleep_console/process() + if(stat & (NOPOWER|BROKEN)) + return + src.updateUsrDialog() + return /obj/machinery/sleep_console/ex_act(severity) switch(severity) @@ -72,10 +77,11 @@ if(occupant.reagents) for(var/chemical in connected.available_chemicals) dat += "[connected.available_chemicals[chemical]]: [occupant.reagents.get_reagent_amount(chemical)] units
" - dat += "
Refresh meter readings each second
" + dat += "Refresh Meter Readings
" if(src.connected.beaker) + dat += "
Remove Beaker
" if(src.connected.filtering) - dat += "
Stop Dialysis
" + dat += "Stop Dialysis
" dat += text("Output Beaker has [] units of free space remaining

", src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume) else dat += "
Start Dialysis
" @@ -85,8 +91,8 @@ for(var/chemical in connected.available_chemicals) dat += "Inject [connected.available_chemicals[chemical]]: " for(var/amount in connected.amounts) - dat += "[amount] units " - dat += "
" + dat += "[amount] units
" + dat += "
Eject Patient" else dat += "The sleeper is empty." dat += text("

Close", user) @@ -108,19 +114,21 @@ src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) else usr << "\red \b This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!" + src.updateUsrDialog() if (href_list["refresh"]) src.updateUsrDialog() + if (href_list["removebeaker"]) + src.connected.remove_beaker() + src.updateUsrDialog() if (href_list["togglefilter"]) src.connected.toggle_filter() src.updateUsrDialog() + if (href_list["ejectify"]) + src.connected.eject() + src.updateUsrDialog() src.add_fingerprint(usr) return -/obj/machinery/sleep_console/process() - if(stat & (NOPOWER|BROKEN)) - return - src.updateUsrDialog() - return /obj/machinery/sleep_console/power_change() return @@ -144,7 +152,7 @@ anchored = 1 var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r" var/mob/living/carbon/human/occupant = null - var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "dermaline" = "Dermaline", "bicaridine" = "Bicaridine", "dexalin" = "Dexalin") + var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/amounts = list(10, 20) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 @@ -192,6 +200,7 @@ user.drop_item() G.loc = src user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") + src.updateUsrDialog() return else user << "\red The sleeper has a beaker already." diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index dface77429e..31640d7cf1d 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -281,6 +281,7 @@ var/AN = "" var/open = "" var/infected = "" + var/robot = "" var/imp = "" var/bled = "" var/splint = "" @@ -297,6 +298,8 @@ bled = "Bleeding:" if(e.status & ORGAN_BROKEN) AN = "[e.broken_description]:" + if(e.status & ORGAN_ROBOT) + robot = "Prosthetic:" if(e.open) open = "Open:" if(e.implants.len) @@ -304,16 +307,25 @@ if(!AN && !open && !infected & !imp) AN = "None:" if(!(e.status & ORGAN_DESTROYED)) - dat += "[e.display_name][e.burn_dam][e.brute_dam][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]" + dat += "[e.display_name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured]" else dat += "[e.display_name]--Not Found" dat += "" for(var/organ_name in occupant.internal_organs) var/datum/organ/internal/i = occupant.internal_organs[organ_name] + var/mech = "" + if(i.robotic == 1) + mech = "Assisted:" + if(i.robotic == 2) + mech = "Mechanical:" dat += "" - dat += "[i.name]N/A[i.damage]None:" + dat += "[i.name]N/A[i.damage]None:[mech]" dat += "" dat += "" + if(occupant.sdisabilities & BLIND) + dat += text("Cataracts detected.
") + if(occupant.sdisabilities & NEARSIGHTED) + dat += text("Retinal misalignment detected.
") else dat += "\The [src] is empty." else diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 9de6b2c6aa8..303e814ef11 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -79,13 +79,15 @@ continue O.Weaken(strength) - if ((O.eye_stat > 15 && prob(O.eye_stat + 50))) - flick("e_flash", O:flash) - O.eye_stat += rand(1, 2) + if (istype(O, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = O + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + if ((E.damage > E.min_bruised_damage && prob(E.damage + 50))) + flick("e_flash", O:flash) + E.damage += rand(1, 5) else if(!O.blinded) flick("flash", O:flash) - O.eye_stat += rand(0, 2) /obj/machinery/flasher/emp_act(severity) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 379604026ad..54fa3a8baaf 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -542,29 +542,28 @@ "\red You stab yourself in the eyes with [src]!" \ ) if(istype(M, /mob/living/carbon/human)) + var/datum/organ/internal/eyes/eyes = H.internal_organs["eyes"] + eyes.damage += rand(3,4) + if(eyes.damage >= eyes.min_bruised_damage) + if(M.stat != 2) + if(eyes.robotic <= 1) //robot eyes bleeding might be a bit silly + M << "\red Your eyes start to bleed profusely!" + if(prob(50)) + if(M.stat != 2) + M << "\red You drop what you're holding and clutch at your eyes!" + M.drop_item() + M.eye_blurry += 10 + M.Paralyse(1) + M.Weaken(4) + if (eyes.damage >= eyes.min_broken_damage) + if(M.stat != 2) + M << "\red You go blind!" var/datum/organ/external/affecting = M:get_organ("head") if(affecting.take_damage(7)) M:UpdateDamageIcon() else M.take_organ_damage(7) M.eye_blurry += rand(3,4) - M.eye_stat += rand(2,4) - if (M.eye_stat >= 10) - M.eye_blurry += 15+(0.1*M.eye_blurry) - M.disabilities |= NEARSIGHTED - if(M.stat != 2) - M << "\red Your eyes start to bleed profusely!" - if(prob(50)) - if(M.stat != 2) - M << "\red You drop what you're holding and clutch at your eyes!" - M.drop_item() - M.eye_blurry += 10 - M.Paralyse(1) - M.Weaken(4) - if (prob(M.eye_stat - 10 + 1)) - if(M.stat != 2) - M << "\red You go blind!" - M.sdisabilities |= BLIND return /obj/item/clean_blood() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 5762cfd9367..cc651af199d 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -78,6 +78,7 @@ if(M.stat == DEAD || M.sdisabilities & BLIND) //mob is dead or fully blind user << "[M] pupils does not react to the light!" else if(XRAY in M.mutations) //mob has X-RAY vision + flick("flash", M.flash) //Yes, you can still get flashed wit X-Ray. user << "[M] pupils give an eerie glow!" else //they're okay! if(!M.blinded) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 3e368bf4198..d9e9e12892e 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -80,6 +80,8 @@ else if(prob(50)) severity -= 1 severity = min(max(severity, 0), 4) + var/mob/living/carbon/human/H = C + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] switch(severity) if(0) @@ -87,26 +89,26 @@ C << "A small, bright dot appears in your vision." if(1) //industrial grade eye protection - C.eye_stat += rand(0, 2) + E.damage += rand(0, 2) C << "Something bright flashes in the corner of your vision!" if(2) //basic eye protection (sunglasses) flick("flash", C.flash) - C.eye_stat += rand(1, 6) + E.damage += rand(1, 6) C << "Your eyes were blinded!" if(3) //no eye protection if(prob(2)) C.Weaken(1) flick("e_flash", C.flash) - C.eye_stat += rand(3, 7) + E.damage += rand(3, 7) C << "Your eyes were blinded!" if(4) //the effect has been worsened by something if(prob(5)) C.Weaken(1) flick("e_flash", C.flash) - C.eye_stat += rand(5, 10) + E.damage += rand(5, 10) C << "Your eyes were blinded!" else outmsg = "You fail to blind [C] by shining [src] at their eyes." diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 1a50e9ad05c..4024e5275e9 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -48,7 +48,6 @@ //Flashing everyone if(eye_safety < 1) flick("e_flash", M.flash) - M.eye_stat += rand(1, 3) M.Stun(2) M.Weaken(10) @@ -80,13 +79,14 @@ M.ear_deaf = max(M.ear_deaf,5) //This really should be in mob not every check - if (M.eye_stat >= 20) - M << "\red Your eyes start to burn badly!" - M.disabilities |= NEARSIGHTED - if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (prob(M.eye_stat - 20 + 1)) - M << "\red You can't see anything!" - M.sdisabilities |= BLIND + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + if (E.damage >= E.min_bruised_damage) + M << "\red Your eyes start to burn badly!" + if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) + if (E.damage >= E.min_broken_damage) + M << "\red You can't see anything!" if (M.ear_damage >= 15) M << "\red Your ears start to ring badly!" if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index a15f9febf1c..071bdbea9af 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -359,27 +359,29 @@ /obj/item/weapon/weldingtool/proc/eyecheck(mob/user as mob) if(!iscarbon(user)) return 1 var/safety = user:eyecheck() + var/mob/living/carbon/human/H = user + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] switch(safety) if(1) usr << "\red Your eyes sting a little." - user.eye_stat += rand(1, 2) - if(user.eye_stat > 12) + E.damage += rand(1, 2) + if(E.damage > 12) user.eye_blurry += rand(3,6) if(0) usr << "\red Your eyes burn." - user.eye_stat += rand(2, 4) - if(user.eye_stat > 10) - user.eye_blurry += rand(4,10) + E.damage += rand(2, 4) + if(E.damage > 10) + E.damage += rand(4,10) if(-1) usr << "\red Your thermals intensify the welder's glow. Your eyes itch and burn severely." user.eye_blurry += rand(12,20) - user.eye_stat += rand(12, 16) - if(user.eye_stat > 10 && safety < 2) + E.damage += rand(12, 16) + if(E.damage > 10 && safety < 2) user << "\red Your eyes are really starting to hurt. This can't be good for you!" - if (prob(user.eye_stat - 25 + 1)) + if (E.damage >= E.min_broken_damage) user << "\red You go blind!" user.sdisabilities |= BLIND - else if (prob(user.eye_stat - 15 + 1)) + else if (E.damage >= E.min_bruised_damage) user << "\red You go blind!" user.eye_blind = 5 user.eye_blurry = 5 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 8d1f37c50d1..351318adc4a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -173,6 +173,9 @@ emp_act for(var/datum/organ/external/O in organs) if(O.status & ORGAN_DESTROYED) continue O.emp_act(severity) + for(var/datum/organ/internal/O in internal_organs) + if(O.robotic == 0) continue + O.emp_act(severity) ..() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 65aa5adbf9f..12d6d0c57da 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -21,7 +21,7 @@ var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup var/age = 30 //Player's age (pure fluff) - var/b_type = "A+" //Player's bloodtype (Not currently used, just character fluff) + var/b_type = "A+" //Player's bloodtype var/underwear = 1 //Which underwear the player wants var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 2fbe738ac60..05fff665a2a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1401,10 +1401,6 @@ if(!O.up && tinted_weldhelh) client.screen += global_hud.darkMask - if(eye_stat > 20) - if(eye_stat > 30) client.screen += global_hud.darkMask - else client.screen += global_hud.vimpaired - if(machine) if(!machine.check_eye(src)) reset_view(null) else diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index fca0f6abe67..14a7ac1f68f 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -81,7 +81,6 @@ var/lying = 0 var/lying_prev = 0 var/canmove = 1 - var/eye_stat = null//Living, potentially Carbon var/lastpuke = 0 var/unacidable = 0 var/small = 0 diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 9e6bc67eef1..9dd65e507e5 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -68,13 +68,12 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 var/datum/organ/internal/heart/heart = internal_organs["heart"] if(heart) switch(heart.damage) - if(5 to 10) + if(1 to heart.min_bruised_damage) blood_volume *= 0.8 - if(11 to 20) - blood_volume *= 0.5 - if(21 to INFINITY) - blood_volume *= 0.3 - + if(heart.min_bruised_damage to heart.min_broken_damage) + blood_volume *= 0.6 + if(heart.min_broken_damage to INFINITY) + blood_volume *= 0.4 //Effects of bloodloss switch(blood_volume) if(BLOOD_VOLUME_SAFE to 10000) @@ -106,7 +105,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 src << "\red You feel extremely [word]" if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) oxyloss += 5 - toxloss += 5 + toxloss += 1 if(prob(15)) var/word = pick("dizzy","woosey","faint") src << "\red You feel extremely [word]" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 862fe670eb2..816c4d76890 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -58,7 +58,7 @@ internal_organs_by_name["liver"] = new/datum/organ/internal/liver(src) internal_organs_by_name["kidney"] = new/datum/organ/internal/kidney(src) internal_organs_by_name["brain"] = new/datum/organ/internal/brain(src) -// internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(src) + internal_organs_by_name["eyes"] = new/datum/organ/internal/eyes(src) for(var/name in organs_by_name) organs += organs_by_name[name] diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index cb5148f105c..cbf1a935de2 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -10,6 +10,7 @@ var/min_bruised_damage = 10 var/min_broken_damage = 30 var/parent_organ = "chest" + var/robotic = 0 //For being a robot /datum/organ/internal/proc/rejuvenate() damage=0 @@ -31,12 +32,33 @@ src.owner = H /datum/organ/internal/proc/take_damage(amount, var/silent=0) - src.damage += amount + if(src.robotic == 2) + src.damage += amount * 0.8 + else + src.damage += amount var/datum/organ/external/parent = owner.get_organ(parent_organ) if (!silent) owner.custom_pain("Something inside your [parent.display_name] hurts a lot.", 1) +/datum/organ/internal/proc/emp_act(severity) + if(src.robotic == 1) + take_damage(15, 0) + if(severity == 2) + take_damage(5, 0) + if(src.robotic == 2) + take_damage(30, 0) + if(severity == 2) + take_damage(15, 0) + +/datum/organ/internal/proc/mechanize() //Being used to make robutt hearts, etc + robotic = 2 + +/datum/organ/internal/proc/mechassist() //Used to add things like pacemakers, etc + robotic = 1 + min_bruised_damage = 15 + min_broken_damage = 35 + /**************************************************** INTERNAL ORGANS DEFINES ****************************************************/ @@ -102,4 +124,16 @@ /datum/organ/internal/brain name = "brain" - parent_organ = "head" \ No newline at end of file + parent_organ = "head" + +/datum/organ/internal/eyes + name = "eyes" + parent_organ = "head" + + process() //Eye damage replaces the old eye_stat var. + if(damage > min_bruised_damage) + if(damage > min_broken_damage) + owner.client.screen += global_hud.darkMask + owner.eye_blind = 20 + else + owner.client.screen += global_hud.vimpaired \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index d71c5931beb..e8f23848585 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -516,7 +516,7 @@ datum if(15 to 25) M.drowsyness = max(M.drowsyness, 20) if(25 to INFINITY) - M.Paralyse(20) + M.Weaken(20) M.drowsyness = max(M.drowsyness, 30) data++ ..() @@ -1596,6 +1596,11 @@ datum M.eye_blind = 0 // M.disabilities &= ~NEARSIGHTED //doesn't even do anythig cos of the disabilities = 0 bit // M.sdisabilities &= ~BLIND //doesn't even do anythig cos of the sdisabilities = 0 bit + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + if(istype(E)) + E.damage = max(E.damage-5 , 0) M.SetWeakened(0) M.SetStunned(0) M.SetParalysis(0) @@ -1614,6 +1619,25 @@ datum ..() return + peridaxon + name = "Peridaxon" + id = "peridaxon" + description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 +// overdose = 10 + + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/I = H.internal_organs + if(I.parent_organ == "chest") + I.damage = max(I.damage -1 , 0) + ..() + return + + synaptizine name = "Synaptizine" id = "synaptizine" @@ -1710,8 +1734,11 @@ datum if(!M) M = holder.my_atom M.eye_blurry = max(M.eye_blurry-5 , 0) M.eye_blind = max(M.eye_blind-5 , 0) - M.disabilities &= ~NEARSIGHTED - M.eye_stat = max(M.eye_stat-5, 0) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + if(istype(E)) + E.damage = max(E.damage-5 , 0) // M.sdisabilities &= ~1 Replaced by eye surgery ..() return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index bbc8a665380..1e2c1a47496 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -189,6 +189,14 @@ datum required_reagents = list("silicon" = 1, "carbon" = 1) result_amount = 2 + peridaxon + name = "Peridaxon" + id = "peridaxon" + result = "peridaxon" + required_reagents = list("bicaridine" = 2, "clonexadone" = 2) + required_catalysts = list("plasma" = 5) + result_amount = 2 + virus_food name = "Virus Food" id = "virusfood" diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 9f11b48c78f..ebaf436a5ce 100644 --- a/code/modules/surgery/eye.dm +++ b/code/modules/surgery/eye.dm @@ -36,12 +36,15 @@ user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \ "\blue You have separated the corneas on [target]'s eyes with \the [tool].",) target.op_stage.eyes = 1 + target.blinded += 1.5 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \ "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" ) affected.createwound(CUT, 10) + eyes.take_damage(5, 1) /datum/surgery_step/eye/lift_eyes allowed_tools = list( @@ -66,10 +69,12 @@ target.op_stage.eyes = 2 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \ "\red Your hand slips, damaging [target]'s eyes with \the [tool]!") target.apply_damage(10, BRUTE, affected) + eyes.take_damage(5, 1) /datum/surgery_step/eye/mend_eyes allowed_tools = list( @@ -95,10 +100,12 @@ target.op_stage.eyes = 3 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \ "\red Your hand slips, stabbing \the [tool] into [target]'s eye!") target.apply_damage(10, BRUTE, affected) + eyes.take_damage(5, 1) /datum/surgery_step/eye/cauterize allowed_tools = list( @@ -119,16 +126,19 @@ "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].") end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \ "\blue You cauterize the incision around [target]'s eyes with \the [tool].") if (target.op_stage.eyes == 3) + target.disabilities &= ~NEARSIGHTED target.sdisabilities &= ~BLIND - target.eye_stat = 0 + eyes.damage -= 15 target.op_stage.eyes = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"] var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \ "\red Your hand slips, searing [target]'s eyes with \the [tool]!") target.apply_damage(5, BURN, affected) - target.eye_stat += 5 \ No newline at end of file + eyes.take_damage(5, 1) \ No newline at end of file diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 34b420454d7..4c841de491f 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -216,8 +216,12 @@ user.visible_message("[user] starts mending the rupture in [target]'s lungs with \the [tool].", \ "You start mending the rupture in [target]'s lungs with \the [tool]." ) if(heart.damage > 0) - user.visible_message("[user] starts mending the bruises on [target]'s heart with \the [tool].", \ - "You start mending the bruises on [target]'s heart with \the [tool]." ) + if(heart.robotic < 2) + user.visible_message("[user] starts mending the bruises on [target]'s heart with \the [tool].", \ + "You start mending the bruises on [target]'s heart with \the [tool]." ) + if(heart.robotic == 2) + user.visible_message("\blue [user] attempts to repair [target]'s mechanical heart with \the [tool]...", \ + "\blue You attempt to repair [target]'s heart with \the [tool]...") if(liver.damage > 0) user.visible_message("[user] starts mending the bruises on [target]'s liver with \the [tool].", \ "You start mending the bruises on [target]'s liver with \the [tool]." ) @@ -239,9 +243,13 @@ lungs.damage = 0 if(heart.damage > 0) - user.visible_message("\blue [user] treats the bruises on [target]'s heart with \the [tool].", \ - "\blue You treats the bruises on [target]'s heart with \the [tool]." ) - heart.damage = 0 + if(heart.robotic == 2) + user.visible_message("\blue [user] pokes [target]'s mechanical heart with \the [tool].", \ + "\red [target]'s heart is not organic, you cannot operate on it with \the [tool]!") + else + user.visible_message("\blue [user] treats the bruises on [target]'s heart with \the [tool].", \ + "\blue You treat the bruises on [target]'s heart with \the [tool]." ) + heart.damage = 0 if(liver.damage > 0) user.visible_message("\blue [user] treats the bruises on [target]'s liver with \the [tool].", \ @@ -258,3 +266,50 @@ user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s chest with \the [tool]!", \ "\red Your hand slips, slicing an artery inside [target]'s chest with \the [tool]!") affected.createwound(CUT, 20) + + +/datum/surgery_step/ribcage/fix_chest_internal_robot //For artificial organs + allowed_tools = list( + /obj/item/stack/nanopaste = 100, \ + /obj/item/weapon/bonegel = 60, \ + /obj/item/weapon/screwdriver = 30, \ + ) + + min_duration = 70 + max_duration = 90 + + can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/is_chest_organ_damaged = 0 + var/datum/organ/external/chest/chest = target.get_organ("chest") + for(var/datum/organ/internal/I in chest.internal_organs) if(I.damage > 0) + is_chest_organ_damaged = 1 + break + return ..() && is_chest_organ_damaged && target.op_stage.ribcage == 2 + + begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + + if(heart.damage > 0) + if(heart.robotic == 2) + user.visible_message("[user] starts mending the mechanisms on [target]'s heart with \the [tool].", \ + "You start mending the mechanisms on [target]'s heart with \the [tool]." ) + target.custom_pain("The pain in your chest is living hell!",1) + ..() + + end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + if(heart.damage > 0) + user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \ + "\blue You repair [target]'s heart with \the [tool]." ) + heart.damage = 0 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/internal/heart/heart = target.internal_organs["heart"] + user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s heart, gumming it up!!" , \ + "\red Your hand slips, smearing [tool] in the incision in [target]'s heart, gumming it up!") + heart.take_damage(5, 0) + target.adjustToxLoss(5) + +////////////////////////////////////////////////////////////////// +// HEART SURGERY // +//////////////////////////////////////////////////////////////////