diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 8a5a83379d..23be95ff16 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -76,6 +76,9 @@
return 0
if(energy_drain && !chassis.has_charge(energy_drain))
return 0
+ if(chassis.equipment_disabled)
+ to_chat(chassis.occupant, "Error -- Equipment control unit is unresponsive.")
+ return 0
return 1
/obj/item/mecha_parts/mecha_equipment/proc/action(atom/target)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index fc0665f51e..22aac63d2b 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -42,6 +42,7 @@
var/last_message = 0
var/add_req_access = 1
var/maint_access = 0
+ var/equipment_disabled = 0 //disabled due to EMP
var/dna_lock //dna-locking the mech
var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference
var/datum/effect_system/spark_spread/spark_system = new
@@ -143,7 +144,6 @@
diag_hud_set_mechhealth()
diag_hud_set_mechcell()
diag_hud_set_mechstat()
- diag_hud_set_mechtracking()
/obj/mecha/get_cell()
return cell
@@ -205,6 +205,15 @@
GLOB.mechas_list -= src //global mech list
return ..()
+/obj/mecha/proc/restore_equipment()
+ equipment_disabled = 0
+ if(istype(src, /obj/mecha/combat))
+ mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
+ if(occupant)
+ SEND_SOUND(occupant, sound('sound/items/timer.ogg', volume=50))
+ to_chat(occupant, "Equipment control unit has been rebooted successfuly.")
+ occupant.update_mouse_pointer()
+
/obj/mecha/CheckParts(list/parts_list)
..()
cell = locate(/obj/item/stock_parts/cell) in contents
@@ -394,8 +403,6 @@
diag_hud_set_mechhealth()
diag_hud_set_mechcell()
diag_hud_set_mechstat()
- diag_hud_set_mechtracking()
-
/obj/mecha/proc/drop_item()//Derpfix, but may be useful in future for engineering exosuits.
return
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 714c66d032..3b957431f7 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -11,8 +11,8 @@
var/obj/mecha/M = new result(drop_location())
QDEL_NULL(M.cell)
- var/atom/parent_atom = parent
- M.CheckParts(parent_atom.contents)
+ var/obj/item/mecha_parts/chassis/parent_chassis = parent
+ M.CheckParts(parent_chassis.contents)
SSblackbox.record_feedback("tally", "mechas_created", 1, M.name)
QDEL_NULL(parent)
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 1524da42f2..9498eec3da 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -21,8 +21,9 @@
var/answer = TR.get_mecha_info()
if(answer)
dat += {"
[answer]
- Send message
- Show exosuit log | (EMP pulse)
"}
+ Send message
+ Show exosuit log
+ [TR.recharging?"Recharging EMP Pulse...
":"(EMP Pulse)
"]"}
if(screen==1)
dat += "Log contents
"
@@ -65,6 +66,7 @@
icon_state = "motion2"
w_class = WEIGHT_CLASS_SMALL
var/ai_beacon = FALSE //If this beacon allows for AI control. Exists to avoid using istype() on checking.
+ var/recharging = 0
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
if(!in_mecha())
@@ -102,10 +104,16 @@
return 0
/obj/item/mecha_parts/mecha_tracking/proc/shock()
+ if(recharging)
+ return
var/obj/mecha/M = in_mecha()
if(M)
- M.emp_act(EMP_LIGHT)
- qdel(src)
+ M.emp_act(EMP_HEAVY)
+ addtimer(CALLBACK(src, /obj/item/mecha_parts/mecha_tracking/proc/recharge), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ recharging = 1
+
+/obj/item/mecha_parts/mecha_tracking/proc/recharge()
+ recharging = 0
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
if(!ismecha(loc))
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 367c750787..62a62b569d 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -149,7 +149,14 @@
use_power((cell.charge/3)/(severity*2))
take_damage(30 / severity, BURN, "energy", 1)
log_message("EMP detected", color="red")
- check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
+
+ if(istype(src, /obj/mecha/combat))
+ mouse_pointer = 'icons/mecha/mecha_mouse-disable.dmi'
+ occupant?.update_mouse_pointer()
+ if(!equipment_disabled && occupant) //prevent spamming this message with back-to-back EMPs
+ to_chat(occupant, "Error -- Connection to equipment control unit has been lost.")
+ addtimer(CALLBACK(src, /obj/mecha/proc/restore_equipment), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE)
+ equipment_disabled = 1
/obj/mecha/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature>max_temperature)
diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm
index e86b5174cc..8b4e48cd3e 100644
--- a/code/game/mecha/medical/medical.dm
+++ b/code/game/mecha/medical/medical.dm
@@ -1,8 +1,3 @@
-/obj/mecha/medical/Initialize()
- . = ..()
- trackers += new /obj/item/mecha_parts/mecha_tracking(src)
-
-
/obj/mecha/medical/mechturn(direction)
setDir(direction)
playsound(src,'sound/mecha/mechmove01.ogg',40,1)
@@ -18,4 +13,4 @@
var/result = step_rand(src)
if(result)
playsound(src,'sound/mecha/mechstep.ogg',25,1)
- return result
\ No newline at end of file
+ return result
diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm
index 498ccd94fa..c9e7d99ac0 100644
--- a/code/game/mecha/working/working.dm
+++ b/code/game/mecha/working/working.dm
@@ -1,6 +1,3 @@
/obj/mecha/working
internal_damage_threshold = 60
-/obj/mecha/working/Initialize()
- . = ..()
- trackers += new /obj/item/mecha_parts/mecha_tracking(src)
diff --git a/icons/mecha/mecha_mouse-disable.dmi b/icons/mecha/mecha_mouse-disable.dmi
new file mode 100644
index 0000000000..48924c58c2
Binary files /dev/null and b/icons/mecha/mecha_mouse-disable.dmi differ