diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm
index bb968a64bb0..29943736c96 100644
--- a/code/game/machinery/mech_recharger.dm
+++ b/code/game/machinery/mech_recharger.dm
@@ -4,9 +4,9 @@
desc = "A exosuit recharger, built into the floor."
icon = 'icons/mecha/mech_bay.dmi'
icon_state = "recharge_floor"
- density = 0
+ density = FALSE
layer = TURF_LAYER + 0.1
- anchored = 1
+ anchored = TRUE
idle_power_usage = 300 // Some electronics, passive drain.
active_power_usage = 90 KILOWATTS // When charging
@@ -77,32 +77,31 @@
charging.updatehealth()
if(fully_repaired())
for(var/mob/pilot in charging.pilots)
- pilot.show_message("Exosuit integrity has been fully restored.")
+ to_chat(pilot, SPAN_NOTICE("Exosuit integrity has been fully restored."))
var/obj/item/cell/cell = charging.get_cell()
- if(cell && !cell.fully_charged() && remaining_energy > 0)
+ if(cell && remaining_energy > 0)
cell.give(remaining_energy * CELLRATE)
- if(cell.fully_charged())
- for(var/mob/pilot in charging.pilots)
- pilot.show_message("Fully charged.")
-
- if((!repair || fully_repaired()) && cell.fully_charged())
- stop_charging()
// An ugly proc, but apparently mechs don't have maxhealth var of any kind.
/obj/machinery/mech_recharger/proc/fully_repaired()
return charging && (charging.health == charging.maxHealth)
/obj/machinery/mech_recharger/proc/start_charging(var/mob/living/heavy_vehicle/M)
- for(var/mob/pilot in M.pilots)
- if(stat & (NOPOWER | BROKEN))
- pilot.show_message("Power port not responding. Terminating.")
+ var/no_power = FALSE
+ var/obj/item/cell/C = M.get_cell()
+ if(stat & (NOPOWER | BROKEN))
+ no_power = TRUE
+ if(!no_power && C)
+ charging = M
+ update_use_power(2)
+ for(var/pilot in M.pilots)
+ if(no_power)
+ to_chat(pilot, SPAN_WARNING("Power port not responding. Terminating."))
return
- if(M.get_cell())
- pilot.show_message("Now charging...")
- charging = M
- update_use_power(2)
+ if(C)
+ to_chat(pilot, SPAN_NOTICE("Now charging..."))
/obj/machinery/mech_recharger/proc/stop_charging()
update_use_power(1)
- charging = null
+ charging = null
\ No newline at end of file
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 0d75da62b19..8eeb9fbcd76 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -288,7 +288,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Did not understand the message:
var/list/heard_voice = list() // voice message (ie "chimpers")
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
- var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
+ var/list/heard_gibberish= list() // completely screwed over message ie "F%! (O*# *#!<>&**%!")
for (var/mob/R in receive)
diff --git a/code/modules/heavy_vehicle/mecha.dm b/code/modules/heavy_vehicle/mecha.dm
index 77ee93a1553..7a76afa2672 100644
--- a/code/modules/heavy_vehicle/mecha.dm
+++ b/code/modules/heavy_vehicle/mecha.dm
@@ -150,7 +150,7 @@
usr.examinate(M, 1)
/mob/living/heavy_vehicle/Initialize(mapload, var/obj/structure/heavy_vehicle_frame/source_frame)
- . = ..()
+ ..()
if(!access_card) access_card = new (src)
@@ -197,6 +197,13 @@
// Build icon.
update_icon()
+ . = INITIALIZE_HINT_LATELOAD
+
+/mob/living/heavy_vehicle/LateInitialize()
+ var/obj/machinery/mech_recharger/MR = locate() in get_turf(src)
+ if(MR)
+ MR.start_charging(src)
+
/mob/living/heavy_vehicle/return_air()
return (body && body.pilot_coverage >= 100 && hatch_closed) ? body.cockpit : loc.return_air()
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index e5b3f088813..19bdd568e51 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -127,7 +127,7 @@
if(speaker != null)
speaker_name = speaker.name
else
- speaker_name = "unknown"
+ speaker_name = "Unknown"
if(istype(speaker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = speaker
@@ -138,7 +138,7 @@
speaker_name = vname
if(hard_to_hear)
- speaker_name = "unknown"
+ speaker_name = "Unknown"
var/changed_voice
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index a0936a8ac54..e1a5fe5ee31 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -7,6 +7,7 @@
maxbodytemp = 500
mob_size = MOB_SMALL
+ var/radio_type = /obj/item/device/radio/borg
var/obj/item/device/radio/borg/radio = null
var/mob/living/silicon/ai/connected_ai = null
var/obj/item/cell/cell = null
@@ -42,6 +43,7 @@
speed = -1 //Spiderbots gotta go fast.
pass_flags = PASSTABLE | PASSDOORHATCH
speak_emote = list("beeps","clicks","chirps")
+ universal_understand = TRUE
/mob/living/simple_animal/spiderbot/Initialize()
. = ..()
@@ -50,6 +52,7 @@
internal_id = new /obj/item/card/id(src)
verbs |= /mob/living/proc/ventcrawl
verbs |= /mob/living/proc/hide
+ verbs |= /mob/living/simple_animal/spiderbot/proc/control_integrated_radio
/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob)
@@ -189,7 +192,7 @@
/mob/living/simple_animal/spiderbot/Initialize()
. = ..()
- radio = new /obj/item/device/radio/borg(src)
+ radio = new radio_type(src)
camera = new /obj/machinery/camera(src)
camera.c_tag = "spiderbot-[real_name]"
camera.replace_networks(list("SS13"))
@@ -305,6 +308,35 @@
/mob/living/simple_animal/spiderbot/get_bullet_impact_effect_type(var/def_zone)
return BULLET_IMPACT_METAL
+/mob/living/simple_animal/spiderbot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
+ switch(message_mode)
+ if("headset")
+ radio.talk_into(src, message, null, verb, speaking)
+ used_radios += radio
+ if("intercom")
+ var/turf/T = get_turf(src)
+ for(var/obj/item/device/radio/intercom/I in view(1, T))
+ I.talk_into(src, message, null, verb, speaking)
+ used_radios += I
+ if(message_mode)
+ radio.talk_into(src, message, message_mode, verb, speaking)
+ used_radios += radio
+
+/mob/living/simple_animal/spiderbot/do_animate_chat(var/message, var/datum/language/language, var/small, var/list/show_to, var/duration, var/list/message_override)
+ INVOKE_ASYNC(src, /atom/movable/proc/animate_chat, message, language, small, show_to, duration)
+
+/mob/living/simple_animal/spiderbot/proc/control_integrated_radio()
+ set name = "Radio Settings"
+ set desc = "Allows you to change settings of your radio."
+ set category = "Spiderbot"
+
+ to_chat(src, SPAN_NOTICE("Accessing Subspace Transceiver control..."))
+ if(radio)
+ radio.interact(src)
+
+/mob/living/simple_animal/spiderbot/ai
+ radio_type = /obj/item/device/radio/headset/heads/ai_integrated
+
/mob/living/simple_animal/spiderbot/ai/Initialize()
. = ..()
internal_id.access = get_all_station_access()
\ No newline at end of file
diff --git a/html/changelogs/geeves-mech_charge.yml b/html/changelogs/geeves-mech_charge.yml
new file mode 100644
index 00000000000..de756bb9ce4
--- /dev/null
+++ b/html/changelogs/geeves-mech_charge.yml
@@ -0,0 +1,8 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - bugfix: "Mechs will now consistently stay fully charged if they're on top of an exosuit dock / mech recharger."
+ - bugfix: "Spiderbots can now properly hear and speak into the radio."
+ - bugfix: "Fix spiderbots speaking floating chat."
\ No newline at end of file