From e092a7661a6af1f0e676991fcfe877630a550cfd Mon Sep 17 00:00:00 2001 From: forest2001 Date: Mon, 8 Apr 2024 15:39:36 +0100 Subject: [PATCH 1/8] tada --- .../objects/items/devices/defibrillator.dm | 140 ++++++++++++------ 1 file changed, 95 insertions(+), 45 deletions(-) diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index bbeb2046aff0..b7ca79b7b9b2 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -24,6 +24,12 @@ var/defib_cooldown = 0 //Cooldown for toggling the defib var/shock_cooldown = 0 //cooldown for shocking someone - separate to toggling + /// Skill requirements. + var/skill_to_check = SKILL_MEDICAL + var/skill_level = SKILL_MEDICAL_MEDIC + var/skill_to_check_alt = null + var/skill_level_alt = 0 + /mob/living/carbon/human/proc/check_tod() if(!undefibbable && world.time <= timeofdeath + revive_grace_period) return TRUE @@ -79,10 +85,11 @@ return //Job knowledge requirement - if (istype(user)) - if(!skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) - to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) - return + if(istype(user)) + if(!skillcheck(user, skill_to_check, skill_level)) + if(skill_to_check_alt && !skillcheck(user, skill_to_check_alt, skill_level_alt)) + to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) + return defib_cooldown = world.time + 10 //1 second cooldown every time the defib is toggled ready = !ready @@ -146,56 +153,63 @@ return TRUE -/obj/item/device/defibrillator/attack(mob/living/carbon/human/H, mob/living/carbon/human/user) +/obj/item/device/defibrillator/proc/can_defib(mob/living/carbon/human/target, mob/living/carbon/human/user) if(shock_cooldown > world.time) //cooldown is only for shocking, this is so that you can immediately shock when you take the paddles out - stan_albatross - return + return FALSE shock_cooldown = world.time + 20 //2 second cooldown before you can try shocking again if(user.action_busy) //Currently deffibing - return + return FALSE //job knowledge requirement if(user.skills) - if(!skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC)) - to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) - return + if(!skillcheck(user, skill_to_check, skill_level)) + if(skill_to_check_alt && !skillcheck(user, skill_to_check_alt, skill_level_alt)) + to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) + return - if(!check_revive(H, user)) - return + if(!check_revive(target, user)) + return FALSE - var/mob/dead/observer/G = H.get_ghost() + var/mob/dead/observer/G = target.get_ghost() if(istype(G) && G.client) playsound_client(G.client, 'sound/effects/adminhelp_new.ogg') to_chat(G, SPAN_BOLDNOTICE(FONT_SIZE_LARGE("Someone is trying to revive your body. Return to it if you want to be resurrected! \ (Verbs -> Ghost -> Re-enter corpse, or click here!)"))) - user.visible_message(SPAN_NOTICE("[user] starts setting up the paddles on [H]'s chest"), \ - SPAN_HELPFUL("You start setting up the paddles on [H]'s chest.")) + user.visible_message(SPAN_NOTICE("[user] starts setting up the paddles on [target]'s chest"), \ + SPAN_HELPFUL("You start setting up the paddles on [target]'s chest.")) playsound(get_turf(src),'sound/items/defib_charge.ogg', 25, 0) //Do NOT vary this tune, it needs to be precisely 7 seconds //Taking square root not to make defibs too fast... - if(!do_after(user, (4 + (3 * user.get_skill_duration_multiplier(SKILL_MEDICAL))) SECONDS, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, H, INTERRUPT_MOVED, BUSY_ICON_MEDICAL)) - user.visible_message(SPAN_WARNING("[user] stops setting up the paddles on [H]'s chest."), \ - SPAN_WARNING("You stop setting up the paddles on [H]'s chest.")) - return + if(!do_after(user, (4 + (3 * user.get_skill_duration_multiplier(SKILL_MEDICAL))) SECONDS, INTERRUPT_NO_NEEDHAND|BEHAVIOR_IMMOBILE, BUSY_ICON_FRIENDLY, target, INTERRUPT_MOVED, BUSY_ICON_MEDICAL)) + user.visible_message(SPAN_WARNING("[user] stops setting up the paddles on [target]'s chest."), \ + SPAN_WARNING("You stop setting up the paddles on [target]'s chest.")) + return FALSE - if(!check_revive(H, user)) - return + if(!check_revive(target, user)) + return FALSE + + return TRUE + +/obj/item/device/defibrillator/attack(mob/living/carbon/human/target, mob/living/carbon/human/user) + if(!can_defib(target, user)) + return FALSE //Do this now, order doesn't matter sparks.start() dcell.use(charge_cost) update_icon() playsound(get_turf(src), 'sound/items/defib_release.ogg', 25, 1) - user.visible_message(SPAN_NOTICE("[user] shocks [H] with the paddles."), - SPAN_HELPFUL("You shock [H] with the paddles.")) - H.visible_message(SPAN_DANGER("[H]'s body convulses a bit.")) + user.visible_message(SPAN_NOTICE("[user] shocks [target] with the paddles."), + SPAN_HELPFUL("You shock [target] with the paddles.")) + target.visible_message(SPAN_DANGER("[target]'s body convulses a bit.")) shock_cooldown = world.time + 10 //1 second cooldown before you can shock again - var/datum/internal_organ/heart/heart = H.internal_organs_by_name["heart"] + var/datum/internal_organ/heart/heart = target.internal_organs_by_name["heart"] - if(!H.is_revivable()) + if(!target.is_revivable()) playsound(get_turf(src), 'sound/items/defib_failed.ogg', 25, 0) if(heart && heart.organ_status >= ORGAN_BROKEN) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Patient's heart is too damaged. Immediate surgery is advised.")) @@ -203,40 +217,40 @@ user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Patient's general condition does not allow reviving.")) return - if(!H.client) //Freak case, no client at all. This is a braindead mob (like a colonist) + if(!target.client) //Freak case, no client at all. This is a braindead mob (like a colonist) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: No soul detected, Attempting to revive...")) - if(isobserver(H.mind?.current) && !H.client) //Let's call up the correct ghost! Also, bodies with clients only, thank you. - H.mind.transfer_to(H, TRUE) + if(isobserver(target.mind?.current) && !target.client) //Let's call up the correct ghost! Also, bodies with clients only, thank you. + target.mind.transfer_to(target, TRUE) //At this point, the defibrillator is ready to work - H.apply_damage(-damage_heal_threshold, BRUTE) - H.apply_damage(-damage_heal_threshold, BURN) - H.apply_damage(-damage_heal_threshold, TOX) - H.apply_damage(-damage_heal_threshold, CLONE) - H.apply_damage(-H.getOxyLoss(), OXY) - H.updatehealth() //Needed for the check to register properly - - if(!(H.species?.flags & NO_CHEM_METABOLIZATION)) - for(var/datum/reagent/R in H.reagents.reagent_list) + target.apply_damage(-damage_heal_threshold, BRUTE) + target.apply_damage(-damage_heal_threshold, BURN) + target.apply_damage(-damage_heal_threshold, TOX) + target.apply_damage(-damage_heal_threshold, CLONE) + target.apply_damage(-target.getOxyLoss(), OXY) + target.updatehealth() //Needed for the check to register properly + + if(!(target.species?.flags & NO_CHEM_METABOLIZATION)) + for(var/datum/reagent/R in target.reagents.reagent_list) var/datum/chem_property/P = R.get_property(PROPERTY_ELECTROGENETIC)//Adrenaline helps greatly at restarting the heart if(P) - P.trigger(H) - H.reagents.remove_reagent(R.id, 1) + P.trigger(target) + target.reagents.remove_reagent(R.id, 1) break - if(H.health > HEALTH_THRESHOLD_DEAD) + if(target.health > HEALTH_THRESHOLD_DEAD) user.visible_message(SPAN_NOTICE("[icon2html(src, viewers(src))] \The [src] beeps: Defibrillation successful.")) playsound(get_turf(src), 'sound/items/defib_success.ogg', 25, 0) user.track_life_saved(user.job) user.life_revives_total++ - H.handle_revive() + target.handle_revive() if(heart) heart.take_damage(rand(min_heart_damage_dealt, max_heart_damage_dealt), TRUE) // Make death and revival leave lasting consequences - to_chat(H, SPAN_NOTICE("You suddenly feel a spark and your consciousness returns, dragging you back to the mortal plane.")) - if(H.client?.prefs.toggles_flashing & FLASH_CORPSEREVIVE) - window_flash(H.client) + to_chat(target, SPAN_NOTICE("You suddenly feel a spark and your consciousness returns, dragging you back to the mortal plane.")) + if(target.client?.prefs.toggles_flashing & FLASH_CORPSEREVIVE) + window_flash(target.client) else user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Vital signs are too weak, repair damage and try again.")) //Freak case playsound(get_turf(src), 'sound/items/defib_failed.ogg', 25, 0) @@ -264,3 +278,39 @@ item_state = "defib" w_class = SIZE_SMALL charge_cost = 99 + + +/obj/item/device/defibrillator/synthetic + name = "synthetic sparker" + desc ="Functioning similarly to a regular defibrillator, this device is designed to restart a synthetic unit via electric shock." + icon = 'icons/obj/items/experimental_tools.dmi' + icon_state = "compact_defib" + item_state = "defib" + w_class = SIZE_SMALL + charge_cost = 300 + skill_to_check_alt = SKILL_ENGINEER + skill_level_alt = SKILL_ENGINEER_ENGI + +/obj/item/device/defibrillator/synthetic/check_revive(mob/living/carbon/human/H, mob/living/carbon/human/user) + if(!issynth(H)) + to_chat(user, SPAN_WARNING("You can't use a [src] on a living being!")) + return FALSE + if(!ready) + to_chat(user, SPAN_WARNING("Take [src]'s paddles out first.")) + return FALSE + if(dcell.charge <= charge_cost) + user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src]'s battery is too low! It needs to recharge.")) + return FALSE + if(H.stat != DEAD) + user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Function signs detected. Aborting.")) + return FALSE + + if(!H.is_revivable()) + user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Unit's general condition does not allow reactivation.")) + return FALSE + + if((!MODE_HAS_TOGGLEABLE_FLAG(MODE_STRONG_DEFIBS) && blocked_by_suit) && H.wear_suit && (istype(H.wear_suit, /obj/item/clothing/suit/armor) || istype(H.wear_suit, /obj/item/clothing/suit/storage/marine)) && prob(95)) + user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Paddles registering >100,000 ohms, Possible cause: Suit or Armor interfering.")) + return FALSE + + return TRUE From 2bbf92179a949c843de2aeca6c1f53641ca1218f Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 17 Apr 2024 02:02:39 +0100 Subject: [PATCH 2/8] Fix for stupid forest. --- code/game/objects/items/devices/defibrillator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index b7ca79b7b9b2..e3509ebfb338 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -87,7 +87,7 @@ //Job knowledge requirement if(istype(user)) if(!skillcheck(user, skill_to_check, skill_level)) - if(skill_to_check_alt && !skillcheck(user, skill_to_check_alt, skill_level_alt)) + if(!skill_to_check_alt || (!skillcheck(user, skill_to_check_alt, skill_level_alt))) to_chat(user, SPAN_WARNING("You don't seem to know how to use [src]...")) return From e7ebecb12a71020d3b7586c662d4ee1fdb643855 Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 8 May 2024 21:03:33 +0100 Subject: [PATCH 3/8] availability --- code/game/machinery/vending/vendor_types/crew/synthetic.dm | 1 + code/game/objects/items/devices/defibrillator.dm | 6 +++++- code/game/objects/structures/inflatable.dm | 3 +++ code/modules/gear_presets/synths.dm | 7 +++---- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index a55285369e14..8b27f646953d 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -368,6 +368,7 @@ GLOBAL_LIST_INIT(cm_vending_synth_tools, list( list("Maintenance Jack", 15, /obj/item/maintenance_jack, null, VENDOR_ITEM_REGULAR), list("Portable Dialysis Machine", 15, /obj/item/tool/portadialysis, null, VENDOR_ITEM_REGULAR), list("Telescopic Baton", 15, /obj/item/weapon/telebaton, null, VENDOR_ITEM_REGULAR), + list("Synthetic Sparker", 15, /obj/item/device/defibrillator/synthetic, null, VENDOR_ITEM_REGULAR), )) //------------EXPERIMENTAL TOOL KITS--------------- diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index e3509ebfb338..273db8c699a4 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -282,7 +282,7 @@ /obj/item/device/defibrillator/synthetic name = "synthetic sparker" - desc ="Functioning similarly to a regular defibrillator, this device is designed to restart a synthetic unit via electric shock." + desc = "Functioning similarly to a regular defibrillator, this device is designed to restart a synthetic unit via electric shock." icon = 'icons/obj/items/experimental_tools.dmi' icon_state = "compact_defib" item_state = "defib" @@ -314,3 +314,7 @@ return FALSE return TRUE + +/obj/item/device/defibrillator/synthetic/one_shot + desc = "Functioning similarly to a regular defibrillator, this device is designed to restart a synthetic unit via electric shock. This one can only be used once before needing a recharge and is intended for rebooting Working Joes." + charge_cost = 1000 diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index b3a330ca36b0..198fed81508d 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -272,3 +272,6 @@ new /obj/item/inflatable(src) new /obj/item/inflatable(src) new /obj/item/inflatable(src) + +/obj/item/storage/briefcase/inflatable/small + w_class = SIZE_SMALL diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 4eb674cf3796..96fd7cdeddee 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -612,6 +612,7 @@ new_human.equip_to_slot_or_del(new /obj/item/tool/mop(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/wet_sign(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/lights/mixed(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/synthetic/one_shot(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/bag/trash(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch(new_human), WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/circuitboard/apc(new_human.back), WEAR_IN_ACCESSORY) @@ -633,11 +634,9 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/mt(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/joe(new_human), WEAR_HANDS) - new_human.equip_to_slot_or_del(new /obj/item/inflatable/door(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/inflatable/door(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/synthetic/one_shot(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank, WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/inflatable(new_human), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/inflatable(new_human), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/storage/briefcase/inflatable/small(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/maintenance_jack(new_human), WEAR_J_STORE) From cc126fca9f42df01bd7d80a108e9e2689822242d Mon Sep 17 00:00:00 2001 From: forest2001 Date: Wed, 8 May 2024 21:42:50 +0100 Subject: [PATCH 4/8] icons --- .../objects/items/devices/defibrillator.dm | 9 ++++++++- icons/obj/items/experimental_tools.dmi | Bin 11162 -> 11803 bytes 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index 273db8c699a4..a0666d493fea 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -284,13 +284,19 @@ name = "synthetic sparker" desc = "Functioning similarly to a regular defibrillator, this device is designed to restart a synthetic unit via electric shock." icon = 'icons/obj/items/experimental_tools.dmi' - icon_state = "compact_defib" + icon_state = "sparker" item_state = "defib" w_class = SIZE_SMALL charge_cost = 300 skill_to_check_alt = SKILL_ENGINEER skill_level_alt = SKILL_ENGINEER_ENGI +/obj/item/device/defibrillator/synthetic/update_icon() + icon_state = initial(icon_state) + overlays.Cut() + if(ready) + icon_state += "_out" + /obj/item/device/defibrillator/synthetic/check_revive(mob/living/carbon/human/H, mob/living/carbon/human/user) if(!issynth(H)) to_chat(user, SPAN_WARNING("You can't use a [src] on a living being!")) @@ -318,3 +324,4 @@ /obj/item/device/defibrillator/synthetic/one_shot desc = "Functioning similarly to a regular defibrillator, this device is designed to restart a synthetic unit via electric shock. This one can only be used once before needing a recharge and is intended for rebooting Working Joes." charge_cost = 1000 + icon_state = "sparker_once" diff --git a/icons/obj/items/experimental_tools.dmi b/icons/obj/items/experimental_tools.dmi index d490d78c7ffac65cf6528ba3a9c5ef481da02881..d630484f5058f27313ebdf5d076ff60349402991 100644 GIT binary patch literal 11803 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 C-+3AU literal 11162 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 M)yFC&N-u)`AC*xNXaE2J From 367be23efcde07c9034227ed0b259091b73a20ec Mon Sep 17 00:00:00 2001 From: forest2001 Date: Thu, 9 May 2024 09:37:52 +0100 Subject: [PATCH 5/8] fix --- code/game/objects/items/devices/defibrillator.dm | 4 ++-- code/game/objects/structures/inflatable.dm | 2 +- code/modules/gear_presets/synths.dm | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index a0666d493fea..2ec5255963b2 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -132,7 +132,7 @@ if(!ready) to_chat(user, SPAN_WARNING("Take [src]'s paddles out first.")) return - if(dcell.charge <= charge_cost) + if(dcell.charge < charge_cost) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src]'s battery is too low! It needs to recharge.")) return if(H.stat != DEAD) @@ -304,7 +304,7 @@ if(!ready) to_chat(user, SPAN_WARNING("Take [src]'s paddles out first.")) return FALSE - if(dcell.charge <= charge_cost) + if(dcell.charge < charge_cost) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src]'s battery is too low! It needs to recharge.")) return FALSE if(H.stat != DEAD) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 198fed81508d..6c8fbaa5334a 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -274,4 +274,4 @@ new /obj/item/inflatable(src) /obj/item/storage/briefcase/inflatable/small - w_class = SIZE_SMALL + w_class = SIZE_MEDIUM diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index 96fd7cdeddee..ce944ad00f06 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -606,13 +606,13 @@ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/sling(new_human), WEAR_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/device/working_joe_pda(new_human.back), WEAR_IN_L_STORE) new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction(new_human), WEAR_R_STORE) - new_human.equip_to_slot_or_del(new /obj/item/reagent_container/spray/cleaner(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/synthetic/one_shot(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/spray/cleaner(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/bucket(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/mop(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/wet_sign(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/box/lights/mixed(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/synthetic/one_shot(new_human.back), WEAR_IN_BACK) + new_human.equip_to_slot_or_del(new /obj/item/reagent_container/spray/cleaner(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/bag/trash(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch(new_human), WEAR_ACCESSORY) new_human.equip_to_slot_or_del(new /obj/item/circuitboard/apc(new_human.back), WEAR_IN_ACCESSORY) From 17f28160941de00ce32f800aba2c3312370a16cd Mon Sep 17 00:00:00 2001 From: forest2001 Date: Thu, 9 May 2024 09:59:18 +0100 Subject: [PATCH 6/8] removes unusable thing --- code/modules/gear_presets/synths.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm index ce944ad00f06..972652980120 100644 --- a/code/modules/gear_presets/synths.dm +++ b/code/modules/gear_presets/synths.dm @@ -611,7 +611,6 @@ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/glass/bucket(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/mop(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/tool/wet_sign(new_human.back), WEAR_IN_BACK) - new_human.equip_to_slot_or_del(new /obj/item/storage/box/lights/mixed(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/reagent_container/spray/cleaner(new_human.back), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/storage/bag/trash(new_human), WEAR_L_HAND) new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/droppouch(new_human), WEAR_ACCESSORY) From bc672b37117c80d392f4807aa47c3d91a9960f0a Mon Sep 17 00:00:00 2001 From: forest2001 Date: Mon, 27 May 2024 14:21:55 +0100 Subject: [PATCH 7/8] ce vendor --- code/game/machinery/vending/vendor_types/crew/senior_officers.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm index a5d3cbe85b01..6eb3046e3a23 100644 --- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm +++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm @@ -164,6 +164,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_chief_engineer, list( list("Spare Equipment", 0, null, null, null), list("Technician's Headset", 15, /obj/item/device/radio/headset/almayer/mt, null, VENDOR_ITEM_REGULAR), + list("Synthetic Sparker", 15, /obj/item/device/defibrillator/synthetic, null, VENDOR_ITEM_REGULAR), )) From 0d19a0af7feebf0562bb323956d2d85f7113b7ae Mon Sep 17 00:00:00 2001 From: forest2001 Date: Sun, 16 Jun 2024 21:32:14 +0100 Subject: [PATCH 8/8] fix --- code/game/objects/items/devices/defibrillator.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/devices/defibrillator.dm b/code/game/objects/items/devices/defibrillator.dm index c233ff3d9134..aec34140685c 100644 --- a/code/game/objects/items/devices/defibrillator.dm +++ b/code/game/objects/items/devices/defibrillator.dm @@ -213,10 +213,10 @@ playsound(get_turf(src), 'sound/items/defib_failed.ogg', 25, 0) if(heart && heart.organ_status >= ORGAN_BROKEN) user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Patient's heart is too damaged. Immediate surgery is advised.")) - msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(H)] with [src] because of heart damage.") + msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(target)] with [src] because of heart damage.") return user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Patient's general condition does not allow reviving.")) - msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(H)] with [src].") + msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(target)] with [src].") return if(!target.client) //Freak case, no client at all. This is a braindead mob (like a colonist) @@ -243,7 +243,7 @@ break if(target.health > HEALTH_THRESHOLD_DEAD) user.visible_message(SPAN_NOTICE("[icon2html(src, viewers(src))] \The [src] beeps: Defibrillation successful.")) - msg_admin_niche("[key_name_admin(user)] successfully revived [key_name_admin(H)] with [src].") + msg_admin_niche("[key_name_admin(user)] successfully revived [key_name_admin(target)] with [src].") playsound(get_turf(src), 'sound/items/defib_success.ogg', 25, 0) user.track_life_saved(user.job) user.life_revives_total++ @@ -256,7 +256,7 @@ window_flash(target.client) else user.visible_message(SPAN_WARNING("[icon2html(src, viewers(src))] \The [src] buzzes: Defibrillation failed. Vital signs are too weak, repair damage and try again.")) //Freak case - msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(H)] with [src] because of weak vitals.") + msg_admin_niche("[key_name_admin(user)] failed an attempt to revive [key_name_admin(target)] with [src] because of weak vitals.") playsound(get_turf(src), 'sound/items/defib_failed.ogg', 25, 0) if(heart && prob(25)) heart.take_damage(rand(min_heart_damage_dealt, max_heart_damage_dealt), TRUE) // Make death and revival leave lasting consequences