mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-02-07 06:39:57 +00:00
This might be an unnecessary fix, I might just have the worst luck. But I couldn't get a defib to res in 10 tries before this, got it on the second after.
158 lines
6.0 KiB
Plaintext
158 lines
6.0 KiB
Plaintext
//The case the paddles are kept in.
|
|
/obj/item/device/defib_kit
|
|
name = "defibrillator kit"
|
|
desc = "This KHI-branded defib kit is a semi-automated model. Remove pads, slap on chest, wait."
|
|
icon = 'icons/obj/device.dmi'
|
|
icon_state = "defib_kit"
|
|
w_class = ITEMSIZE_LARGE
|
|
|
|
var/state //0 off, 1 open, 2 working, 3 dead
|
|
var/uses = 2 //Calculates initial uses based on starting cell size
|
|
var/chance = 75 //Percent chance of working
|
|
var/charge_cost //Set in New() based on uses
|
|
var/obj/item/weapon/cell/cell //The size is mostly irrelevant, see 'uses'
|
|
var/mob/living/carbon/human/patient //The person the paddles are on
|
|
|
|
/obj/item/device/defib_kit/New()
|
|
..()
|
|
//Create cell and determine uses (futureproofing against cell size changes)
|
|
cell = new(src)
|
|
charge_cost = cell.maxcharge / uses
|
|
statechange(0)
|
|
|
|
/obj/item/device/defib_kit/attack_self(mob/user as mob)
|
|
..()
|
|
if(patient)
|
|
patient = null
|
|
user.visible_message("<span class='notice'>[user] returns the pads to \the [src] and closes it.</span>",
|
|
"<span class='notice'>You return the pads to \the [src] and close it.</span>")
|
|
statechange(0)
|
|
|
|
/obj/item/device/defib_kit/MouseDrop(var/mob/living/carbon/human/onto)
|
|
if(istype(onto) && Adjacent(usr) && !usr.restrained() && !usr.stat)
|
|
var/mob/living/carbon/human/user = usr
|
|
//<--Feel free to code clothing checks right here
|
|
user.visible_message("<span class='warning'>[user] begins applying defib pads to [onto].</span>",
|
|
"<span class='warning'>You begin applying defib pads to [onto].</span>")
|
|
if(do_after(user, 100, onto))
|
|
patient = onto
|
|
statechange(1,patient)
|
|
user.visible_message("<span class='warning'>[user] applies defib pads to [onto].</span>",
|
|
"<span class='warning'>You finish applying defib pads to [onto].</span>")
|
|
|
|
/obj/item/device/defib_kit/attackby(var/obj/item/A as obj, mob/living/user as mob)
|
|
..()
|
|
|
|
if(!cell && istype(A,/obj/item/weapon/cell))
|
|
if(!user.unEquip(A)) return
|
|
to_chat(user,"You jack \the [A] into \the [src]'s battery mount.")
|
|
A.forceMove(src)
|
|
src.cell = A
|
|
|
|
else if(istype(A,/obj/item/weapon/screwdriver))
|
|
if(cell)
|
|
to_chat(user,"<span class='notice'>You remove \the [cell] from \the [src].</span>")
|
|
if(user.r_hand && user.l_hand)
|
|
cell.forceMove(get_turf(user))
|
|
else
|
|
cell.forceMove(user.put_in_hands(cell))
|
|
cell = null
|
|
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
|
else
|
|
to_chat(user,"<span class='warning'>The power source has already been removed!</span>")
|
|
|
|
/obj/item/device/defib_kit/proc/statechange(var/new_state, var/pat)
|
|
if(state == new_state) return //Let's just save ourselves some time
|
|
state = new_state
|
|
icon_state = "[initial(icon_state)][state]"
|
|
var/turf/T = get_turf(src)
|
|
var/state_words = ""
|
|
switch(state)
|
|
if(0)
|
|
state_words = "It is currently closed."
|
|
processing_objects -= src
|
|
if(1)
|
|
state_words = "A green light is lit; it has charge."
|
|
processing_objects |= src
|
|
if(2)
|
|
state_words = "A yellow light is flashing: it's in the process of reviving a patient."
|
|
T.visible_message("<span class='notice'>A yellow light starts flashing on \the [src].</span>")
|
|
playsound(T, 'sound/machines/chime.ogg', 50, 0)
|
|
if(3)
|
|
state_words = "A red light is flashing: the battery needs to be recharged."
|
|
T.visible_message("<span class='warning'>A red light starts flashing on \the [src].</span>")
|
|
playsound(T, 'sound/machines/buzz-sigh.ogg', 50, 0)
|
|
|
|
desc = "[initial(desc)] [state_words][pat ? " The pads are attached to [pat]." : ""]"
|
|
update_icon()
|
|
|
|
/obj/item/device/defib_kit/process()
|
|
if(!state) //0 or null
|
|
statechange(0)
|
|
processing_objects -= src
|
|
return
|
|
|
|
//Patient moved too far
|
|
if(patient && !(get_dist(src,patient) <= 1)) //You separated the kit and pads too far
|
|
audible_message("<span class='warning'>There's a clatter as the defib pads are yanked off of [patient].</span>")
|
|
statechange(0)
|
|
patient = null
|
|
return
|
|
|
|
//Battery died
|
|
if(!cell || cell.charge < charge_cost)
|
|
statechange(3,patient)
|
|
return
|
|
|
|
//A patient isn't being worked on, but we have one, so start
|
|
if(patient && patient.stat == DEAD && state != 2)
|
|
statechange(2)
|
|
if(attempt_shock()) //Try to shock them, has timer and such
|
|
patient.visible_message("<span class='warning'>[patient] convulses!</span>")
|
|
playsound(src.loc, 'sound/effects/sparks2.ogg', 75, 1)
|
|
//Actual rezzing code
|
|
if(prob(chance) && ((world.time - patient.timeofdeath) < (10 MINUTES))) //Can only revive within a few minutes
|
|
if(!patient.client && patient.mind) //Don't force the dead person to come back if they don't want to.
|
|
for(var/mob/observer/dead/ghost in player_list)
|
|
if(ghost.mind == patient.mind)
|
|
to_chat(ghost, "<b><font color = #330033><font size = 3>Someone is trying to \
|
|
revive you. Return to your body if you want to be revived!</b> \
|
|
(Verbs -> Ghost -> Re-enter corpse). You have 15 seconds to do this!</font></font>")
|
|
sleep(15 SECONDS)
|
|
break
|
|
|
|
if(patient.client)
|
|
patient.adjustOxyLoss(-20) //Look, blood stays oxygenated for quite some time, but I'm not recoding the entire oxy system
|
|
patient.stat = CONSCIOUS //Note that if whatever killed them in the first place wasn't fixed, they're likely to die again.
|
|
dead_mob_list -= patient
|
|
living_mob_list += patient
|
|
patient.timeofdeath = null
|
|
patient.visible_message("<span class='notice'>[patient]'s eyes open!</span>")
|
|
log_and_message_admins("[patient] was revived.")
|
|
cell.charge -= charge_cost //Always charge the cost after any attempt, failed or not
|
|
sleep(20) //Wait 2 seconds before next attempt
|
|
statechange(1,patient) //Back to ready
|
|
|
|
/obj/item/device/defib_kit/proc/attempt_shock()
|
|
if(!patient || cell.charge < charge_cost)
|
|
return
|
|
|
|
var/zap_time = world.time + (7 SECONDS)
|
|
var/o_patient_loc = patient.loc
|
|
. = 1
|
|
|
|
while(world.time < zap_time) //This is basically a custom do_after() call
|
|
sleep(1)
|
|
|
|
//Failed: We lost something important
|
|
if(!patient || !cell || cell.charge < charge_cost)
|
|
. = 0
|
|
break
|
|
|
|
//Failed: The locations aren't right
|
|
if((o_patient_loc != patient.loc) || !(get_dist(src,patient) <= 1))
|
|
. = 0
|
|
break
|
|
|
|
return
|