diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 9a56cf94a7..2fa9ea63c7 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -106,13 +106,13 @@
if (M.use(1))
var/obj/item/weapon/secbot_assembly/ed209_assembly/B = new /obj/item/weapon/secbot_assembly/ed209_assembly
B.loc = get_turf(src)
- user << "You armed the robot frame."
+ to_chat(user, "You armed the robot frame.")
if (user.get_inactive_hand()==src)
user.remove_from_mob(src)
user.put_in_inactive_hand(B)
qdel(src)
else
- user << "You need one sheet of metal to arm the robot frame."
+ to_chat(user, "You need one sheet of metal to arm the robot frame.")
if(istype(W, /obj/item/robot_parts/l_leg))
if(src.l_leg) return
user.drop_item()
@@ -149,9 +149,9 @@
src.chest = W
src.updateicon()
else if(!W:wires)
- user << "You need to attach wires to it first!"
+ to_chat(user, "You need to attach wires to it first!")
else
- user << "You need to attach a cell to it first!"
+ to_chat(user, "You need to attach a cell to it first!")
if(istype(W, /obj/item/robot_parts/head))
if(src.head) return
@@ -161,16 +161,16 @@
src.head = W
src.updateicon()
else
- user << "You need to attach a flash to it first!"
+ to_chat(user, "You need to attach a flash to it first!")
if(istype(W, /obj/item/device/mmi))
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
- user << "You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise."
+ to_chat(user, "You can't put \the [W] in, the frame has to be standing on the ground to be perfectly precise.")
return
if(!M.brainmob)
- user << "Sticking an empty [W] into the frame would sort of defeat the purpose."
+ to_chat(user, "Sticking an empty [W] into the frame would sort of defeat the purpose.")
return
if(!M.brainmob.key)
var/ghost_can_reenter = 0
@@ -181,15 +181,15 @@
to_chat(user, "\The [W] is completely unresponsive; though it may be able to auto-resuscitate.") //Jamming a ghosted brain into a borg is likely detrimental, and may result in some problems.
return
if(!ghost_can_reenter)
- user << "\The [W] is completely unresponsive; there's no point."
+ to_chat(user, "\The [W] is completely unresponsive; there's no point.")
return
if(M.brainmob.stat == DEAD)
- user << "Sticking a dead [W] into the frame would sort of defeat the purpose."
+ to_chat(user, "Sticking a dead [W] into the frame would sort of defeat the purpose.")
return
if(jobban_isbanned(M.brainmob, "Cyborg"))
- user << "This [W] does not seem to fit."
+ to_chat(user, "This [W] does not seem to fit.")
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1)
@@ -228,7 +228,7 @@
qdel(src)
else
- user << "The MMI must go in after everything else!"
+ to_chat(user, "The MMI must go in after everything else!")
if (istype(W, /obj/item/weapon/pen))
var/t = sanitizeSafe(input(user, "Enter new robot name", src.name, src.created_name), MAX_NAME_LEN)
@@ -245,22 +245,22 @@
..()
if(istype(W, /obj/item/weapon/cell))
if(src.cell)
- user << "You have already inserted a cell!"
+ to_chat(user, "You have already inserted a cell!")
return
else
user.drop_item()
W.loc = src
src.cell = W
- user << "You insert the cell!"
+ to_chat(user, "You insert the cell!")
if(istype(W, /obj/item/stack/cable_coil))
if(src.wires)
- user << "You have already inserted wire!"
+ to_chat(user, "You have already inserted wire!")
return
else
var/obj/item/stack/cable_coil/coil = W
coil.use(1)
src.wires = 1.0
- user << "You insert the wire!"
+ to_chat(user, "You insert the wire!")
return
/obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob)
@@ -269,14 +269,14 @@
if(istype(user,/mob/living/silicon/robot))
var/current_module = user.get_active_hand()
if(current_module == W)
- user << "How do you propose to do that?"
+ to_chat(user, "How do you propose to do that?")
return
else
add_flashes(W,user)
else
add_flashes(W,user)
else if(istype(W, /obj/item/weapon/stock_parts/manipulator))
- user << "You install some manipulators and modify the head, creating a functional spider-bot!"
+ to_chat(user, "You install some manipulators and modify the head, creating a functional spider-bot!")
new /mob/living/simple_animal/spiderbot(get_turf(loc))
user.drop_item()
qdel(W)
@@ -286,24 +286,24 @@
/obj/item/robot_parts/head/proc/add_flashes(obj/item/W as obj, mob/user as mob) //Made into a seperate proc to avoid copypasta
if(src.flash1 && src.flash2)
- user << "You have already inserted the eyes!"
+ to_chat(user, "You have already inserted the eyes!")
return
else if(src.flash1)
user.drop_item()
W.loc = src
src.flash2 = W
- user << "You insert the flash into the eye socket!"
+ to_chat(user, "You insert the flash into the eye socket!")
else
user.drop_item()
W.loc = src
src.flash1 = W
- user << "You insert the flash into the eye socket!"
+ to_chat(user, "You insert the flash into the eye socket!")
/obj/item/robot_parts/emag_act(var/remaining_charges, var/mob/user)
if(sabotaged)
- user << "[src] is already sabotaged!"
+ to_chat(user, "[src] is already sabotaged!")
else
- user << "You short out the safeties."
+ to_chat(user, "You short out the safeties.")
sabotaged = 1
return 1
diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm
new file mode 100644
index 0000000000..159b3e3594
--- /dev/null
+++ b/code/modules/mob/living/bot/edCLNbot.dm
@@ -0,0 +1,235 @@
+/mob/living/bot/cleanbot/edCLN
+ name = "ED-CLN Cleaning Robot"
+ desc = "A large cleaning robot. It looks rather efficient."
+ icon_state = "edCLN0"
+ req_one_access = list(access_robotics, access_janitor)
+ botcard_access = list(access_janitor, access_maint_tunnels)
+
+ locked = 0 // Start unlocked so roboticist can set them to patrol.
+ wait_if_pulled = 0 // One big boi.
+ min_target_dist = 0
+
+ patrol_speed = 3
+ target_speed = 6
+
+ cleaning = 0
+ blood = 0
+ var/red_switch = 0
+ var/blue_switch = 0
+ var/green_switch = 0
+
+/mob/living/bot/cleanbot/edCLN/update_icons()
+ if(on && busy)
+ icon_state = "edCLN"
+ else
+ icon_state = "edCLN[on]"
+
+/mob/living/bot/cleanbot/edCLN/handleIdle()
+ if(prob(10))
+ custom_emote(2, "makes a less than thrilled beeping sound.")
+ playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
+
+ if(red_switch && !blue_switch && !green_switch && prob(10) || src.emagged)
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/T = loc
+ T.add_blood()
+
+ if(!red_switch && blue_switch && !green_switch && prob(50) || src.emagged)
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/T = loc
+ visible_message("\The [src] squirts a puddle of water on the floor!")
+ T.wet_floor()
+
+ if(!red_switch && !blue_switch && green_switch && prob(10) || src.emagged)
+ if(istype(loc, /turf/simulated))
+ var/turf/simulated/T = loc
+ visible_message("\The [src] stomps on \the [T], breaking it!")
+ qdel(T)
+
+ if(red_switch && blue_switch && green_switch && prob(1))
+ src.explode()
+
+/mob/living/bot/cleanbot/edCLN/explode()
+ on = 0
+ visible_message("[src] blows apart!")
+ var/turf/Tsec = get_turf(src)
+
+ new /obj/item/weapon/secbot_assembly/ed209_assembly(Tsec)
+ if(prob(50))
+ new /obj/item/robot_parts/l_leg(Tsec)
+ if(prob(50))
+ new /obj/item/robot_parts/r_leg(Tsec)
+ if(prob(50))
+ if(prob(50))
+ new /obj/item/weapon/reagent_containers/glass/bucket(Tsec)
+ else
+ new /obj/item/device/assembly/prox_sensor(Tsec)
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ qdel(src)
+ return
+
+/mob/living/bot/cleanbot/edCLN/attack_hand(var/mob/user)
+ var/dat
+ usr.set_machine(src)
+ add_fingerprint(usr)
+
+ dat += "Automatic Station Cleaner v2.0
"
+ dat += "Status: [on ? "On" : "Off"]
"
+ dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
"
+ dat += "Maintenance panel is [open ? "opened" : "closed"]"
+ if(!locked || issilicon(user))
+ dat += "
Cleans Blood: [blood ? "Yes" : "No"]
"
+ dat += "
Patrol station: [will_patrol ? "Yes" : "No"]
"
+ if(open && !locked)
+ dat += "
Red Switch: [red_switch ? "On" : "Off"]
"
+ dat += "
Green Switch: [green_switch ? "On" : "Off"]
"
+ dat += "
Blue Switch: [blue_switch ? "On" : "Off"]"
+
+ user << browse("