diff --git a/code/WorkInProgress/Cib/MedicalSideEffects.dm b/code/WorkInProgress/Cib/MedicalSideEffects.dm index 15580c4bd2..62f9cf75f8 100644 --- a/code/WorkInProgress/Cib/MedicalSideEffects.dm +++ b/code/WorkInProgress/Cib/MedicalSideEffects.dm @@ -83,7 +83,7 @@ /datum/medical_effect/headache name = "Headache" triggers = list("cryoxadone" = 10, "bicaridine" = 15, "tricordrazine" = 15) - cures = list("alkysine", "tramadol") + cures = list("alkysine", "tramadol", "paracetamol", "oxycodone") cure_message = "Your head stops throbbing..." /datum/medical_effect/headache/on_life(mob/living/carbon/human/H, strength) diff --git a/code/ZAS/Plasma.dm b/code/ZAS/Plasma.dm index 9f0e95f661..716ea21640 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/defines/obj/hydro.dm b/code/defines/obj/hydro.dm index 7cb2439cc6..2b57dbeffa 100644 --- a/code/defines/obj/hydro.dm +++ b/code/defines/obj/hydro.dm @@ -132,6 +132,40 @@ plant_type = 0 growthstages = 1 +/obj/item/seeds/shandseed + name = "pack of s'rendarr's hand seeds" + desc = "These seeds grow into a helpful herb called S'Rendarr's Hand, native to Ahdomai." + icon_state = "seed-shand" + mypath = "/obj/item/seeds/shandseed" + species = "shand" + plantname = "S'Rendarr's Hand" + productname = "/obj/item/stack/medical/bruise_pack/tajaran" + lifespan = 50 + endurance = 25 + maturation = 3 + production = 5 + yield = 4 + potency = 10 + plant_type = 0 + growthstages = 3 + +/obj/item/seeds/mtearseed + name = "pack of messa's tear seeds" + desc = "These seeds grow into a helpful herb called Messa's Tear, native to Ahdomai." + icon_state = "seed-mtear" + mypath = "/obj/item/seeds/mtearseed" + species = "mtear" + plantname = "Messa's Tear" + productname = "/obj/item/stack/medical/ointment/tajaran" + lifespan = 50 + endurance = 25 + maturation = 3 + production = 5 + yield = 4 + potency = 10 + plant_type = 0 + growthstages = 3 + /obj/item/seeds/berryseed name = "pack of berry seeds" desc = "These seeds grow into berry bushes." diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index fbf8001483..6695fe4402 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -179,23 +179,18 @@ /area/proc/updateicon() if ((fire || eject || party) && ((!requires_power)?(!requires_power):power_environ))//If it doesn't require power, can still activate this proc. if(fire && !eject && !party) - icon_state = "red" - blend_mode = BLEND_MULTIPLY + icon_state = "blue" /*else if(atmosalm && !fire && !eject && !party) icon_state = "bluenew"*/ else if(!fire && eject && !party) icon_state = "red" - blend_mode = BLEND_MULTIPLY else if(party && !fire && !eject) icon_state = "party" - blend_mode = BLEND_MULTIPLY else icon_state = "blue-red" - blend_mode = BLEND_MULTIPLY else // new lighting behaviour with obj lights icon_state = null - blend_mode = BLEND_DEFAULT /* diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 7480555d69..b8faeeef97 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -8,6 +8,8 @@ var/bomb_set density = 1 var/deployable = 0.0 var/extended = 0.0 + var/lighthack = 0 + var/opened = 0.0 var/timeleft = 60.0 var/timing = 0.0 var/r_code = "ADMIN" @@ -15,15 +17,36 @@ var/bomb_set var/yes_code = 0.0 var/safety = 1.0 var/obj/item/weapon/disk/nuclear/auth = null + var/list/wires = list() + var/light_wire + var/safety_wire + var/timing_wire var/removal_stage = 0 // 0 is no removal, 1 is covers removed, 2 is covers open, // 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. flags = FPRINT use_power = 0 + + /obj/machinery/nuclearbomb/New() ..() r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn. + src.wires["Red"] = 0 + src.wires["Blue"] = 0 + src.wires["Green"] = 0 + src.wires["Marigold"] = 0 + src.wires["Fuschia"] = 0 + src.wires["Black"] = 0 + src.wires["Pearl"] = 0 + var/list/w = list("Red","Blue","Green","Marigold","Black","Fuschia","Pearl") + src.light_wire = pick(w) + w -= src.light_wire + src.timing_wire = pick(w) + w -= src.timing_wire + src.safety_wire = pick(w) + w -= src.safety_wire + /obj/machinery/nuclearbomb/process() if (src.timing) bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed. @@ -36,6 +59,30 @@ var/bomb_set return /obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob) + + if (istype(O, /obj/item/weapon/screwdriver)) + src.add_fingerprint(user) + if (src.auth) + if (src.opened == 0) + src.opened = 1 + overlays += image(icon, "npanel_open") + user << "You unscrew the control panel of [src]." + + else + src.opened = 0 + overlays -= image(icon, "npanel_open") + user << "You screw the control panel of [src] back on." + else + if (src.opened == 0) + user << "The [src] emits a buzzing noise, the panel staying locked in." + if (src.opened == 1) + src.opened = 0 + overlays -= image(icon, "npanel_open") + user << "You screw the control panel of [src] back on." + flick("nuclearbombc", src) + + return + if (src.extended) if (istype(O, /obj/item/weapon/disk/nuclear)) usr.drop_item() @@ -119,6 +166,8 @@ var/bomb_set /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) if (src.extended) + if (src.opened) + nukehack_win(user,50) user.set_machine(src) var/dat = text("Nuclear Fission Explosive
\nAuth. Disk: []
", src, (src.auth ? "++++++++++" : "----------")) if (src.auth) @@ -145,11 +194,23 @@ var/bomb_set visible_message("\red With a steely snap, bolts slide out of [src] and anchor it to the flooring!") else visible_message("\red \The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") - flick("nuclearbombc", src) - src.icon_state = "nuclearbomb1" + if(!src.lighthack) + flick("nuclearbombc", src) + src.icon_state = "nuclearbomb1" src.extended = 1 return +obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) + var/dat as text + dat += "Nuclear Fission Explosive
\nNuclear Device Wires:
" + for(var/wire in src.wires) + dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
") + dat += text("
The device is [src.timing ? "shaking!" : "still"]
") + dat += text("The device is [src.safety ? "quiet" : "whirring"].
") + dat += text("The lights are [src.lighthack ? "static" : "functional"].
") + user << browse("Bomb Defusion[dat]","window=nukebomb_hack") + onclose(user, "nukebomb_hack") + /obj/machinery/nuclearbomb/verb/make_deployable() set category = "Object" set name = "Make Deployable" @@ -161,16 +222,57 @@ var/bomb_set else usr << "\red You adjust some panels to make [src] deployable." src.deployable = 1 + return + /obj/machinery/nuclearbomb/Topic(href, href_list) ..() if (!usr.canmove || usr.stat || usr.restrained()) return - if (!ishuman(usr)) - usr << "\red You don't have the dexterity to do this!" - return 1 if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) usr.set_machine(src) + if(href_list["act"]) + var/temp_wire = href_list["wire"] + if(href_list["act"] == "pulse") + if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) + usr << "You need a multitool!" + else + if(src.wires[temp_wire]) + usr << "You can't pulse a cut wire." + else + if(src.light_wire == temp_wire) + src.lighthack = !src.lighthack + spawn(100) src.lighthack = !src.lighthack + if(src.timing_wire == temp_wire) + if(src.timing) + explode() + if(src.safety_wire == temp_wire) + src.safety = !src.safety + spawn(100) src.safety = !src.safety + if(src.safety == 1) + visible_message("\blue The [src] quiets down.") + if(!src.lighthack) + if (src.icon_state == "nuclearbomb2") + src.icon_state = "nuclearbomb1" + else + visible_message("\blue The [src] emits a quiet whirling noise!") + if(href_list["act"] == "wire") + if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) + usr << "You need wirecutters!" + else + wires[temp_wire] = !wires[temp_wire] + if(src.safety_wire == temp_wire) + if(src.timing) + explode() + if(src.timing_wire == temp_wire) + if(!src.lighthack) + if (src.icon_state == "nuclearbomb2") + src.icon_state = "nuclearbomb1" + src.timing = 0 + bomb_set = 0 + if(src.light_wire == temp_wire) + src.lighthack = !src.lighthack + if (href_list["auth"]) if (src.auth) src.auth.loc = src.loc @@ -211,14 +313,16 @@ var/bomb_set return src.timing = !( src.timing ) if (src.timing) - src.icon_state = "nuclearbomb2" + if(!src.lighthack) + src.icon_state = "nuclearbomb2" if(!src.safety) bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N else bomb_set = 0 else - src.icon_state = "nuclearbomb1" bomb_set = 0 + if(!src.lighthack) + src.icon_state = "nuclearbomb1" if (href_list["safety"]) src.safety = !( src.safety ) if(safety) @@ -266,7 +370,8 @@ var/bomb_set src.timing = -1.0 src.yes_code = 0 src.safety = 1 - src.icon_state = "nuclearbomb3" + if(!src.lighthack) + src.icon_state = "nuclearbomb3" playsound(src,'sound/machines/Alarm.ogg',100,0,5) if (ticker && ticker.mode) ticker.mode.explosion_in_progress = 1 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index fc7202bd17..7eb8fa096e 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -11,6 +11,13 @@ 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) if(1.0) @@ -71,10 +78,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 +93,10 @@ 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 +118,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 +156,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", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/amounts = list(5, 10) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 @@ -169,10 +181,9 @@ if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) src.occupant.vessel.trans_to(beaker, 1) for(var/datum/reagent/x in src.occupant.reagents.reagent_list) - if(x.volume > 20) - src.occupant.reagents.trans_id_to(beaker, x.id, 2) - src.occupant.vessel.trans_to(beaker, 1) - src.updateDialog() + src.occupant.reagents.trans_to(beaker, 3) + src.occupant.vessel.trans_to(beaker, 1) + src.updateUsrDialog() return @@ -191,6 +202,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 3f17fe7299..4b2fb50c54 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -281,6 +281,7 @@ var/infected = "" var/imp = "" var/bled = "" + var/robot = "" var/splint = "" var/internal_bleeding = "" var/lung_ruptured = "" @@ -295,6 +296,8 @@ bled = "Bleeding:" if(e.status & ORGAN_BROKEN) AN = "[e.broken_description]:" + if(e.status & ORGAN_ROBOT) + robot = "Prosthetic:" if(e.open) open = "Open:" var/unknown_body = 0 @@ -308,16 +311,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 9de6b2c6aa..303e814ef1 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/machinery/vending.dm b/code/game/machinery/vending.dm index 20415b6721..d7bb61c0be 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -774,8 +774,8 @@ /obj/item/seeds/poppyseed = 3,/obj/item/seeds/ambrosiavulgarisseed = 3,/obj/item/seeds/whitebeetseed = 3,/obj/item/seeds/watermelonseed = 3,/obj/item/seeds/limeseed = 3, /obj/item/seeds/lemonseed = 3,/obj/item/seeds/orangeseed = 3,/obj/item/seeds/grassseed = 3,/obj/item/seeds/cocoapodseed = 3,/obj/item/seeds/plumpmycelium = 2, /obj/item/seeds/cabbageseed = 3,/obj/item/seeds/grapeseed = 3,/obj/item/seeds/pumpkinseed = 3,/obj/item/seeds/cherryseed = 3,/obj/item/seeds/plastiseed = 3,/obj/item/seeds/riceseed = 3) - contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2, - /obj/item/seeds/nettleseed = 2,/obj/item/seeds/reishimycelium = 2) + contraband = list(/obj/item/seeds/amanitamycelium = 2,/obj/item/seeds/glowshroom = 2,/obj/item/seeds/libertymycelium = 2,/obj/item/seeds/mtearseed = 2, + /obj/item/seeds/nettleseed = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/reishimycelium = 2,/obj/item/seeds/shandseed = 2,) premium = list(/obj/item/toy/waterflower = 1) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index dd445337b7..6c38442fec 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -522,29 +522,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 c1ccb4aa6c..a89a4573ea 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/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index ccc00290db..47175e20d1 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -65,24 +65,31 @@ var/mob/living/carbon/human/H = M var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - if(!affecting.bandage()) - user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged." - return 1 + if(affecting.open == 0) + if(!affecting.bandage()) + user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged." + return 1 + else + for (var/datum/wound/W in affecting.wounds) + if (W.internal) + continue + if (W.current_stage <= W.max_bleeding_stage) + user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \ + "\blue You bandage [W.desc] on [M]'s [affecting.display_name]." ) + //H.add_side_effect("Itch") + else if (istype(W,/datum/wound/bruise)) + user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \ + "\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." ) + else + user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \ + "\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." ) + use(1) else - for (var/datum/wound/W in affecting.wounds) - if (W.internal) - continue - if (W.current_stage <= W.max_bleeding_stage) - user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \ - "\blue You bandage [W.desc] on [M]'s [affecting.display_name]." ) - //H.add_side_effect("Itch") - else if (istype(W,/datum/wound/bruise)) - user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \ - "\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." ) - else - user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \ - "\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." ) - use(1) + if (can_operate(H)) //Checks if mob is lying down on table for surgery + if (do_surgery(H,user,src)) + return + else + user << "The [affecting.display_name] is cut open, you'll need more than a bandage!" /obj/item/stack/medical/ointment name = "ointment" @@ -101,30 +108,38 @@ var/mob/living/carbon/human/H = M var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - if(!affecting.salve()) - user << "\red The wounds on [M]'s [affecting.display_name] have already been salved." - return 1 + if(affecting.open == 0) + if(!affecting.salve()) + user << "\red The wounds on [M]'s [affecting.display_name] have already been salved." + return 1 + else + user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \ + "\blue You salve wounds on [M]'s [affecting.display_name]." ) + use(1) else - user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \ - "\blue You salve wounds on [M]'s [affecting.display_name]." ) - use(1) + if (can_operate(H)) //Checks if mob is lying down on table for surgery + if (do_surgery(H,user,src)) + return + else + user << "The [affecting.display_name] is cut open, you'll need more than a bandage!" /obj/item/stack/medical/bruise_pack/tajaran name = "\improper S'rendarr's Hand leaf" singular_name = "S'rendarr's Hand leaf" - desc = "A soft leaf that is rubbed on bruises." + desc = "A poultice made of soft leaves that is rubbed on bruises." icon = 'icons/obj/harvest.dmi' - icon_state = "cabbage" + icon_state = "shandp" heal_brute = 7 /obj/item/stack/medical/ointment/tajaran - name = "\improper Messa's Tear leaf" - singular_name = "Messa's Tear leaf" - desc = "A cold leaf that is rubbed on burns." + name = "\improper Messa's Tear petals" + singular_name = "Messa's Tear petals" + desc = "A poultice made of cold, blue petals that is rubbed on burns." icon = 'icons/obj/harvest.dmi' - icon_state = "ambrosiavulgaris" + icon_state = "mtearp" heal_burn = 7 + /obj/item/stack/medical/advanced/bruise_pack name = "advanced trauma kit" singular_name = "advanced trauma kit" @@ -141,25 +156,32 @@ var/mob/living/carbon/human/H = M var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - if(!affecting.bandage()) - user << "\red The wounds on [M]'s [affecting.display_name] have already been treated." - return 1 + if(affecting.open == 0) + if(!affecting.bandage()) + user << "\red The wounds on [M]'s [affecting.display_name] have already been treated." + return 1 + else + for (var/datum/wound/W in affecting.wounds) + if (W.internal) + continue + if (W.current_stage <= W.max_bleeding_stage) + user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \ + "\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." ) + //H.add_side_effect("Itch") + else if (istype(W,/datum/wound/bruise)) + user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \ + "\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." ) + else + user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \ + "\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." ) + affecting.heal_damage(heal_brute,0) + use(1) else - for (var/datum/wound/W in affecting.wounds) - if (W.internal) - continue - if (W.current_stage <= W.max_bleeding_stage) - user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \ - "\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." ) - //H.add_side_effect("Itch") - else if (istype(W,/datum/wound/bruise)) - user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \ - "\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." ) - else - user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \ - "\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." ) - affecting.heal_damage(heal_brute,0) - use(1) + if (can_operate(H)) //Checks if mob is lying down on table for surgery + if (do_surgery(H,user,src)) + return + else + user << "The [affecting.display_name] is cut open, you'll need more than a bandage!" /obj/item/stack/medical/advanced/ointment name = "advanced burn kit" @@ -178,14 +200,21 @@ var/mob/living/carbon/human/H = M var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting) - if(!affecting.salve()) - user << "\red The wounds on [M]'s [affecting.display_name] have already been salved." - return 1 + if(affecting.open == 0) + if(!affecting.salve()) + user << "\red The wounds on [M]'s [affecting.display_name] have already been salved." + return 1 + else + user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \ + "\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." ) + affecting.heal_damage(0,heal_burn) + use(1) else - user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \ - "\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." ) - affecting.heal_damage(0,heal_burn) - use(1) + if (can_operate(H)) //Checks if mob is lying down on table for surgery + if (do_surgery(H,user,src)) + return + else + user << "The [affecting.display_name] is cut open, you'll need more than a bandage!" /obj/item/stack/medical/splint name = "medical splints" diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 026ddb77f5..db0ab6b088 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -26,12 +26,20 @@ if (istype(M,/mob/living/carbon/human)) //Repairing robolimbs var/mob/living/carbon/human/H = M var/datum/organ/external/S = H.get_organ(user.zone_sel.selecting) - if (S && (S.status & ORGAN_ROBOT)) - if(S.get_damage()) - S.heal_damage(15, 15, robo_repair = 1) - H.updatehealth() - use(1) - user.visible_message("\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.display_name] with \the [src].",\ - "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name].") + + if(S.open == 1) + if (S && (S.status & ORGAN_ROBOT)) + if(S.get_damage()) + S.heal_damage(15, 15, robo_repair = 1) + H.updatehealth() + use(1) + user.visible_message("\The [user] applies some nanite paste at[user != M ? " \the [M]'s" : " \the"][S.display_name] with \the [src].",\ + "You apply some nanite paste at [user == M ? "your" : "[M]'s"] [S.display_name].") + else + user << "Nothing to fix here." + else + if (can_operate(H)) + if (do_surgery(H,user,src)) + return else - user << "Nothing to fix here." + user << "Nothing to fix in here." \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 1a50e9ad05..4024e5275e 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 25f86aed47..5c50973691 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -354,33 +354,36 @@ /obj/item/weapon/weldingtool/proc/eyecheck(mob/user as mob) if(!iscarbon(user)) return 1 var/safety = user:eyecheck() - switch(safety) - if(1) - usr << "\red Your eyes sting a little." - user.eye_stat += rand(1, 2) - if(user.eye_stat > 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) - 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) - user << "\red Your eyes are really starting to hurt. This can't be good for you!" - if (prob(user.eye_stat - 25 + 1)) - user << "\red You go blind!" - user.sdisabilities |= BLIND - else if (prob(user.eye_stat - 15 + 1)) - user << "\red You go blind!" - user.eye_blind = 5 - user.eye_blurry = 5 - user.disabilities |= NEARSIGHTED - spawn(100) - user.disabilities &= ~NEARSIGHTED + if(istype(user, /mob/living/carbon/human)) + 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." + E.damage += rand(1, 2) + if(E.damage > 12) + user.eye_blurry += rand(3,6) + if(0) + usr << "\red Your eyes burn." + 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) + 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 (E.damage >= E.min_broken_damage) + user << "\red You go blind!" + user.sdisabilities |= BLIND + else if (E.damage >= E.min_bruised_damage) + user << "\red You go blind!" + user.eye_blind = 5 + user.eye_blurry = 5 + user.disabilities |= NEARSIGHTED + spawn(100) + user.disabilities &= ~NEARSIGHTED return diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ca9b23ef3d..51d8bb92da 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -262,6 +262,7 @@ datum/preferences //dat += "Skin pattern: Adjust
" dat += "Needs Glasses: [disabilities == 0 ? "No" : "Yes"]
" dat += "Limbs: Adjust
" + dat += "Internal Organs: Adjust
" //display limbs below var/ind = 0 @@ -286,6 +287,10 @@ datum/preferences organ_name = "left hand" if("r_hand") organ_name = "right hand" + if("heart") + organ_name = "heart" + if("eyes") + organ_name = "eyes" if(status == "cyborg") ++ind @@ -297,6 +302,24 @@ datum/preferences if(ind > 1) dat += ", " dat += "\tAmputated [organ_name]" + else if(status == "mechanical") + ++ind + if(ind > 1) + dat += ", " + dat += "\tMechanical [organ_name]" + else if(status == "assisted") + ++ind + if(ind > 1) + dat += ", " + switch(organ_name) + if("heart") + dat += "\tPacemaker-assisted [organ_name]" + if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements + dat += "\tSurgically altered [organ_name]" + if("eyes") + dat += "\tRetinal overlayed [organ_name]" + else + dat += "\tMechanically assisted [organ_name]" if(!ind) dat += "\[...\]

