diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b8011974e9f..0e43ac3d10d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -729,9 +729,18 @@ if(!user.unEquip(W)) to_chat(user, "\the [W] is stuck to your hand, you cannot put it in \the [src]") return - W.forceMove(src) + + // Check if a tracker exists + var/obj/item/mecha_parts/mecha_tracking/new_tracker = W + for(var/obj/item/mecha_parts/mecha_tracking/current_tracker in trackers) + if(new_tracker.ai_beacon == current_tracker.ai_beacon) + to_chat(user, "This exosuit already has \a [new_tracker.ai_beacon ? "AI" : "tracking"] beacon.") + user.put_in_hands(new_tracker) + return + + new_tracker.forceMove(src) trackers += W - user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src].") + user.visible_message("[user] attaches [new_tracker] to [src].", "You attach [new_tracker] to [src].") diag_hud_set_mechtracking() return diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm index 0f3719b5a9e..c4ca1069cd6 100644 --- a/code/game/mecha/mecha_control_console.dm +++ b/code/game/mecha/mecha_control_console.dm @@ -55,9 +55,14 @@ return TRUE if("shock") var/obj/item/mecha_parts/mecha_tracking/MT = locateUID(params["mt"]) - if(istype(MT)) - MT.shock() - return TRUE + if(!istype(MT)) + return + // Is it sabotaged already? + var/error_message = MT.shock() + if(error_message) + atom_say(error_message) + return FALSE + return TRUE if("get_log") var/obj/item/mecha_parts/mecha_tracking/MT = locateUID(params["mt"]) if(istype(MT)) @@ -75,6 +80,7 @@ w_class = WEIGHT_CLASS_SMALL origin_tech = "programming=2;magnets=2" var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking. + var/charges_left = 2 /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info() if(!in_mecha()) @@ -154,11 +160,28 @@ return loc return FALSE +// Makes the user lose control over the exosuit's coordination system. +// They can still move around and use tools, they just cannot tell the exosuit which way to go. /obj/item/mecha_parts/mecha_tracking/proc/shock() - var/obj/mecha/M = in_mecha() - if(M) - M.emp_act(2) - qdel(src) + var/obj/mecha/mech = in_mecha() + var/error_message + + if(!mech) + error_message = "This tracking beacon is no longer in an exosuit." + return error_message + + if(mech.internal_damage & MECHA_INT_CONTROL_LOST) + error_message = "The exosuit's coordination system is not responding." + return error_message + + mech.setInternalDamage(MECHA_INT_CONTROL_LOST) + if(mech.occupant) + mech.occupant_message("Coordination system calibration failure. Manual restart required.") + SEND_SOUND(mech.occupant, sound('sound/machines/warning-buzzer.ogg')) + + charges_left-- + if(charges_left < 1) + qdel(src) /obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log() if(!in_mecha())