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()