diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index a1ddb256d89..c7aa99f0b28 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -399,6 +399,120 @@ playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 0) busy = 0 update_icon() + else + user << "You need to target your patient's chest with [src]." + return + +/obj/item/weapon/borg_defib + name = "defibrillator paddles" + desc = "A pair of mounted paddles with flat metal surfaces that are used to deliver powerful electric shocks." + icon = 'icons/obj/weapons.dmi' + icon_state = "defibpaddles" + item_state = "defibpaddles" + force = 0 + w_class = 4 + canremove = 0 + var/revivecost = 1000 + var/cooldown = 0 + var/busy = 0 + +/obj/item/weapon/borg_defib/attack(mob/M, mob/user) + var/tobehealed + var/threshold = -config.health_threshold_dead + var/mob/living/carbon/human/H = M + + if(busy) + return + if(cooldown) + user << "[src] is recharging." + if(!ishuman(M)) + user << "This unit is only designed to work on humanoid lifeforms." + return + else + if(user.a_intent == "harm") + busy = 1 + H.visible_message("[user] has touched [H.name] with [src]!", \ + "[user] has touched [H.name] with [src]!") + H.adjustStaminaLoss(50) + H.Weaken(5) + H.updatehealth() //forces health update before next life tick + playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1) + H.emote("gasp") + add_logs(user, M, "stunned", object="defibrillator") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + cooldown = 1 + busy = 0 + update_icon() + spawn(50) + cooldown = 0 + update_icon() + return + if(user.zone_sel && user.zone_sel.selecting == "chest") + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.") + busy = 1 + update_icon() + if(do_after(user, 30)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 0) + var/mob/dead/observer/ghost = H.get_ghost() + var/tplus = world.time - H.timeofdeath + var/tlimit = 6000 //past this much time the patient is unrecoverable (in deciseconds) + var/tloss = 3000 //brain damage starts setting in on the patient after some time left rotting + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + if(H.stat == 2) + var/health = H.health + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/weapons/Egloves.ogg', 50, 1, -1) + for(var/datum/organ/external/O in H.organs) + total_brute += O.brute_dam + total_burn += O.burn_dam + if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(M_NOCLONE in H.mutations)) + tobehealed = health + threshold + tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived + H.adjustOxyLoss(tobehealed) + H.adjustToxLoss(tobehealed) + H.adjustFireLoss(tobehealed) + H.adjustBruteLoss(tobehealed) + user.visible_message("[user] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/ping.ogg', 50, 0) + H.stat = 1 + H.update_revive() + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + add_logs(user, M, "revived", object="defibrillator") + else + if(tplus > tlimit) + user.visible_message("[user] buzzes: Resuscitation failed - Heart tissue damage beyond point of no return for defibrillation.") + else if(total_burn >= 180 || total_brute >= 180) + user.visible_message("[user] buzzes: Resuscitation failed - Severe tissue damage detected.") + else + user.visible_message("[user] buzzes: Resuscitation failed.") + if(ghost) + ghost << "Your heart is being defibrillated. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" + ghost << sound('sound/effects/genetics.ogg') + playsound(get_turf(src), 'sound/machines/buzz-two.ogg', 50, 0) + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + R.cell.use(revivecost) + update_icon() + cooldown = 1 + spawn(50) + cooldown = 0 + update_icon() + else + user.visible_message("[user] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 50, 0) + busy = 0 + update_icon() else user << "You need to target your patient's chest with [src]." return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index dbbf6744701..e28f9ac8b7d 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -188,12 +188,12 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Security") + var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis) src << "\red Crisis mode active. Combat module available." modules+="Combat" if(mmi != null && mmi.alien) - modules="Hunter" + modules = "Hunter" modtype = input("Please, select a module!", "Robot", null, null) in modules designation = modtype var/module_sprites[0] //Used to store the associations between sprite names and sprite index. @@ -237,8 +237,8 @@ module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" - if("Crisis") - module = new /obj/item/weapon/robot_module/crisis(src) + if("Medical") + module = new /obj/item/weapon/robot_module/medical(src) channels = list("Medical" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Medical") @@ -247,17 +247,6 @@ module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" - if("Surgeon") - module = new /obj/item/weapon/robot_module/surgeon(src) - channels = list("Medical" = 1) - if(camera && "Robots" in camera.network) - camera.network.Add("Medical") - - module_sprites["Basic"] = "Medbot" - module_sprites["Standard"] = "surgeon" - module_sprites["Advanced Droid"] = "droid-medical" - module_sprites["Needles"] = "medicalrobot" - if("Security") module = new /obj/item/weapon/robot_module/security(src) channels = list("Security" = 1) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 7a14f816197..2aa178c8ef1 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -71,10 +71,12 @@ src.emag = new /obj/item/weapon/melee/energy/sword/cyborg(src) return -/obj/item/weapon/robot_module/surgeon - name = "surgeon robot module" +/obj/item/weapon/robot_module/medical + name = "medical robot module" stacktypes = list( /obj/item/stack/medical/advanced/bruise_pack = 5, + /obj/item/stack/medical/advanced/ointment = 5, + /obj/item/stack/medical/splint = 5, /obj/item/stack/nanopaste = 5 ) @@ -82,7 +84,18 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) + src.modules += new /obj/item/device/reagent_scanner/adv(src) + src.modules += new /obj/item/weapon/borg_defib(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) + src.modules += new /obj/item/weapon/reagent_containers/dropper(src) + src.modules += new /obj/item/weapon/reagent_containers/syringe(src) + src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) + src.modules += new /obj/item/stack/medical/advanced/ointment(src) + src.modules += new /obj/item/stack/medical/splint(src) + src.modules += new /obj/item/stack/nanopaste(src) src.modules += new /obj/item/weapon/scalpel(src) src.modules += new /obj/item/weapon/hemostat(src) src.modules += new /obj/item/weapon/retractor(src) @@ -92,9 +105,6 @@ src.modules += new /obj/item/weapon/bonesetter(src) src.modules += new /obj/item/weapon/circular_saw(src) src.modules += new /obj/item/weapon/surgicaldrill(src) - src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) - src.modules += new /obj/item/stack/nanopaste(src) src.emag = new /obj/item/weapon/reagent_containers/spray(src) @@ -102,59 +112,12 @@ src.emag.name = "Polyacid spray" return -/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R) if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag PS.reagents.add_reagent("pacid", 2) ..() -/obj/item/weapon/robot_module/crisis - name = "crisis robot module" - stacktypes = list( - /obj/item/stack/medical/advanced/ointment = 5, - /obj/item/stack/medical/advanced/bruise_pack = 5, - /obj/item/stack/medical/splint = 5 - ) - - - New() - src.modules += new /obj/item/device/flashlight(src) - src.modules += new /obj/item/device/flash/cyborg(src) - src.modules += new /obj/item/device/healthanalyzer(src) - src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/roller_holder(src) - src.modules += new /obj/item/stack/medical/advanced/ointment(src) - src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) - src.modules += new /obj/item/stack/medical/splint(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) - src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) - src.modules += new /obj/item/weapon/reagent_containers/syringe(src) - src.modules += new /obj/item/weapon/extinguisher/mini(src) - - src.emag = new /obj/item/weapon/reagent_containers/spray(src) - - src.emag.reagents.add_reagent("pacid", 250) - src.emag.name = "Polyacid spray" - var/obj/item/weapon/reagent_containers/spray/S = emag - S.banned_reagents = list() - return - -/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R) - - var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2) - S.reagents.clear_reagents() - S.mode = initial(S.mode) - S.desc = initial(S.desc) - S.update_icon() - - if(src.emag) - var/obj/item/weapon/reagent_containers/spray/PS = src.emag - PS.reagents.add_reagent("pacid", 2) - - ..() - /obj/item/weapon/robot_module/engineering name = "engineering robot module" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 31d68ef7b15..27fec314272 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -68,14 +68,14 @@ var/datum/reagents/R = reagent_list[reagent_list.len] R.add_reagent(reagent, 30) -/obj/item/weapon/reagent_containers/borghypo/attack(mob/M as mob, mob/user as mob) +/obj/item/weapon/reagent_containers/borghypo/attack(mob/living/M as mob, mob/user as mob) var/datum/reagents/R = reagent_list[mode] if(!R.total_volume) user << "\red The injector is empty." return - if (!( istype(M, /mob) )) + if (!(istype(M))) return - if (R.total_volume) + if (R.total_volume && M.can_inject(user,1)) user << "\blue You inject [M] with the injector." M << "\red You feel a tiny prick!" diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 07d5f7df40a..991e1714587 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -90,7 +90,8 @@ proc/do_surgery(mob/living/M, mob/living/user, obj/item/tool) if( prob(S.tool_quality(tool)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) S.end_step(user, M, user.zone_sel.selecting, tool) //finish successfully else //or - S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ + if(!isrobot(user)) + S.fail_step(user, M, user.zone_sel.selecting, tool) //malpractice~ return 1 //don't want to do weapony things after surgery return 0