" else @@ -1048,6 +1071,28 @@ datum/preferences if(second_limb) organ_data[second_limb] = "cyborg" + if("organs") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") + if(!organ_name) return + + var/organ = null + switch(organ_name) + if("Heart") + organ = "heart" + if("Eyes") + organ = "eyes" + + var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical") + if(!new_state) return + + switch(new_state) + if("Normal") + organ_data[organ] = null + if("Assisted") + organ_data[organ] = "assisted" + if("Mechanical") + organ_data[organ] = "mechanical" + if("skin_style") var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3") if(!skin_style_name) return @@ -1167,19 +1212,27 @@ datum/preferences character.skills = skills // Destroy/cyborgize organs + for(var/name in organ_data) var/datum/organ/external/O = character.organs_by_name[name] - if(!O) continue - + var/datum/organ/internal/I = character.internal_organs_by_name[name] var/status = organ_data[name] + if(status == "amputated") O.amputated = 1 O.status |= ORGAN_DESTROYED O.destspawn = 1 - else if(status == "cyborg") + if(status == "cyborg") O.status |= ORGAN_ROBOT + if(status == "assisted") + I.mechassist() + else if(status == "mechanical") + I.mechanize() + + else continue + if(underwear > underwear_m.len || underwear < 1) - underwear = 1 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. + underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES character.underwear = underwear if(backbag > 4 || backbag < 1) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 4044c0aae1..2d06c5fee7 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -159,6 +159,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/I in O.internal_organs) + if(I.robotic == 0) continue + I.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 315b3f4091..104e60fff8 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 0c822a4fa3..d9354dccd6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -960,6 +960,9 @@ var/datum/organ/internal/liver/liver = internal_organs["liver"] liver.process() + var/datum/organ/internal/eyes/eyes = internal_organs["eyes"] + eyes.process() + updatehealth() return //TODO: DEFERRED @@ -1335,10 +1338,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 @@ -1496,6 +1495,15 @@ if(temp <= PULSE_FAST && temp >= PULSE_NONE) temp++ break + for(var/datum/reagent/R in reagents.reagent_list) //To avoid using fakedeath + if(R.id in heartstopper) + temp = PULSE_NONE + break + for(var/datum/reagent/R in reagents.reagent_list) //Conditional heart-stoppage + if(R.id in cheartstopper) + if(R.volume >= R.overdose) + temp = PULSE_NONE + break return temp diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index 0c1ba44207..9ea6557485 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -15,10 +15,14 @@ src.traumatic_shock -= 10 if(reagents.has_reagent("inaprovaline")) src.traumatic_shock -= 25 + if(reagents.has_reagent("synaptizine")) + src.traumatic_shock -= 40 + if(reagents.has_reagent("paracetamol")) + src.traumatic_shock -= 50 if(reagents.has_reagent("tramadol")) - src.traumatic_shock -= 80 // make synaptizine function as good painkiller + src.traumatic_shock -= 80 if(reagents.has_reagent("oxycodone")) - src.traumatic_shock -= 200 // make synaptizine function as good painkiller + src.traumatic_shock -= 200 if(src.slurring) src.traumatic_shock -= 20 if(src.analgesic) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ddfd7d1606..baceaa2073 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -280,7 +280,6 @@ blinded = 0 eye_blind = 0 eye_blurry = 0 - eye_stat = 0 ear_deaf = 0 ear_damage = 0 heal_overall_damage(getBruteLoss(), getFireLoss()) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 5f7c707635..dc984663dd 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/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index caa104a98a..d23c2407c9 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -114,6 +114,11 @@ name = "Ponytail 3" icon_state = "hair_ponytail3" + sideponytail + name = "Side Ponytail" + icon_state = "hair_stail" + gender = FEMALE + parted name = "Parted" icon_state = "hair_parted" @@ -241,6 +246,11 @@ icon_state = "hair_gelled" gender = FEMALE + gentle + name = "Gentle" + icon_state = "hair_gentle" + gender = FEMALE + spiky name = "Spiky" icon_state = "hair_spikey" @@ -264,6 +274,11 @@ icon_state = "hair_braid" gender = FEMALE + braid2 + name = "Long Braid" + icon_state = "hair_hbraid" + gender = FEMALE + odango name = "Odango" icon_state = "hair_odango" @@ -469,6 +484,18 @@ species_allowed = list("Tajaran") do_colouration = 0 + taj_ears_bangs + name = "Tajara Bangs" + icon_state = "hair_bangs" + species_allowed = list("Tajaran") + do_colouration = 0 + + taj_ears_braid + name = "Tajara Braid" + icon_state = "hair_tbraid" + species_allowed = list("Tajaran") + do_colouration = 0 + taj_ears_shaggy name = "Tajara Shaggy" icon_state = "hair_shaggy" diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index dd31d28ac7..a0a88e2120 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -55,11 +55,11 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 // being pumped properly anymore. var/datum/organ/internal/heart/heart = internal_organs["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) + if(heart.min_bruised_damage to heart.min_broken_damage) + blood_volume *= 0.6 + if(heart.min_broken_damage to INFINITY) blood_volume *= 0.3 //Effects of bloodloss @@ -93,7 +93,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 += 3 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 33ce1131c5..89f66c1720 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -35,6 +35,7 @@ /mob/living/carbon/human/var/list/organs = list() /mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs +/mob/living/carbon/human/var/list/internal_organs_by_name = list() // so internal organs have less ickiness too //Creates and initializes and connects external and internal organs /mob/living/carbon/human/proc/make_organs() @@ -51,11 +52,12 @@ organs_by_name["l_foot"] = new/datum/organ/external/l_foot(organs_by_name["l_leg"]) organs_by_name["r_foot"] = new/datum/organ/external/r_foot(organs_by_name["r_leg"]) - new/datum/organ/internal/heart(src) - new/datum/organ/internal/lungs(src) - new/datum/organ/internal/liver(src) - new/datum/organ/internal/kidney(src) - new/datum/organ/internal/brain(src) + internal_organs_by_name["heart"] = new/datum/organ/internal/heart(src) + internal_organs_by_name["lungs"] = new/datum/organ/internal/lungs(src) + 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) for(var/name in organs_by_name) organs += organs_by_name[name] diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index a671584ed4..4c96749e87 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -45,6 +45,7 @@ // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 + /datum/organ/external/New(var/datum/organ/external/P) if(P) parent = P @@ -297,6 +298,11 @@ This function completely restores a damaged organ to perfect condition. #define GANGREN_LEVEL_TERMINAL 2500 #define GERM_TRANSFER_AMOUNT germ_level/500 /datum/organ/external/proc/update_germs() + + if(status & ORGAN_ROBOT|ORGAN_DESTROYED) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. + germ_level = 0 + return + if(germ_level > 0 && owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs //Syncing germ levels with external wounds for(var/datum/wound/W in wounds) @@ -346,6 +352,9 @@ This function completely restores a damaged organ to perfect condition. if(!owner.reagents.has_reagent("bicaridine")) //bicard stops internal wounds from growing bigger with time, and also stop bleeding W.open_wound(0.1 * wound_update_accuracy) owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy) + if(!owner.reagents.has_reagent("inaprovaline")) //This little copypaste will allow inaprovaline to work too, giving it a much needed buff to help medical. + W.open_wound(0.1 * wound_update_accuracy) + owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy) owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy)//Bicaridine slows Internal Bleeding if(prob(1 * wound_update_accuracy)) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 43d0a180d8..35be9ba4e8 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -5,15 +5,15 @@ /mob/living/carbon/human/var/list/internal_organs = list() /datum/organ/internal - // amount of damage to the organ - var/damage = 0 + var/damage = 0 // amount of damage to the organ 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 - + /datum/organ/internal/proc/is_bruised() return damage >= min_bruised_damage @@ -31,12 +31,51 @@ 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) + switch(robotic) + if(0) + return + if(1) + switch (severity) + if (1.0) + take_damage(20,0) + return + if (2.0) + take_damage(7,0) + return + if(3.0) + take_damage(3,0) + return + if(2) + switch (severity) + if (1.0) + take_damage(40,0) + return + if (2.0) + take_damage(15,0) + return + if(3.0) + take_damage(10,0) + return + +/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 +141,14 @@ /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(is_bruised()) + owner.eye_blurry = 20 + if(is_broken()) + owner.eye_blind = 20 diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index 718abbe272..987e7d026c 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -9,6 +9,8 @@ mob/var/next_pain_time = 0 // amount is a num from 1 to 100 mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0) if(stat >= 2) return + if(reagents.has_reagent("paracetamol")) + return if(reagents.has_reagent("tramadol")) return if(reagents.has_reagent("oxycodone")) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 363908c548..bf29dc863f 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -731,13 +731,29 @@ datum ..() return + paracetamol + name = "Paracetamol" + id = "paracetamol" + description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller." + reagent_state = LIQUID + color = "#C855DC" + overdose = 60 + + on_mob_life(var/mob/living/M as mob) + if (volume > overdose) + M.hallucination = max(M.hallucination, 2) + tramadol name = "Tramadol" id = "tramadol" description = "A simple, yet effective painkiller." reagent_state = LIQUID color = "#C8A5DC" - overdose = REAGENTS_OVERDOSE + overdose = 30 + + on_mob_life(var/mob/living/M as mob) + if (volume > overdose) + M.hallucination = max(M.hallucination, 2) oxycodone name = "Oxycodone" @@ -745,7 +761,13 @@ datum description = "An effective and very addictive painkiller." reagent_state = LIQUID color = "#C805DC" - overdose = REAGENTS_OVERDOSE + overdose = 20 + + on_mob_life(var/mob/living/M as mob) + if (volume > overdose) + M.druggy = max(M.druggy, 10) + M.hallucination = max(M.hallucination, 3) + virus_food name = "Virus Food" @@ -1025,7 +1047,7 @@ datum if(M.stat == 2.0) return if(!M) M = holder.my_atom - if(M.getOxyLoss() && prob(80)) M.adjustOxyLoss(-1*REM) + if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM) if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(1*REM,0) if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,1*REM) if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-1*REM) @@ -1069,7 +1091,6 @@ datum M.sdisabilities = 0 M.eye_blurry = 0 M.eye_blind = 0 - M.eye_stat = 0 M.SetWeakened(0) M.SetStunned(0) M.SetParalysis(0) @@ -1189,9 +1210,31 @@ 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) -// M.sdisabilities &= ~1 Replaced by eye surgery + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/eyes/E = H.internal_organs["eyes"] + if(istype(E)) + if(E.damage > 0) + E.damage -= 1 + ..() + 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/external/chest/C = H.get_organ("chest") + for(var/datum/organ/internal/I in C.internal_organs) + if(I.damage > 0) + I.damage -= 0.20 ..() return @@ -1658,10 +1701,12 @@ datum if(prob(5)) M.emote("yawn") if(12 to 15) M.eye_blurry = max(M.eye_blurry, 10) - if(15 to 25) + if(15 to 49) + if(prob(50)) + M.Weaken(2) M.drowsyness = max(M.drowsyness, 20) - if(25 to INFINITY) - M.Paralyse(20) + if(50 to INFINITY) + M.Weaken(20) M.drowsyness = max(M.drowsyness, 30) data++ ..() @@ -1673,9 +1718,10 @@ datum description = "A powerful sedative." reagent_state = SOLID color = "#000067" // rgb: 0, 0, 103 - toxpwr = 0 + toxpwr = 1 custom_metabolism = 0.1 //Default 0.2 - overdose = REAGENTS_OVERDOSE/2 + overdose = 15 + overdose_dam = 5 on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -1685,11 +1731,50 @@ datum if(1) M.confused += 2 M.drowsyness += 2 - if(2 to 50) + if(2 to 199) + M.Weaken(30) + if(200 to INFINITY) M.sleeping += 1 - if(51 to INFINITY) - M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) + ..() + return + + toxin/potassium_chloride + name = "Potassium Chloride" + id = "potassium_chloride" + description = "A delicious salt that stops the heart when injected into cardiac muscle." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255,255,255 + toxpwr = 0 + overdose = 30 + + on_mob_life(var/mob/living/carbon/M as mob) + var/mob/living/carbon/human/H = M + if(H.stat != 1) + if (volume >= overdose) + if(H.losebreath >= 10) + H.losebreath = max(10, H.losebreath-10) + H.adjustOxyLoss(2) + H.Weaken(10) + ..() + return + + toxin/potassium_chlorophoride + name = "Potassium Chlorophoride" + id = "potassium_chlorophoride" + description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!" + reagent_state = SOLID + color = "#FFFFFF" // rgb: 255,255,255 + toxpwr = 2 + overdose = 20 + + on_mob_life(var/mob/living/carbon/M as mob) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.stat != 1) + if(H.losebreath >= 10) + H.losebreath = max(10, M.losebreath-10) + H.adjustOxyLoss(2) + H.Weaken(10) ..() return @@ -2347,7 +2432,7 @@ datum id = "grapejuice" description = "It's grrrrrape!" color = "#863333" // rgb: 134, 51, 51 - + drink/grapesoda name = "Grape Soda" id = "grapesoda" @@ -3054,29 +3139,29 @@ datum switch(data) if(1 to 25) if (!M.stuttering) M.stuttering = 1 - M.make_dizzy(10) + M.make_dizzy(1) M.hallucination = max(M.hallucination, 3) if(prob(1)) M.emote(pick("twitch","giggle")) if(25 to 75) if (!M.stuttering) M.stuttering = 1 M.hallucination = max(M.hallucination, 10) - M.make_jittery(20) - M.make_dizzy(20) + M.make_jittery(2) + M.make_dizzy(2) M.druggy = max(M.druggy, 45) if(prob(5)) M.emote(pick("twitch","giggle")) if (75 to 150) if (!M.stuttering) M.stuttering = 1 M.hallucination = max(M.hallucination, 60) - M.make_jittery(40) - M.make_dizzy(40) + M.make_jittery(4) + M.make_dizzy(4) M.druggy = max(M.druggy, 60) if(prob(10)) M.emote(pick("twitch","giggle")) if(prob(30)) M.adjustToxLoss(2) if (150 to 300) if (!M.stuttering) M.stuttering = 1 M.hallucination = max(M.hallucination, 60) - M.make_jittery(40) - M.make_dizzy(40) + M.make_jittery(4) + M.make_dizzy(4) M.druggy = max(M.druggy, 60) if(prob(10)) M.emote(pick("twitch","giggle")) if(prob(30)) M.adjustToxLoss(2) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 3d97068901..bb168446d5 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -105,11 +105,19 @@ datum required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1) result_amount = 3 + paracetamol + name = "Paracetamol" + id = "paracetamol" + result = "paracetamol" + required_reagents = list("tramadol" = 1, "sugar" = 1, "water" = 1) + result_amount = 3 + oxycodone name = "Oxycodone" id = "oxycodone" result = "oxycodone" - required_reagents = list("ethanol" = 1, "tramadol" = 1, "plasma" = 1) + required_reagents = list("ethanol" = 1, "tramadol" = 1) + required_catalysts = list("plasma" = 1) result_amount = 1 //cyanide @@ -119,6 +127,13 @@ datum // required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1) // result_amount = 1 + water //I can't believe we never had this. + name = "Water" + id = "water" + result = null + required_reagents = list("oxygen" = 2, "hydrogen" = 1) + result_amount = 1 + thermite name = "Thermite" id = "thermite" @@ -189,6 +204,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" @@ -451,6 +474,27 @@ datum required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) result_amount = 1 + potassium_chloride + name = "Potassium Chloride" + id = "potassium_chloride" + id = "potassium_chloride" + required_reagents = list("sodiumchloride" = 1, "potassium" = 1) + result_amount = 2 + + potassium_chlorophoride + name = "Potassium Chlorophoride" + id = "potassium_chlorophoride" + id = "potassium_chlorophoride" + required_reagents = list("potassium_chloride" = 1, "plasma" = 1, "chloral_hydrate" = 1) + result_amount = 4 + + stoxin + name = "Sleep Toxin" + id = "stoxin" + result = "stoxin" + required_reagents = list("chloralhydrate" = 1, "sugar" = 4) + result_amount = 5 + zombiepowder name = "Zombie Powder" id = "zombiepowder" @@ -1790,7 +1834,7 @@ datum result = "barefoot" required_reagents = list("berryjuice" = 1, "cream" = 1, "vermouth" = 1) result_amount = 3 - + grapesoda //Allows Grape Soda to be made name = "Grape Soda" id = "grapesoda" diff --git a/code/modules/reagents/reagent_containers/food/snacks/grown.dm b/code/modules/reagents/reagent_containers/food/snacks/grown.dm index c47103e282..b8be5cf0bd 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/grown.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/grown.dm @@ -243,6 +243,50 @@ reagents.add_reagent("plasticide", 1+round((potency / 10), 1)) bitesize = 1+round(reagents.total_volume / 2, 1) + +/obj/item/weapon/reagent_containers/food/snacks/grown/shand + seed = "/obj/item/seeds/shandseed" + name = "S'rendarr's Hand leaf" + desc = "A leaf sample from a lowland thicket shrub, often hid in by prey and predator to staunch their wounds and conceal their scent, allowing the plant to spread far on it's native Ahdomai. Smells strongly like wax." + icon_state = "shand" + New() + ..() + spawn(5) //So potency can be set in the proc that creates these crops + reagents.add_reagent("bicaridine", round((potency / 10), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) + +/obj/item/weapon/reagent_containers/food/snacks/grown/mtear + seed = "/obj/item/seeds/mtearseed" + name = "sprig of Messa's Tear" + desc = "A mountain climate herb with a soft, cold blue flower, known to contain an abundance of chemicals in it's flower useful to treating burns- Bad for the allergic to pollen." + icon_state = "mtear" + New() + ..() + spawn(5) //So potency can be set in the proc that creates these crops + reagents.add_reagent("honey", 1+round((potency / 10), 1)) + reagents.add_reagent("kelotane", 3+round((potency / 5), 1)) + bitesize = 1+round(reagents.total_volume / 2, 1) + +/obj/item/weapon/reagent_containers/food/snacks/grown/mtear/attack_self(mob/user as mob) + if(istype(user.loc,/turf/space)) + return + var/obj/item/stack/medical/ointment/tajaran/poultice = new /obj/item/stack/medical/ointment/tajaran(user.loc) + + poultice.heal_burn = potency + del(src) + + user << "You mash the petals into a poultice." + +/obj/item/weapon/reagent_containers/food/snacks/grown/shand/attack_self(mob/user as mob) + if(istype(user.loc,/turf/space)) + return + var/obj/item/stack/medical/bruise_pack/tajaran/poultice = new /obj/item/stack/medical/bruise_pack/tajaran(user.loc) + + poultice.heal_brute = potency + del(src) + + user << "You mash the leaves into a poultice." + /obj/item/weapon/reagent_containers/food/snacks/grown/glowberries seed = "/obj/item/seeds/glowberryseed" name = "bunch of glow-berries" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 076e769d8b..74ea366c25 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -131,6 +131,14 @@ ..() reagents.add_reagent("kelotane", 15) +/obj/item/weapon/reagent_containers/pill/paracetamol + name = "Paracetamol pill" + desc = "Tylenol! A painkiller for the ages. Chewables!" + icon_state = "pill8" + New() + ..() + reagents.add_reagent("paracetamol", 15) + /obj/item/weapon/reagent_containers/pill/tramadol name = "Tramadol pill" desc = "A simple painkiller." diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm index 9f11b48c78..b65aaf9608 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, 0) /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, 0) /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, 0) /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 = 0 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, 0) \ No newline at end of file diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm index 747d8a4363..7515fa0529 100644 --- a/code/modules/surgery/ribcage.dm +++ b/code/modules/surgery/ribcage.dm @@ -188,9 +188,9 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/ribcage/fix_chest_internal allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ - /obj/item/weapon/shard = 50, \ + /obj/item/stack/medical/advanced/bruise_pack= 100, \ + /obj/item/stack/medical/bruise_pack = 20, \ + /obj/item/stack/medical/bruise_pack/tajaran = 70, \ ) min_duration = 70 @@ -205,54 +205,124 @@ 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"] - var/datum/organ/internal/lungs/lungs = target.internal_organs["lungs"] - var/datum/organ/internal/liver/liver = target.internal_organs["liver"] - var/datum/organ/internal/liver/kidney = target.internal_organs["kidney"] + var/tool_name = "\the [tool]" + if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) + tool_name = "regenerative membrane" + if (istype(tool, /obj/item/stack/medical/bruise_pack)) + if (istype(tool, /obj/item/stack/medical/bruise_pack/tajaran)) + tool_name = "the poultice" + else + tool_name = "the bandaid" + var/datum/organ/external/chest/chest = target.get_organ("chest") + for(var/datum/organ/internal/I in chest.internal_organs) + if(I && I.damage > 0) + if(I.robotic < 2) + user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ + "You start treating damage to [target]'s [I.name] with [tool_name]." ) + else + user.visible_message("\blue [user] attempts to repair [target]'s mechanical [I.name] with [tool_name]...", \ + "\blue You attempt to repair [target]'s mechanical [I.name] with [tool_name]...") + + 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/tool_name = "\the [tool]" + if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) + tool_name = "regenerative membrane" + if (istype(tool, /obj/item/stack/medical/bruise_pack)) + if (istype(tool, /obj/item/stack/medical/bruise_pack/tajaran)) + tool_name = "the poultice" + else + tool_name = "the bandaid" + var/datum/organ/external/chest/chest = target.get_organ("chest") + for(var/datum/organ/internal/I in chest.internal_organs) + if(I && I.damage > 0) + if(I.robotic < 2) + user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \ + "You treat damage to [target]'s [I.name] with [tool_name]." ) + else + user.visible_message("\blue [user] pokes [target]'s mechanical [I.name] with [tool_name]...", \ + "\blue You poke [target]'s mechanical [I.name] with [tool_name]... \red For no effect, since it's robotic.") + I.damage = 0 + + fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/datum/organ/external/chest/affected = target.get_organ("chest") + user.visible_message("\red [user]'s hand slips, getting mess and tearing the inside of [target]'s chest with \the [tool]!", \ + "\red Your hand slips, getting mess and tearing the inside of [target]'s chest with \the [tool]!") + var/dam_amt = 2 + + if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) + target.adjustToxLoss(5) + + else if (istype(tool, /obj/item/stack/medical/bruise_pack)) + if (istype(tool, /obj/item/stack/medical/bruise_pack/tajaran)) + target.adjustToxLoss(7) + else + dam_amt = 5 + target.adjustToxLoss(10) + affected.createwound(CUT, 5) + + for(var/datum/organ/internal/I in affected.internal_organs) + if(I && I.damage > 0) + I.take_damage(dam_amt,0) + +/datum/surgery_step/ribcage/fix_chest_internal_robot //For artificial organs + allowed_tools = list( + /obj/item/stack/nanopaste = 100, \ + /obj/item/weapon/bonegel = 30, \ + /obj/item/weapon/screwdriver = 70, \ + ) + + 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/internal/heart/heart = target.internal_organs["heart"] + 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 && heart.robotic == 2 && 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(lungs.damage > 0) - 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(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]." ) - if(kidney.damage > 0) - user.visible_message("[user] starts mending the bruises on [target]'s kidney with \the [tool].", \ - "You start mending the bruises on [target]'s kidney with \the [tool]." ) + 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"] - var/datum/organ/internal/lungs/lungs = target.internal_organs["lungs"] - var/datum/organ/internal/liver/liver = target.internal_organs["liver"] - var/datum/organ/internal/liver/kidney = target.internal_organs["kidney"] - - if(lungs.damage > 0) - user.visible_message("\blue [user] mends the rupture in [target]'s lungs with \the [tool].", \ - "\blue You mend the rupture in [target]'s lungs with \the [tool]." ) - lungs.damage = 0 - if(heart.damage > 0) - 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]." ) + user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \ + "\blue You repair [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].", \ - "\blue You treat the bruises on [target]'s liver with \the [tool]." ) - liver.damage = 0 - - if(kidney.damage > 0) - user.visible_message("\blue [user] treats the bruises on [target]'s kidney with \the [tool].", \ - "\blue You treat the bruises on [target]'s kidney with \the [tool]." ) - kidney.damage = 0 - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/chest/affected = target.get_organ("chest") - 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) + 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 // +////////////////////////////////////////////////////////////////// +// To be finished after some tests. +// /datum/surgery_step/ribcage/heart/cut +// allowed_tools = list( +// /obj/item/weapon/scalpel = 100, \ +// /obj/item/weapon/kitchenknife = 75, \ +// /obj/item/weapon/shard = 50, \ +// ) + +// min_duration = 30 +// max_duration = 40 + +// can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) +// return ..() && target.op_stage.ribcage == 2 + diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index 8faa6b6511..ee56a46bf5 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -4,7 +4,7 @@ ////////////////////////////////////////////////////////////////// /datum/surgery_step/limb/ - can_infect = 1 + can_infect = 0 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) return 0 @@ -125,7 +125,6 @@ /datum/surgery_step/limb/attach allowed_tools = list(/obj/item/robot_parts = 100) - can_infect = 0 min_duration = 80 max_duration = 100 @@ -148,6 +147,7 @@ var/datum/organ/external/affected = target.get_organ(target_zone) user.visible_message("\blue [user] has attached \the [tool] where [target]'s [affected.display_name] used to be.", \ "\blue You have attached \the [tool] where [target]'s [affected.display_name] used to be.") + affected.germ_level = 0 affected.robotize() if(L.sabotaged) affected.sabotaged = 1 diff --git a/code/setup.dm b/code/setup.dm index 62515d050c..68b7552b40 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -708,6 +708,8 @@ var/list/be_special_flags = list( //feel free to add shit to lists below var/list/tachycardics = list("coffee", "inaprovaline", "hyperzine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs", "stoxin") //decrease heart rate +var/list/heartstopper = list("potassium_phorochloride", "zombie_powder") //this stops the heart +var/list/cheartstopper = list("potassium_chloride") //this stops the heart when overdose is met -- c = conditional //proc/get_pulse methods #define GETPULSE_HAND 0 //less accurate (hand) @@ -740,4 +742,4 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse //Flags for zone sleeping #define ZONE_ACTIVE 1 -#define ZONE_SLEEPING 0 +#define ZONE_SLEEPING 0 diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 8505e78a3a..c24d402315 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi index 7fe00fe9a0..65ad15ccf6 100644 Binary files a/icons/mob/human_races/r_tajaran.dmi and b/icons/mob/human_races/r_tajaran.dmi differ diff --git a/icons/obj/harvest.dmi b/icons/obj/harvest.dmi index 3b110ac901..443b6c5ebf 100644 Binary files a/icons/obj/harvest.dmi and b/icons/obj/harvest.dmi differ diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi index fa78753cdc..435c41f385 100644 Binary files a/icons/obj/hydroponics.dmi and b/icons/obj/hydroponics.dmi differ diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi index 2567f7828e..9f61275fab 100644 Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 1215476773..fbda0ccf92 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