diff --git a/modular_zubbers/code/modules/nanites/nanite_programs.dm b/modular_zubbers/code/modules/nanites/nanite_programs.dm
index 0b26b4e79f0..234a94f6559 100644
--- a/modular_zubbers/code/modules/nanites/nanite_programs.dm
+++ b/modular_zubbers/code/modules/nanites/nanite_programs.dm
@@ -313,6 +313,9 @@
host_mob.investigate_log("'s [name] nanite program was deleted by [source] with code [code].", INVESTIGATE_NANITES)
qdel(src)
+/datum/nanite_program/proc/send_user_message(message)
+ to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[span_robot("[message]")]\"")
+
///A nanite program containing a behaviour protocol. Only one protocol of each class can be active at once.
/datum/nanite_program/protocol
name = "Nanite Protocol"
diff --git a/modular_zubbers/code/modules/nanites/nanite_programs/healing.dm b/modular_zubbers/code/modules/nanites/nanite_programs/healing.dm
index b5c972ca43d..8beb28871bd 100644
--- a/modular_zubbers/code/modules/nanites/nanite_programs/healing.dm
+++ b/modular_zubbers/code/modules/nanites/nanite_programs/healing.dm
@@ -158,7 +158,9 @@
/datum/nanite_program/defib/on_trigger(comm_message)
host_mob.notify_revival("Your heart is being defibrillated by nanites. Re-enter your corpse if you want to be revived!")
host_mob.grab_ghost()
- addtimer(CALLBACK(src, .proc/zap), 50)
+ playsound(host_mob, 'sound/machines/defib/defib_charge.ogg', 50, FALSE)
+ send_user_message("Starting user revival sequence.")
+ addtimer(CALLBACK(src, PROC_REF(zap)), 5 SECONDS)
/datum/nanite_program/defib/proc/check_revivable()
if(!iscarbon(host_mob)) //nonstandard biology
@@ -170,21 +172,30 @@
/datum/nanite_program/defib/proc/zap()
var/mob/living/carbon/C = host_mob
- playsound(C, 'sound/machines/defib/defib_charge.ogg', 50, FALSE)
- sleep(30)
playsound(C, 'sound/machines/defib/defib_zap.ogg', 50, FALSE)
+ C.balloon_alert_to_viewers("twitches violently")
if(check_revivable())
if(C.stat == DEAD)
var/original_oxyloss = C.getOxyLoss()
C.setOxyLoss(OXYLOSS_PASSOUT_THRESHOLD - 5)
+ C.SetSleeping(5 SECONDS)
+ C.set_heartattack(FALSE)
if(C.revive())
playsound(C, 'sound/machines/defib/defib_success.ogg', 50, FALSE)
C.emote("gasp")
C.adjust_jitter_up_to(10 SECONDS, 1 MINUTES)
SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK)
log_game("[C] has been successfully defibrillated by nanites.")
+ send_user_message("User revival sequence success.")
return
else
C.setOxyLoss(original_oxyloss)
+ if(C.undergoing_cardiac_arrest() || C.has_status_effect(/datum/status_effect/heart_attack))
+ SEND_SIGNAL(C, COMSIG_HEARTATTACK_DEFIB)
+ send_user_message("User cardiac arrest prevention attempted.")
+ return
+ else
+ C.apply_status_effect(/datum/status_effect/heart_attack)
+ send_user_message("User revival sequence failure.")
playsound(C, 'sound/machines/defib/defib_failed.ogg', 50, FALSE)
diff --git a/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm b/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm
index f8b01ba027f..94ea6d3392c 100644
--- a/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm
+++ b/modular_zubbers/code/modules/nanites/nanite_programs/suppression.dm
@@ -175,7 +175,7 @@
sent_message = message_setting.get_value()
if(host_mob.stat == DEAD)
return
- to_chat(host_mob, "You hear a strange, robotic voice in your head... \"[span_robot("[sent_message]")]\"")
+ send_user_message(sent_message)
/datum/nanite_program/comm/hallucination
name = "Hallucination"
diff --git a/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm b/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm
index 5c2fd152a23..7f7e455dfc9 100644
--- a/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm
+++ b/modular_zubbers/code/modules/nanites/nanite_programs/utility.dm
@@ -220,7 +220,7 @@
that is unlinked from the cloud. \
Will not work on hosts or those already infected."
can_trigger = TRUE
- trigger_cost = 5
+ trigger_cost = 15
trigger_cooldown = 100
rogue_types = list(/datum/nanite_program/glitch, /datum/nanite_program/toxic)
var/decay_timer
@@ -232,23 +232,33 @@
. = ..()
/datum/nanite_program/nanite_sting/on_trigger(comm_message)
- consume_nanites(-15)
to_chat(host_mob, span_warning("Your hands becomes sharp and prickly."))
RegisterSignal(host_mob, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand))
decay_timer = addtimer(CALLBACK(src, PROC_REF(decay_sting)), 30 SECONDS, TIMER_STOPPABLE)
-/datum/nanite_program/nanite_sting/proc/on_attack_hand(atom/source, mob/user, modifiers)
+/datum/nanite_program/nanite_sting/proc/on_attack_hand(atom/attacker, mob/attack_target, proximity_flag, list/modifiers)
SIGNAL_HANDLER
- var/mob/living/living = source
- if(!istype(living)) return
- if(!CAN_HAVE_NANITES(living) || SEND_SIGNAL(living, COMSIG_HAS_NANITES) || !living.Adjacent(host_mob)) return
-
- if(prob(100 - living.getarmor(null, BIO)))
+ var/mob/living/living = attack_target
+ if(!isliving(living))
+ return
+ if(!CAN_HAVE_NANITES(living))
+ host_mob.balloon_alert(host_mob, "can't be infected!")
+ return
+ if(SEND_SIGNAL(living, COMSIG_HAS_NANITES))
+ host_mob.balloon_alert(host_mob, "already infected!")
+ return
+ if(!living.Adjacent(host_mob))
+ host_mob.balloon_alert(host_mob, "can't reach!")
+ return
+ var/chances = 100 - living.run_armor_check(host_mob.zone_selected, BIO, silent = TRUE)
+ var/success = prob(chances)
+ host_mob.balloon_alert(host_mob, "[chances]% chance [success ? "success" : "failed!"]")
+ if(success)
//unlike with Infective Exo-Locomotion, this can't take over existing nanites, because Nanite Sting only targets non-hosts.
living.AddComponent(/datum/component/nanites, 5)
SEND_SIGNAL(living, COMSIG_NANITE_SYNC, nanites)
// SEND_SIGNAL(living, COMSIG_NANITE_SET_CLOUD, nanites.cloud_id) won't set the cloud
- // SEND_SIGNAL(living, COMSIG_NANITE_SET_CLOUD_SYNC, NANITE_CLOUD_DISABLE)
+ SEND_SIGNAL(living, COMSIG_NANITE_SET_CLOUD_SYNC, NANITE_CLOUD_DISABLE)
living.investigate_log("was infected by a nanite cluster with cloud ID [nanites.cloud_id] by [key_name(host_mob)] at [AREACOORD(living)].", INVESTIGATE_NANITES)
to_chat(living, span_warning("You feel a tiny prick."))
decay_sting()