diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 6f205a870d..864ab2bff2 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -24,7 +24,7 @@
name = "motion-sensitive security camera"
/obj/machinery/camera/motion/Initialize()
- ..()
+ . = ..()
upgradeMotion()
// ALL UPGRADES
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 14fc50ee68..457abb3259 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -1,86 +1,86 @@
-/obj/machinery/computer/atmos_alert
- name = "atmospheric alert console"
- desc = "Used to monitor the station's air alarms."
- circuit = /obj/item/circuitboard/computer/atmos_alert
- icon_screen = "alert:0"
- icon_keyboard = "atmos_key"
- var/list/priority_alarms = list()
- var/list/minor_alarms = list()
- var/receive_frequency = 1437
- var/datum/radio_frequency/radio_connection
-
- light_color = LIGHT_COLOR_CYAN
-
-/obj/machinery/computer/atmos_alert/Initialize()
- ..()
- set_frequency(receive_frequency)
-
-/obj/machinery/computer/atmos_alert/Destroy()
+/obj/machinery/computer/atmos_alert
+ name = "atmospheric alert console"
+ desc = "Used to monitor the station's air alarms."
+ circuit = /obj/item/circuitboard/computer/atmos_alert
+ icon_screen = "alert:0"
+ icon_keyboard = "atmos_key"
+ var/list/priority_alarms = list()
+ var/list/minor_alarms = list()
+ var/receive_frequency = 1437
+ var/datum/radio_frequency/radio_connection
+
+ light_color = LIGHT_COLOR_CYAN
+
+/obj/machinery/computer/atmos_alert/Initialize()
+ . = ..()
+ set_frequency(receive_frequency)
+
+/obj/machinery/computer/atmos_alert/Destroy()
SSradio.remove_object(src, receive_frequency)
- return ..()
-
+ return ..()
+
/obj/machinery/computer/atmos_alert/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "atmos_alert", name, 350, 300, master_ui, state)
- ui.open()
-
-/obj/machinery/computer/atmos_alert/ui_data(mob/user)
- var/list/data = list()
-
- data["priority"] = list()
- for(var/zone in priority_alarms)
- data["priority"] += zone
- data["minor"] = list()
- for(var/zone in minor_alarms)
- data["minor"] += zone
-
- return data
-
-/obj/machinery/computer/atmos_alert/ui_act(action, params)
- if(..())
- return
- switch(action)
- if("clear")
- var/zone = params["zone"]
- if(zone in priority_alarms)
- to_chat(usr, "Priority alarm for [zone] cleared.")
- priority_alarms -= zone
- . = TRUE
- if(zone in minor_alarms)
- to_chat(usr, "Minor alarm for [zone] cleared.")
- minor_alarms -= zone
- . = TRUE
- update_icon()
-
-/obj/machinery/computer/atmos_alert/proc/set_frequency(new_frequency)
- SSradio.remove_object(src, receive_frequency)
- receive_frequency = new_frequency
- radio_connection = SSradio.add_object(src, receive_frequency, GLOB.RADIO_ATMOSIA)
-
-/obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal)
- if(!signal || signal.encryption) return
-
- var/zone = signal.data["zone"]
- var/severity = signal.data["alert"]
-
- if(!zone || !severity) return
-
- minor_alarms -= zone
- priority_alarms -= zone
- if(severity == "severe")
- priority_alarms += zone
- else if (severity == "minor")
- minor_alarms += zone
- update_icon()
- return
-
-/obj/machinery/computer/atmos_alert/update_icon()
- ..()
- if(stat & (NOPOWER|BROKEN))
- return
- if(priority_alarms.len)
- add_overlay("alert:2")
- else if(minor_alarms.len)
- add_overlay("alert:1")
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_alert", name, 350, 300, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/atmos_alert/ui_data(mob/user)
+ var/list/data = list()
+
+ data["priority"] = list()
+ for(var/zone in priority_alarms)
+ data["priority"] += zone
+ data["minor"] = list()
+ for(var/zone in minor_alarms)
+ data["minor"] += zone
+
+ return data
+
+/obj/machinery/computer/atmos_alert/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("clear")
+ var/zone = params["zone"]
+ if(zone in priority_alarms)
+ to_chat(usr, "Priority alarm for [zone] cleared.")
+ priority_alarms -= zone
+ . = TRUE
+ if(zone in minor_alarms)
+ to_chat(usr, "Minor alarm for [zone] cleared.")
+ minor_alarms -= zone
+ . = TRUE
+ update_icon()
+
+/obj/machinery/computer/atmos_alert/proc/set_frequency(new_frequency)
+ SSradio.remove_object(src, receive_frequency)
+ receive_frequency = new_frequency
+ radio_connection = SSradio.add_object(src, receive_frequency, GLOB.RADIO_ATMOSIA)
+
+/obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption) return
+
+ var/zone = signal.data["zone"]
+ var/severity = signal.data["alert"]
+
+ if(!zone || !severity) return
+
+ minor_alarms -= zone
+ priority_alarms -= zone
+ if(severity == "severe")
+ priority_alarms += zone
+ else if (severity == "minor")
+ minor_alarms += zone
+ update_icon()
+ return
+
+/obj/machinery/computer/atmos_alert/update_icon()
+ ..()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ if(priority_alarms.len)
+ add_overlay("alert:2")
+ else if(minor_alarms.len)
+ add_overlay("alert:1")
diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm
index 9bdcef6c65..8131dbd4a6 100644
--- a/code/game/machinery/computer/atmos_control.dm
+++ b/code/game/machinery/computer/atmos_control.dm
@@ -1,230 +1,230 @@
-/////////////////////////////////////////////////////////////
-// AIR SENSOR (found in gas tanks)
-/////////////////////////////////////////////////////////////
-
-/obj/machinery/air_sensor
- name = "gas sensor"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "gsensor1"
+/////////////////////////////////////////////////////////////
+// AIR SENSOR (found in gas tanks)
+/////////////////////////////////////////////////////////////
+
+/obj/machinery/air_sensor
+ name = "gas sensor"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "gsensor1"
anchored = TRUE
-
- var/on = TRUE
-
- var/id_tag
- var/frequency = 1441
- var/datum/radio_frequency/radio_connection
-
-/obj/machinery/air_sensor/update_icon()
- icon_state = "gsensor[on]"
-
-/obj/machinery/air_sensor/process_atmos()
- if(on)
- var/datum/signal/signal = new
- var/datum/gas_mixture/air_sample = return_air()
-
- signal.transmission_method = 1 //radio signal
- signal.data = list(
- "sigtype" = "status",
- "id_tag" = id_tag,
- "timestamp" = world.time,
- "pressure" = air_sample.return_pressure(),
- "temperature" = air_sample.temperature,
- "gases" = list()
- )
- var/total_moles = air_sample.total_moles()
- if(total_moles)
- for(var/gas_id in air_sample.gases)
- var/gas_name = air_sample.gases[gas_id][GAS_META][META_GAS_NAME]
- signal.data["gases"][gas_name] = air_sample.gases[gas_id][MOLES] / total_moles * 100
-
- radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
-
-
-/obj/machinery/air_sensor/proc/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
-
-/obj/machinery/air_sensor/Initialize()
- ..()
- SSair.atmos_machinery += src
- set_frequency(frequency)
-
-/obj/machinery/air_sensor/Destroy()
- SSair.atmos_machinery -= src
+
+ var/on = TRUE
+
+ var/id_tag
+ var/frequency = 1441
+ var/datum/radio_frequency/radio_connection
+
+/obj/machinery/air_sensor/update_icon()
+ icon_state = "gsensor[on]"
+
+/obj/machinery/air_sensor/process_atmos()
+ if(on)
+ var/datum/signal/signal = new
+ var/datum/gas_mixture/air_sample = return_air()
+
+ signal.transmission_method = 1 //radio signal
+ signal.data = list(
+ "sigtype" = "status",
+ "id_tag" = id_tag,
+ "timestamp" = world.time,
+ "pressure" = air_sample.return_pressure(),
+ "temperature" = air_sample.temperature,
+ "gases" = list()
+ )
+ var/total_moles = air_sample.total_moles()
+ if(total_moles)
+ for(var/gas_id in air_sample.gases)
+ var/gas_name = air_sample.gases[gas_id][GAS_META][META_GAS_NAME]
+ signal.data["gases"][gas_name] = air_sample.gases[gas_id][MOLES] / total_moles * 100
+
+ radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
+
+
+/obj/machinery/air_sensor/proc/set_frequency(new_frequency)
SSradio.remove_object(src, frequency)
- return ..()
-
-/////////////////////////////////////////////////////////////
-// GENERAL AIR CONTROL (a.k.a atmos computer)
-/////////////////////////////////////////////////////////////
-
-/obj/machinery/computer/atmos_control
+ frequency = new_frequency
+ radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
+
+/obj/machinery/air_sensor/Initialize()
+ . = ..()
+ SSair.atmos_machinery += src
+ set_frequency(frequency)
+
+/obj/machinery/air_sensor/Destroy()
+ SSair.atmos_machinery -= src
+ SSradio.remove_object(src, frequency)
+ return ..()
+
+/////////////////////////////////////////////////////////////
+// GENERAL AIR CONTROL (a.k.a atmos computer)
+/////////////////////////////////////////////////////////////
+
+/obj/machinery/computer/atmos_control
name = "atmospherics monitoring"
- desc = "Used to monitor the station's atmospherics sensors."
- icon_screen = "tank"
- icon_keyboard = "atmos_key"
- circuit = /obj/item/circuitboard/computer/atmos_control
-
- var/frequency = 1441
- var/list/sensors = list(
- "n2_sensor" = "Nitrogen Tank",
- "o2_sensor" = "Oxygen Tank",
- "co2_sensor" = "Carbon Dioxide Tank",
- "tox_sensor" = "Plasma Tank",
- "n2o_sensor" = "Nitrous Oxide Tank",
- "air_sensor" = "Mixed Air Tank",
- "mix_sensor" = "Mix Tank",
- "distro_meter" = "Distribution Loop",
- "waste_meter" = "Waste Loop",
- )
- var/list/sensor_information = list()
- var/datum/radio_frequency/radio_connection
-
- light_color = LIGHT_COLOR_CYAN
-
-/obj/machinery/computer/atmos_control/Initialize()
- ..()
- set_frequency(frequency)
-
-/obj/machinery/computer/atmos_control/Destroy()
+ desc = "Used to monitor the station's atmospherics sensors."
+ icon_screen = "tank"
+ icon_keyboard = "atmos_key"
+ circuit = /obj/item/circuitboard/computer/atmos_control
+
+ var/frequency = 1441
+ var/list/sensors = list(
+ "n2_sensor" = "Nitrogen Tank",
+ "o2_sensor" = "Oxygen Tank",
+ "co2_sensor" = "Carbon Dioxide Tank",
+ "tox_sensor" = "Plasma Tank",
+ "n2o_sensor" = "Nitrous Oxide Tank",
+ "air_sensor" = "Mixed Air Tank",
+ "mix_sensor" = "Mix Tank",
+ "distro_meter" = "Distribution Loop",
+ "waste_meter" = "Waste Loop",
+ )
+ var/list/sensor_information = list()
+ var/datum/radio_frequency/radio_connection
+
+ light_color = LIGHT_COLOR_CYAN
+
+/obj/machinery/computer/atmos_control/Initialize()
+ ..()
+ set_frequency(frequency)
+
+/obj/machinery/computer/atmos_control/Destroy()
SSradio.remove_object(src, frequency)
- return ..()
-
+ return ..()
+
/obj/machinery/computer/atmos_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "atmos_control", name, 400, 925, master_ui, state)
- ui.open()
-
-/obj/machinery/computer/atmos_control/ui_data(mob/user)
- var/data = list()
-
- data["sensors"] = list()
- for(var/id_tag in sensors)
- var/long_name = sensors[id_tag]
- var/list/info = sensor_information[id_tag]
- if(!info)
- continue
- data["sensors"] += list(list(
- "id_tag" = id_tag,
- "long_name" = sanitize(long_name),
- "pressure" = info["pressure"],
- "temperature" = info["temperature"],
- "gases" = info["gases"]
- ))
- return data
-
-/obj/machinery/computer/atmos_control/receive_signal(datum/signal/signal)
- if(!signal || signal.encryption)
- return
-
- var/id_tag = signal.data["id_tag"]
- if(!id_tag || !sensors.Find(id_tag))
- return
-
- sensor_information[id_tag] = signal.data
-
-/obj/machinery/computer/atmos_control/proc/set_frequency(new_frequency)
- SSradio.remove_object(src, frequency)
- frequency = new_frequency
- radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
-
-/////////////////////////////////////////////////////////////
-// LARGE TANK CONTROL
-/////////////////////////////////////////////////////////////
-
-/obj/machinery/computer/atmos_control/tank
- var/input_tag
- var/output_tag
- frequency = 1441
- circuit = /obj/item/circuitboard/computer/atmos_control/tank
-
- var/list/input_info
- var/list/output_info
-
-// This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this
-/obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user)
- var/list/IO = list()
- var/datum/radio_frequency/freq = SSradio.return_frequency(1441)
- var/list/devices = freq.devices["_default"]
- for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices)
- var/list/text = splittext(U.id_tag, "_")
- IO |= text[1]
- for(var/obj/machinery/atmospherics/components/unary/outlet_injector/U in devices)
- var/list/text = splittext(U.id, "_")
- IO |= text[1]
- if(!IO.len)
- to_chat(user, "No machinery detected.")
- var/S = input("Select the device set: ", "Selection", IO[1]) as anything in IO
- if(src)
- src.input_tag = "[S]_in"
- src.output_tag = "[S]_out"
- name = "[uppertext(S)] Supply Control"
- var/list/new_devices = freq.devices["4"]
- for(var/obj/machinery/air_sensor/U in new_devices)
- var/list/text = splittext(U.id_tag, "_")
- if(text[1] == S)
- sensors = list("[S]_sensor" = "Tank")
- break
-
- for(var/obj/machinery/atmospherics/components/unary/outlet_injector/U in devices)
- U.broadcast_status()
- for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices)
- U.broadcast_status()
-
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_control", name, 400, 925, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/atmos_control/ui_data(mob/user)
+ var/data = list()
+
+ data["sensors"] = list()
+ for(var/id_tag in sensors)
+ var/long_name = sensors[id_tag]
+ var/list/info = sensor_information[id_tag]
+ if(!info)
+ continue
+ data["sensors"] += list(list(
+ "id_tag" = id_tag,
+ "long_name" = sanitize(long_name),
+ "pressure" = info["pressure"],
+ "temperature" = info["temperature"],
+ "gases" = info["gases"]
+ ))
+ return data
+
+/obj/machinery/computer/atmos_control/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption)
+ return
+
+ var/id_tag = signal.data["id_tag"]
+ if(!id_tag || !sensors.Find(id_tag))
+ return
+
+ sensor_information[id_tag] = signal.data
+
+/obj/machinery/computer/atmos_control/proc/set_frequency(new_frequency)
+ SSradio.remove_object(src, frequency)
+ frequency = new_frequency
+ radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
+
+/////////////////////////////////////////////////////////////
+// LARGE TANK CONTROL
+/////////////////////////////////////////////////////////////
+
+/obj/machinery/computer/atmos_control/tank
+ var/input_tag
+ var/output_tag
+ frequency = 1441
+ circuit = /obj/item/circuitboard/computer/atmos_control/tank
+
+ var/list/input_info
+ var/list/output_info
+
+// This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this
+/obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user)
+ var/list/IO = list()
+ var/datum/radio_frequency/freq = SSradio.return_frequency(1441)
+ var/list/devices = freq.devices["_default"]
+ for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices)
+ var/list/text = splittext(U.id_tag, "_")
+ IO |= text[1]
+ for(var/obj/machinery/atmospherics/components/unary/outlet_injector/U in devices)
+ var/list/text = splittext(U.id, "_")
+ IO |= text[1]
+ if(!IO.len)
+ to_chat(user, "No machinery detected.")
+ var/S = input("Select the device set: ", "Selection", IO[1]) as anything in IO
+ if(src)
+ src.input_tag = "[S]_in"
+ src.output_tag = "[S]_out"
+ name = "[uppertext(S)] Supply Control"
+ var/list/new_devices = freq.devices["4"]
+ for(var/obj/machinery/air_sensor/U in new_devices)
+ var/list/text = splittext(U.id_tag, "_")
+ if(text[1] == S)
+ sensors = list("[S]_sensor" = "Tank")
+ break
+
+ for(var/obj/machinery/atmospherics/components/unary/outlet_injector/U in devices)
+ U.broadcast_status()
+ for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices)
+ U.broadcast_status()
+
/obj/machinery/computer/atmos_control/tank/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
- datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
- ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
- if(!ui)
- ui = new(user, src, ui_key, "atmos_control", name, 500, 305, master_ui, state)
- ui.open()
-
-/obj/machinery/computer/atmos_control/tank/ui_data(mob/user)
- var/list/data = ..()
- data["tank"] = TRUE
- data["inputting"] = input_info ? input_info["power"] : FALSE
- data["inputRate"] = input_info ? input_info["volume_rate"] : 0
- data["outputting"] = output_info ? output_info["power"] : FALSE
- data["outputPressure"] = output_info ? output_info["internal"] : 0
-
- return data
-
-/obj/machinery/computer/atmos_control/tank/ui_act(action, params)
- if(..() || !radio_connection)
- return
- var/datum/signal/signal = new
- signal.transmission_method = 1
- signal.source = src
- signal.data = list("sigtype" = "command")
- switch(action)
- if("reconnect")
- reconnect(usr)
- . = TRUE
- if("input")
- signal.data += list("tag" = input_tag, "power_toggle" = TRUE)
- . = TRUE
- if("output")
- signal.data += list("tag" = output_tag, "power_toggle" = TRUE)
- . = TRUE
- if("pressure")
- var/target = input("New target pressure:", name, output_info ? output_info["internal"] : 0) as num|null
- if(!isnull(target) && !..())
- target = Clamp(target, 0, 50 * ONE_ATMOSPHERE)
- signal.data += list("tag" = output_tag, "set_internal_pressure" = target)
- . = TRUE
- radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
-
-/obj/machinery/computer/atmos_control/tank/receive_signal(datum/signal/signal)
- if(!signal || signal.encryption)
- return
-
- var/id_tag = signal.data["tag"]
-
- if(input_tag == id_tag)
- input_info = signal.data
- else if(output_tag == id_tag)
- output_info = signal.data
- else
- ..(signal)
+ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_control", name, 500, 305, master_ui, state)
+ ui.open()
+
+/obj/machinery/computer/atmos_control/tank/ui_data(mob/user)
+ var/list/data = ..()
+ data["tank"] = TRUE
+ data["inputting"] = input_info ? input_info["power"] : FALSE
+ data["inputRate"] = input_info ? input_info["volume_rate"] : 0
+ data["outputting"] = output_info ? output_info["power"] : FALSE
+ data["outputPressure"] = output_info ? output_info["internal"] : 0
+
+ return data
+
+/obj/machinery/computer/atmos_control/tank/ui_act(action, params)
+ if(..() || !radio_connection)
+ return
+ var/datum/signal/signal = new
+ signal.transmission_method = 1
+ signal.source = src
+ signal.data = list("sigtype" = "command")
+ switch(action)
+ if("reconnect")
+ reconnect(usr)
+ . = TRUE
+ if("input")
+ signal.data += list("tag" = input_tag, "power_toggle" = TRUE)
+ . = TRUE
+ if("output")
+ signal.data += list("tag" = output_tag, "power_toggle" = TRUE)
+ . = TRUE
+ if("pressure")
+ var/target = input("New target pressure:", name, output_info ? output_info["internal"] : 0) as num|null
+ if(!isnull(target) && !..())
+ target = Clamp(target, 0, 50 * ONE_ATMOSPHERE)
+ signal.data += list("tag" = output_tag, "set_internal_pressure" = target)
+ . = TRUE
+ radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
+
+/obj/machinery/computer/atmos_control/tank/receive_signal(datum/signal/signal)
+ if(!signal || signal.encryption)
+ return
+
+ var/id_tag = signal.data["tag"]
+
+ if(input_tag == id_tag)
+ input_info = signal.data
+ else if(output_tag == id_tag)
+ output_info = signal.data
+ else
+ ..(signal)
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 4303c13769..15a7c1ab0b 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -121,7 +121,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return (TOXLOSS|OXYLOSS)
/obj/item/clothing/mask/cigarette/Initialize()
- ..()
+ . = ..()
create_reagents(chem_volume)
reagents.set_reacting(FALSE) // so it doesn't react until you light it
if(list_reagents)
@@ -378,7 +378,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/packeditem = 0
/obj/item/clothing/mask/cigarette/pipe/Initialize()
- ..()
+ . = ..()
name = "empty [initial(name)]"
/obj/item/clothing/mask/cigarette/pipe/Destroy()
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index de9f6ed44b..9a26f81375 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -134,7 +134,7 @@
access = CART_REAGENT_SCANNER | CART_ATMOS
/obj/item/cartridge/signal/Initialize()
- ..()
+ . = ..()
radio = new /obj/item/radio/integrated/signal(src)
@@ -183,7 +183,7 @@
bot_access_flags = FLOOR_BOT | CLEAN_BOT | MED_BOT
/obj/item/cartridge/rd/Initialize()
- ..()
+ . = ..()
radio = new /obj/item/radio/integrated/signal(src)
/obj/item/cartridge/captain
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index f6bfa50ce4..2c4fc8fa48 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -30,7 +30,7 @@
return ..()
/obj/item/radio/integrated/signal/Initialize()
- ..()
+ . = ..()
if (src.frequency < 1200 || src.frequency > 1600)
src.frequency = sanitize_frequency(src.frequency)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 15d0e0ba4c..eab0f030cc 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -16,7 +16,7 @@
var/flashlight_power = 1 //strength of the light when on
/obj/item/device/flashlight/Initialize()
- ..()
+ . = ..()
update_brightness()
/obj/item/device/flashlight/proc/update_brightness(mob/user = null)
@@ -409,7 +409,7 @@
/obj/item/device/flashlight/glowstick/Initialize()
fuel = rand(1600, 2000)
light_color = color
- ..()
+ . = ..()
/obj/item/device/flashlight/glowstick/Destroy()
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 91250f7d3c..55c8bb5252 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(GPS_list)
/obj/item/device/gps/Initialize()
- ..()
+ . = ..()
GLOB.GPS_list += src
name = "global positioning system ([gpstag])"
add_overlay("working")
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index c19e3eec92..0f59d00ab8 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -555,7 +555,7 @@
flags_2 = NO_EMP_WIRES_2
/obj/item/device/radio/borg/Initialize(mapload)
- ..()
+ . = ..()
/obj/item/device/radio/borg/syndicate
syndie = 1
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index dba9b8ba7d..912a083171 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -1,294 +1,294 @@
-/obj/item/device/taperecorder
- name = "universal recorder"
- desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
- icon_state = "taperecorder_empty"
- item_state = "analyzer"
+/obj/item/device/taperecorder
+ name = "universal recorder"
+ desc = "A device that can record to cassette tapes, and play them. It automatically translates the content in playback."
+ icon_state = "taperecorder_empty"
+ item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
- w_class = WEIGHT_CLASS_SMALL
+ w_class = WEIGHT_CLASS_SMALL
flags_1 = HEAR_1
- slot_flags = SLOT_BELT
- materials = list(MAT_METAL=60, MAT_GLASS=30)
- force = 2
- throwforce = 0
- var/recording = 0
- var/playing = 0
- var/playsleepseconds = 0
- var/obj/item/device/tape/mytape
- var/starting_tape_type = /obj/item/device/tape/random
- var/open_panel = 0
- var/canprint = 1
-
-
-/obj/item/device/taperecorder/Initialize(mapload)
- ..()
- if(starting_tape_type)
- mytape = new starting_tape_type(src)
- update_icon()
-
-
-/obj/item/device/taperecorder/examine(mob/user)
- ..()
- to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
-
-
-/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
- if(!mytape && istype(I, /obj/item/device/tape))
- if(!user.transferItemToLoc(I,src))
- return
- mytape = I
- to_chat(user, "You insert [I] into [src].")
- update_icon()
-
-
-/obj/item/device/taperecorder/proc/eject(mob/user)
- if(mytape)
- to_chat(user, "You remove [mytape] from [src].")
- stop()
- user.put_in_hands(mytape)
- mytape = null
- update_icon()
-
-/obj/item/device/taperecorder/fire_act(exposed_temperature, exposed_volume)
- mytape.ruin() //Fires destroy the tape
- ..()
-
-/obj/item/device/taperecorder/attack_hand(mob/user)
- if(loc == user)
- if(mytape)
- if(!user.is_holding(src))
- ..()
- return
- eject(user)
- return
- ..()
-
-
-/obj/item/device/taperecorder/proc/can_use(mob/user)
- if(user && ismob(user))
- if(!user.incapacitated())
- return 1
- return 0
-
-
-/obj/item/device/taperecorder/verb/ejectverb()
- set name = "Eject Tape"
- set category = "Object"
-
- if(!can_use(usr))
- return
- if(!mytape)
- return
-
- eject(usr)
-
-
-/obj/item/device/taperecorder/update_icon()
- if(!mytape)
- icon_state = "taperecorder_empty"
- else if(recording)
- icon_state = "taperecorder_recording"
- else if(playing)
- icon_state = "taperecorder_playing"
- else
- icon_state = "taperecorder_idle"
-
-
-/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
- if(mytape && recording)
- mytape.timestamp += mytape.used_capacity
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [message]"
-
-/obj/item/device/taperecorder/verb/record()
- set name = "Start Recording"
- set category = "Object"
-
- if(!can_use(usr))
- return
- if(!mytape || mytape.ruined)
- return
- if(recording)
- return
- if(playing)
- return
-
- if(mytape.used_capacity < mytape.max_capacity)
- to_chat(usr, "Recording started.")
- recording = 1
- update_icon()
- mytape.timestamp += mytape.used_capacity
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording started."
- var/used = mytape.used_capacity //to stop runtimes when you eject the tape
- var/max = mytape.max_capacity
- for(used, used < max)
- if(recording == 0)
- break
- mytape.used_capacity++
- used++
- sleep(10)
- recording = 0
- update_icon()
- else
- to_chat(usr, "The tape is full.")
-
-
-/obj/item/device/taperecorder/verb/stop()
- set name = "Stop"
- set category = "Object"
-
- if(!can_use(usr))
- return
-
- if(recording)
- recording = 0
- mytape.timestamp += mytape.used_capacity
- mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording stopped."
- to_chat(usr, "Recording stopped.")
- return
- else if(playing)
- playing = 0
- var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder: Playback stopped.")
- update_icon()
-
-
-/obj/item/device/taperecorder/verb/play()
- set name = "Play Tape"
- set category = "Object"
-
- if(!can_use(usr))
- return
- if(!mytape || mytape.ruined)
- return
- if(recording)
- return
- if(playing)
- return
-
- playing = 1
- update_icon()
- to_chat(usr, "Playing started.")
- var/used = mytape.used_capacity //to stop runtimes when you eject the tape
- var/max = mytape.max_capacity
- for(var/i = 1, used < max, sleep(10 * playsleepseconds))
- if(!mytape)
- break
- if(playing == 0)
- break
- if(mytape.storedinfo.len < i)
- break
- say(mytape.storedinfo[i])
- if(mytape.storedinfo.len < i + 1)
- playsleepseconds = 1
- sleep(10)
- say("End of recording.")
- else
- playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
- if(playsleepseconds > 14)
- sleep(10)
- say("Skipping [playsleepseconds] seconds of silence")
- playsleepseconds = 1
- i++
-
- playing = 0
- update_icon()
-
-
-/obj/item/device/taperecorder/attack_self(mob/user)
- if(!mytape || mytape.ruined)
- return
- if(recording)
- stop()
- else
- record()
-
-
-/obj/item/device/taperecorder/verb/print_transcript()
- set name = "Print Transcript"
- set category = "Object"
-
- if(!can_use(usr))
- return
- if(!mytape)
- return
- if(!canprint)
- to_chat(usr, "The recorder can't print that fast!")
- return
- if(recording || playing)
- return
-
- to_chat(usr, "Transcript printed.")
- var/obj/item/paper/P = new /obj/item/paper(get_turf(src))
- var/t1 = "Transcript:
"
- for(var/i = 1, mytape.storedinfo.len >= i, i++)
- t1 += "[mytape.storedinfo[i]]
"
- P.info = t1
- P.name = "paper- 'Transcript'"
- usr.put_in_hands(P)
- canprint = 0
- sleep(300)
- canprint = 1
-
-
-//empty tape recorders
-/obj/item/device/taperecorder/empty
- starting_tape_type = null
-
-
-/obj/item/device/tape
- name = "tape"
- desc = "A magnetic tape that can hold up to ten minutes of content."
- icon_state = "tape_white"
- item_state = "analyzer"
+ slot_flags = SLOT_BELT
+ materials = list(MAT_METAL=60, MAT_GLASS=30)
+ force = 2
+ throwforce = 0
+ var/recording = 0
+ var/playing = 0
+ var/playsleepseconds = 0
+ var/obj/item/device/tape/mytape
+ var/starting_tape_type = /obj/item/device/tape/random
+ var/open_panel = 0
+ var/canprint = 1
+
+
+/obj/item/device/taperecorder/Initialize(mapload)
+ . = ..()
+ if(starting_tape_type)
+ mytape = new starting_tape_type(src)
+ update_icon()
+
+
+/obj/item/device/taperecorder/examine(mob/user)
+ ..()
+ to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].")
+
+
+/obj/item/device/taperecorder/attackby(obj/item/I, mob/user, params)
+ if(!mytape && istype(I, /obj/item/device/tape))
+ if(!user.transferItemToLoc(I,src))
+ return
+ mytape = I
+ to_chat(user, "You insert [I] into [src].")
+ update_icon()
+
+
+/obj/item/device/taperecorder/proc/eject(mob/user)
+ if(mytape)
+ to_chat(user, "You remove [mytape] from [src].")
+ stop()
+ user.put_in_hands(mytape)
+ mytape = null
+ update_icon()
+
+/obj/item/device/taperecorder/fire_act(exposed_temperature, exposed_volume)
+ mytape.ruin() //Fires destroy the tape
+ ..()
+
+/obj/item/device/taperecorder/attack_hand(mob/user)
+ if(loc == user)
+ if(mytape)
+ if(!user.is_holding(src))
+ ..()
+ return
+ eject(user)
+ return
+ ..()
+
+
+/obj/item/device/taperecorder/proc/can_use(mob/user)
+ if(user && ismob(user))
+ if(!user.incapacitated())
+ return 1
+ return 0
+
+
+/obj/item/device/taperecorder/verb/ejectverb()
+ set name = "Eject Tape"
+ set category = "Object"
+
+ if(!can_use(usr))
+ return
+ if(!mytape)
+ return
+
+ eject(usr)
+
+
+/obj/item/device/taperecorder/update_icon()
+ if(!mytape)
+ icon_state = "taperecorder_empty"
+ else if(recording)
+ icon_state = "taperecorder_recording"
+ else if(playing)
+ icon_state = "taperecorder_playing"
+ else
+ icon_state = "taperecorder_idle"
+
+
+/obj/item/device/taperecorder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
+ if(mytape && recording)
+ mytape.timestamp += mytape.used_capacity
+ mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] [message]"
+
+/obj/item/device/taperecorder/verb/record()
+ set name = "Start Recording"
+ set category = "Object"
+
+ if(!can_use(usr))
+ return
+ if(!mytape || mytape.ruined)
+ return
+ if(recording)
+ return
+ if(playing)
+ return
+
+ if(mytape.used_capacity < mytape.max_capacity)
+ to_chat(usr, "Recording started.")
+ recording = 1
+ update_icon()
+ mytape.timestamp += mytape.used_capacity
+ mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording started."
+ var/used = mytape.used_capacity //to stop runtimes when you eject the tape
+ var/max = mytape.max_capacity
+ for(used, used < max)
+ if(recording == 0)
+ break
+ mytape.used_capacity++
+ used++
+ sleep(10)
+ recording = 0
+ update_icon()
+ else
+ to_chat(usr, "The tape is full.")
+
+
+/obj/item/device/taperecorder/verb/stop()
+ set name = "Stop"
+ set category = "Object"
+
+ if(!can_use(usr))
+ return
+
+ if(recording)
+ recording = 0
+ mytape.timestamp += mytape.used_capacity
+ mytape.storedinfo += "\[[time2text(mytape.used_capacity * 10,"mm:ss")]\] Recording stopped."
+ to_chat(usr, "Recording stopped.")
+ return
+ else if(playing)
+ playing = 0
+ var/turf/T = get_turf(src)
+ T.visible_message("Tape Recorder: Playback stopped.")
+ update_icon()
+
+
+/obj/item/device/taperecorder/verb/play()
+ set name = "Play Tape"
+ set category = "Object"
+
+ if(!can_use(usr))
+ return
+ if(!mytape || mytape.ruined)
+ return
+ if(recording)
+ return
+ if(playing)
+ return
+
+ playing = 1
+ update_icon()
+ to_chat(usr, "Playing started.")
+ var/used = mytape.used_capacity //to stop runtimes when you eject the tape
+ var/max = mytape.max_capacity
+ for(var/i = 1, used < max, sleep(10 * playsleepseconds))
+ if(!mytape)
+ break
+ if(playing == 0)
+ break
+ if(mytape.storedinfo.len < i)
+ break
+ say(mytape.storedinfo[i])
+ if(mytape.storedinfo.len < i + 1)
+ playsleepseconds = 1
+ sleep(10)
+ say("End of recording.")
+ else
+ playsleepseconds = mytape.timestamp[i + 1] - mytape.timestamp[i]
+ if(playsleepseconds > 14)
+ sleep(10)
+ say("Skipping [playsleepseconds] seconds of silence")
+ playsleepseconds = 1
+ i++
+
+ playing = 0
+ update_icon()
+
+
+/obj/item/device/taperecorder/attack_self(mob/user)
+ if(!mytape || mytape.ruined)
+ return
+ if(recording)
+ stop()
+ else
+ record()
+
+
+/obj/item/device/taperecorder/verb/print_transcript()
+ set name = "Print Transcript"
+ set category = "Object"
+
+ if(!can_use(usr))
+ return
+ if(!mytape)
+ return
+ if(!canprint)
+ to_chat(usr, "The recorder can't print that fast!")
+ return
+ if(recording || playing)
+ return
+
+ to_chat(usr, "Transcript printed.")
+ var/obj/item/paper/P = new /obj/item/paper(get_turf(src))
+ var/t1 = "Transcript:
"
+ for(var/i = 1, mytape.storedinfo.len >= i, i++)
+ t1 += "[mytape.storedinfo[i]]
"
+ P.info = t1
+ P.name = "paper- 'Transcript'"
+ usr.put_in_hands(P)
+ canprint = 0
+ sleep(300)
+ canprint = 1
+
+
+//empty tape recorders
+/obj/item/device/taperecorder/empty
+ starting_tape_type = null
+
+
+/obj/item/device/tape
+ name = "tape"
+ desc = "A magnetic tape that can hold up to ten minutes of content."
+ icon_state = "tape_white"
+ item_state = "analyzer"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
- w_class = WEIGHT_CLASS_TINY
- materials = list(MAT_METAL=20, MAT_GLASS=5)
- force = 1
- throwforce = 0
- var/max_capacity = 600
- var/used_capacity = 0
- var/list/storedinfo = list()
- var/list/timestamp = list()
- var/ruined = 0
-
-/obj/item/device/tape/fire_act(exposed_temperature, exposed_volume)
- ruin()
- ..()
-
-/obj/item/device/tape/attack_self(mob/user)
- if(!ruined)
- to_chat(user, "You pull out all the tape!")
- ruin()
-
-
-/obj/item/device/tape/proc/ruin()
- //Lets not add infinite amounts of overlays when our fireact is called
- //repeatedly
- if(!ruined)
- add_overlay("ribbonoverlay")
- ruined = 1
-
-
-/obj/item/device/tape/proc/fix()
- cut_overlay("ribbonoverlay")
- ruined = 0
-
-
-/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
- if(ruined)
- var/delay = -1
- if (istype(I, /obj/item/screwdriver))
- delay = 120*I.toolspeed
- else if(istype(I, /obj/item/pen))
- delay = 120*1.5
- if (delay != -1)
- to_chat(user, "You start winding the tape back in...")
- if(do_after(user, delay, target = src))
- to_chat(user, "You wound the tape back in.")
- fix()
-
-//Random colour tapes
-/obj/item/device/tape/random/New()
- icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
- ..()
+ w_class = WEIGHT_CLASS_TINY
+ materials = list(MAT_METAL=20, MAT_GLASS=5)
+ force = 1
+ throwforce = 0
+ var/max_capacity = 600
+ var/used_capacity = 0
+ var/list/storedinfo = list()
+ var/list/timestamp = list()
+ var/ruined = 0
+
+/obj/item/device/tape/fire_act(exposed_temperature, exposed_volume)
+ ruin()
+ ..()
+
+/obj/item/device/tape/attack_self(mob/user)
+ if(!ruined)
+ to_chat(user, "You pull out all the tape!")
+ ruin()
+
+
+/obj/item/device/tape/proc/ruin()
+ //Lets not add infinite amounts of overlays when our fireact is called
+ //repeatedly
+ if(!ruined)
+ add_overlay("ribbonoverlay")
+ ruined = 1
+
+
+/obj/item/device/tape/proc/fix()
+ cut_overlay("ribbonoverlay")
+ ruined = 0
+
+
+/obj/item/device/tape/attackby(obj/item/I, mob/user, params)
+ if(ruined)
+ var/delay = -1
+ if (istype(I, /obj/item/screwdriver))
+ delay = 120*I.toolspeed
+ else if(istype(I, /obj/item/pen))
+ delay = 120*1.5
+ if (delay != -1)
+ to_chat(user, "You start winding the tape back in...")
+ if(do_after(user, delay, target = src))
+ to_chat(user, "You wound the tape back in.")
+ fix()
+
+//Random colour tapes
+/obj/item/device/tape/random/New()
+ icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]"
+ ..()
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index df3f2ad9fa..ae79c7e86d 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -127,7 +127,7 @@
/obj/structure/alien/weeds/Initialize()
pixel_x = -4
pixel_y = -4 //so the sprites line up right in the map editor
- ..()
+ . = ..()
if(!blacklisted_turfs)
blacklisted_turfs = typecacheof(list(
@@ -178,7 +178,7 @@
/obj/structure/alien/weeds/node/Initialize()
icon = 'icons/obj/smooth_structures/alien/weednode.dmi'
- ..()
+ . = ..()
set_light(lon_range)
var/obj/structure/alien/weeds/W = locate(/obj/structure/alien/weeds) in loc
if(W && W != src)
@@ -223,7 +223,7 @@
var/obj/item/clothing/mask/facehugger/child
/obj/structure/alien/egg/Initialize(mapload)
- ..()
+ . = ..()
update_icon()
if(status == GROWING || status == GROWN)
child = new(src)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index e34278e51b..4754cc63e7 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -15,7 +15,7 @@
layer = OBJ_LAYER
/obj/structure/chair/Initialize()
- ..()
+ . = ..()
if(!anchored) //why would you put these on the shuttle?
addtimer(CALLBACK(src, .proc/RemoveFromLatejoin), 0)
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index f14ca385a8..bbea363919 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -1,202 +1,202 @@
-/*
-CONTAINS:
-SAFES
-FLOOR SAFES
-*/
-
-//SAFES
-/obj/structure/safe
- name = "safe"
- desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
- icon = 'icons/obj/structures.dmi'
- icon_state = "safe"
+/*
+CONTAINS:
+SAFES
+FLOOR SAFES
+*/
+
+//SAFES
+/obj/structure/safe
+ name = "safe"
+ desc = "A huge chunk of metal with a dial embedded in it. Fine print on the dial reads \"Scarborough Arms - 2 tumbler safe, guaranteed thermite resistant, explosion resistant, and assistant resistant.\""
+ icon = 'icons/obj/structures.dmi'
+ icon_state = "safe"
anchored = TRUE
density = TRUE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/open = FALSE //is the safe open?
- var/tumbler_1_pos //the tumbler position- from 0 to 72
- var/tumbler_1_open //the tumbler position to open at- 0 to 72
- var/tumbler_2_pos
- var/tumbler_2_open
- var/dial = 0 //where is the dial pointing?
- var/space = 0 //the combined w_class of everything in the safe
- var/maxspace = 24 //the maximum combined w_class of stuff in the safe
-
-
-/obj/structure/safe/New()
- ..()
- tumbler_1_pos = rand(0, 71)
- tumbler_1_open = rand(0, 71)
-
- tumbler_2_pos = rand(0, 71)
- tumbler_2_open = rand(0, 71)
-
-
-/obj/structure/safe/Initialize(mapload)
- ..()
-
- if(!mapload)
- return
-
- for(var/obj/item/I in loc)
- if(space >= maxspace)
- return
- if(I.w_class + space <= maxspace)
- space += I.w_class
- I.loc = src
-
-
-/obj/structure/safe/proc/check_unlocked(mob/user, canhear)
- if(user && canhear)
- if(tumbler_1_pos == tumbler_1_open)
- to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].")
- if(tumbler_2_pos == tumbler_2_open)
- to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].")
- if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
- if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!")
- return 1
- return 0
-
-
-/obj/structure/safe/proc/decrement(num)
- num -= 1
- if(num < 0)
- num = 71
- return num
-
-
-/obj/structure/safe/proc/increment(num)
- num += 1
- if(num > 71)
- num = 0
- return num
-
-
-/obj/structure/safe/update_icon()
- if(open)
- icon_state = "[initial(icon_state)]-open"
- else
- icon_state = initial(icon_state)
-
-
-/obj/structure/safe/attack_hand(mob/user)
- user.set_machine(src)
- var/dat = "
"
- dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +"
- if(open)
- dat += ""
- for(var/i = contents.len, i>=1, i--)
- var/obj/item/P = contents[i]
- dat += "| [P.name] |
"
- dat += "
"
- user << browse("[name][dat]", "window=safe;size=350x300")
-
-
-/obj/structure/safe/Topic(href, href_list)
- if(!ishuman(usr))
- return
- var/mob/living/carbon/human/user = usr
-
- var/canhear = 0
- if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope))
- canhear = 1
-
- if(href_list["open"])
- if(check_unlocked())
- to_chat(user, "You [open ? "close" : "open"] [src].")
- open = !open
- update_icon()
- updateUsrDialog()
- return
- else
- to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!")
- return
-
- if(href_list["decrement"])
- dial = decrement(dial)
- if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71)
- tumbler_1_pos = decrement(tumbler_1_pos)
- if(canhear)
- to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].")
- if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35)
- tumbler_2_pos = decrement(tumbler_2_pos)
- if(canhear)
- to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].")
- check_unlocked(user, canhear)
- updateUsrDialog()
- return
-
- if(href_list["increment"])
- dial = increment(dial)
- if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71)
- tumbler_1_pos = increment(tumbler_1_pos)
- if(canhear)
- to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].")
- if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35)
- tumbler_2_pos = increment(tumbler_2_pos)
- if(canhear)
- to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].")
- check_unlocked(user, canhear)
- updateUsrDialog()
- return
-
- if(href_list["retrieve"])
- user << browse("", "window=safe") // Close the menu
-
- var/obj/item/P = locate(href_list["retrieve"]) in src
- if(open)
- if(P && in_range(src, user))
- user.put_in_hands(P)
- space -= P.w_class
- updateUsrDialog()
-
-
-/obj/structure/safe/attackby(obj/item/I, mob/user, params)
- if(open)
- . = 1 //no afterattack
- if(I.w_class + space <= maxspace)
- space += I.w_class
- if(!user.drop_item())
- to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!")
- return
- I.forceMove(src)
- to_chat(user, "You put [I] in [src].")
- updateUsrDialog()
- return
- else
- to_chat(user, "[I] won't fit in [src].")
- return
- else if(istype(I, /obj/item/clothing/neck/stethoscope))
- to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!")
- else
- return ..()
-
-
-/obj/structure/safe/handle_atom_del(atom/A)
- updateUsrDialog()
-
-/obj/structure/safe/blob_act(obj/structure/blob/B)
- return
-
-/obj/structure/safe/ex_act(severity, target)
- return
-
-
-//FLOOR SAFES
-/obj/structure/safe/floor
- name = "floor safe"
- icon_state = "floorsafe"
+ var/tumbler_1_pos //the tumbler position- from 0 to 72
+ var/tumbler_1_open //the tumbler position to open at- 0 to 72
+ var/tumbler_2_pos
+ var/tumbler_2_open
+ var/dial = 0 //where is the dial pointing?
+ var/space = 0 //the combined w_class of everything in the safe
+ var/maxspace = 24 //the maximum combined w_class of stuff in the safe
+
+
+/obj/structure/safe/New()
+ ..()
+ tumbler_1_pos = rand(0, 71)
+ tumbler_1_open = rand(0, 71)
+
+ tumbler_2_pos = rand(0, 71)
+ tumbler_2_open = rand(0, 71)
+
+
+/obj/structure/safe/Initialize(mapload)
+ ..()
+
+ if(!mapload)
+ return
+
+ for(var/obj/item/I in loc)
+ if(space >= maxspace)
+ return
+ if(I.w_class + space <= maxspace)
+ space += I.w_class
+ I.loc = src
+
+
+/obj/structure/safe/proc/check_unlocked(mob/user, canhear)
+ if(user && canhear)
+ if(tumbler_1_pos == tumbler_1_open)
+ to_chat(user, "You hear a [pick("tonk", "krunk", "plunk")] from [src].")
+ if(tumbler_2_pos == tumbler_2_open)
+ to_chat(user, "You hear a [pick("tink", "krink", "plink")] from [src].")
+ if(tumbler_1_pos == tumbler_1_open && tumbler_2_pos == tumbler_2_open)
+ if(user) visible_message("[pick("Spring", "Sprang", "Sproing", "Clunk", "Krunk")]!")
+ return 1
+ return 0
+
+
+/obj/structure/safe/proc/decrement(num)
+ num -= 1
+ if(num < 0)
+ num = 71
+ return num
+
+
+/obj/structure/safe/proc/increment(num)
+ num += 1
+ if(num > 71)
+ num = 0
+ return num
+
+
+/obj/structure/safe/update_icon()
+ if(open)
+ icon_state = "[initial(icon_state)]-open"
+ else
+ icon_state = initial(icon_state)
+
+
+/obj/structure/safe/attack_hand(mob/user)
+ user.set_machine(src)
+ var/dat = ""
+ dat += "[open ? "Close" : "Open"] [src] | - [dial * 5] +"
+ if(open)
+ dat += ""
+ for(var/i = contents.len, i>=1, i--)
+ var/obj/item/P = contents[i]
+ dat += "| [P.name] |
"
+ dat += "
"
+ user << browse("[name][dat]", "window=safe;size=350x300")
+
+
+/obj/structure/safe/Topic(href, href_list)
+ if(!ishuman(usr))
+ return
+ var/mob/living/carbon/human/user = usr
+
+ var/canhear = 0
+ if(user.is_holding_item_of_type(/obj/item/clothing/neck/stethoscope))
+ canhear = 1
+
+ if(href_list["open"])
+ if(check_unlocked())
+ to_chat(user, "You [open ? "close" : "open"] [src].")
+ open = !open
+ update_icon()
+ updateUsrDialog()
+ return
+ else
+ to_chat(user, "You can't [open ? "close" : "open"] [src], the lock is engaged!")
+ return
+
+ if(href_list["decrement"])
+ dial = decrement(dial)
+ if(dial == tumbler_1_pos + 1 || dial == tumbler_1_pos - 71)
+ tumbler_1_pos = decrement(tumbler_1_pos)
+ if(canhear)
+ to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].")
+ if(tumbler_1_pos == tumbler_2_pos + 37 || tumbler_1_pos == tumbler_2_pos - 35)
+ tumbler_2_pos = decrement(tumbler_2_pos)
+ if(canhear)
+ to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].")
+ check_unlocked(user, canhear)
+ updateUsrDialog()
+ return
+
+ if(href_list["increment"])
+ dial = increment(dial)
+ if(dial == tumbler_1_pos - 1 || dial == tumbler_1_pos + 71)
+ tumbler_1_pos = increment(tumbler_1_pos)
+ if(canhear)
+ to_chat(user, "You hear a [pick("clack", "scrape", "clank")] from [src].")
+ if(tumbler_1_pos == tumbler_2_pos - 37 || tumbler_1_pos == tumbler_2_pos + 35)
+ tumbler_2_pos = increment(tumbler_2_pos)
+ if(canhear)
+ to_chat(user, "You hear a [pick("click", "chink", "clink")] from [src].")
+ check_unlocked(user, canhear)
+ updateUsrDialog()
+ return
+
+ if(href_list["retrieve"])
+ user << browse("", "window=safe") // Close the menu
+
+ var/obj/item/P = locate(href_list["retrieve"]) in src
+ if(open)
+ if(P && in_range(src, user))
+ user.put_in_hands(P)
+ space -= P.w_class
+ updateUsrDialog()
+
+
+/obj/structure/safe/attackby(obj/item/I, mob/user, params)
+ if(open)
+ . = 1 //no afterattack
+ if(I.w_class + space <= maxspace)
+ space += I.w_class
+ if(!user.drop_item())
+ to_chat(user, "\The [I] is stuck to your hand, you cannot put it in the safe!")
+ return
+ I.forceMove(src)
+ to_chat(user, "You put [I] in [src].")
+ updateUsrDialog()
+ return
+ else
+ to_chat(user, "[I] won't fit in [src].")
+ return
+ else if(istype(I, /obj/item/clothing/neck/stethoscope))
+ to_chat(user, "Hold [I] in one of your hands while you manipulate the dial!")
+ else
+ return ..()
+
+
+/obj/structure/safe/handle_atom_del(atom/A)
+ updateUsrDialog()
+
+/obj/structure/safe/blob_act(obj/structure/blob/B)
+ return
+
+/obj/structure/safe/ex_act(severity, target)
+ return
+
+
+//FLOOR SAFES
+/obj/structure/safe/floor
+ name = "floor safe"
+ icon_state = "floorsafe"
density = FALSE
- level = 1 //underfloor
- layer = LOW_OBJ_LAYER
-
-
-/obj/structure/safe/floor/Initialize(mapload)
- ..()
- if(mapload)
- var/turf/T = loc
- hide(T.intact)
-
-
-/obj/structure/safe/floor/hide(var/intact)
- invisibility = intact ? INVISIBILITY_MAXIMUM : 0
\ No newline at end of file
+ level = 1 //underfloor
+ layer = LOW_OBJ_LAYER
+
+
+/obj/structure/safe/floor/Initialize(mapload)
+ . = ..()
+ if(mapload)
+ var/turf/T = loc
+ hide(T.intact)
+
+
+/obj/structure/safe/floor/hide(var/intact)
+ invisibility = intact ? INVISIBILITY_MAXIMUM : 0
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 8ca558cd81..3a143c7910 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -104,7 +104,7 @@
pda.owner = text("[]", src)
pda.name = pda.owner + " (" + pda.ownjob + ")"
- ..()
+ . = ..()
var/datum/action/innate/pai/shell/AS = new /datum/action/innate/pai/shell
var/datum/action/innate/pai/chassis/AC = new /datum/action/innate/pai/chassis
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index eeeadb59bc..3cd66724e9 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -1,567 +1,567 @@
-/mob/living/simple_animal/bot/ed209
- name = "\improper ED-209 Security Robot"
- desc = "A security robot. He looks less than thrilled."
- icon = 'icons/mob/aibots.dmi'
- icon_state = "ed2090"
- density = TRUE
- anchored = FALSE
- health = 100
- maxHealth = 100
- damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- obj_damage = 60
- environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
- mob_size = MOB_SIZE_LARGE
-
- radio_key = /obj/item/device/encryptionkey/headset_sec
- radio_channel = "Security"
- bot_type = SEC_BOT
- model = "ED-209"
- bot_core = /obj/machinery/bot_core/secbot
- window_id = "autoed209"
- window_name = "Automatic Security Unit v2.6"
- allow_pai = 0
- data_hud_type = DATA_HUD_SECURITY_ADVANCED
-
- var/lastfired = 0
- var/shot_delay = 15
- var/lasercolor = ""
- var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag
-
-
- var/mob/living/carbon/target
- var/oldtarget_name
- var/threatlevel = 0
- var/target_lastloc //Loc of target when arrested.
- var/last_found //There's a delay
- var/declare_arrests = 1 //When making an arrest, should it notify everyone wearing sechuds?
- var/idcheck = 1 //If true, arrest people with no IDs
- var/weaponscheck = 1 //If true, arrest people for weapons if they don't have access
- var/check_records = 1 //Does it check security records?
- var/arrest_type = 0 //If true, don't handcuff
- var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type
- var/shoot_sound = 'sound/weapons/taser.ogg'
-
-
-/mob/living/simple_animal/bot/ed209/Initialize(mapload,created_name,created_lasercolor)
- ..()
- if(created_name)
- name = created_name
- if(created_lasercolor)
- lasercolor = created_lasercolor
- icon_state = "[lasercolor]ed209[on]"
- set_weapon() //giving it the right projectile and firing sound.
- spawn(3)
- var/datum/job/detective/J = new/datum/job/detective
- access_card.access += J.get_access()
- prev_access = access_card.access
-
- if(lasercolor)
- shot_delay = 6//Longer shot delay because JESUS CHRIST
- check_records = 0//Don't actively target people set to arrest
- arrest_type = 1//Don't even try to cuff
- bot_core.req_access = list(ACCESS_MAINT_TUNNELS, ACCESS_THEATRE)
- arrest_type = 1
- if((lasercolor == "b") && (name == "\improper ED-209 Security Robot"))//Picks a name if there isn't already a custome one
- name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
- if((lasercolor == "r") && (name == "\improper ED-209 Security Robot"))
- name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
-
- //SECHUD
- var/datum/atom_hud/secsensor = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
- secsensor.add_hud_to(src)
-
-/mob/living/simple_animal/bot/ed209/turn_on()
- . = ..()
- icon_state = "[lasercolor]ed209[on]"
- mode = BOT_IDLE
-
-/mob/living/simple_animal/bot/ed209/turn_off()
- ..()
- icon_state = "[lasercolor]ed209[on]"
-
-/mob/living/simple_animal/bot/ed209/bot_reset()
- ..()
- target = null
- oldtarget_name = null
- anchored = FALSE
- walk_to(src,0)
- last_found = world.time
- set_weapon()
-
-/mob/living/simple_animal/bot/ed209/set_custom_texts()
- text_hack = "You disable [name]'s combat inhibitor."
- text_dehack = "You restore [name]'s combat inhibitor."
- text_dehack_fail = "[name] ignores your attempts to restrict him!"
-
-/mob/living/simple_animal/bot/ed209/get_controls(mob/user)
- var/dat
- dat += hack(user)
- dat += showpai(user)
- dat += text({"
-Security Unit v2.6 controls
-Status: []
-Behaviour controls are [locked ? "locked" : "unlocked"]
-Maintenance panel panel is [open ? "opened" : "closed"]
"},
-
-"[on ? "On" : "Off"]" )
-
- if(!locked || issilicon(user)|| IsAdminGhost(user))
- if(!lasercolor)
- dat += text({"
-Arrest Unidentifiable Persons: []
-Arrest for Unauthorized Weapons: []
-Arrest for Warrant: []
-
-Operating Mode: []
-Report Arrests[]
-Auto Patrol[]"},
-
-"[idcheck ? "Yes" : "No"]",
-"[weaponscheck ? "Yes" : "No"]",
-"[check_records ? "Yes" : "No"]",
-"[arrest_type ? "Detain" : "Arrest"]",
-"[declare_arrests ? "Yes" : "No"]",
-"[auto_patrol ? "On" : "Off"]" )
-
- return dat
-
-/mob/living/simple_animal/bot/ed209/Topic(href, href_list)
- if(lasercolor && ishuman(usr))
- var/mob/living/carbon/human/H = usr
- if((lasercolor == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))//Opposing team cannot operate it
- return
- else if((lasercolor == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag)))
- return
- if(..())
- return 1
-
- switch(href_list["operation"])
- if("idcheck")
- idcheck = !idcheck
- update_controls()
- if("weaponscheck")
- weaponscheck = !weaponscheck
- update_controls()
- if("ignorerec")
- check_records = !check_records
- update_controls()
- if("switchmode")
- arrest_type = !arrest_type
- update_controls()
- if("declarearrests")
- declare_arrests = !declare_arrests
- update_controls()
-
-/mob/living/simple_animal/bot/ed209/proc/judgement_criteria()
- var/final = FALSE
- if(idcheck)
- final = final|JUDGE_IDCHECK
- if(check_records)
- final = final|JUDGE_RECORDCHECK
- if(weaponscheck)
- final = final|JUDGE_WEAPONCHECK
- if(emagged)
- final = final|JUDGE_EMAGGED
- //ED209's ignore monkeys
- final = final|JUDGE_IGNOREMONKEYS
- return final
-
-/mob/living/simple_animal/bot/ed209/proc/retaliate(mob/living/carbon/human/H)
- var/judgement_criteria = judgement_criteria()
- threatlevel = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
- threatlevel += 6
- if(threatlevel >= 4)
- target = H
- mode = BOT_HUNT
-
-/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H)
- if(H.a_intent == INTENT_HARM)
- retaliate(H)
- return ..()
-
-/mob/living/simple_animal/bot/ed209/attackby(obj/item/W, mob/user, params)
- ..()
- if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
- return
- if(!istype(W, /obj/item/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
- if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina.
- retaliate(user)
- if(lasercolor)//To make up for the fact that lasertag bots don't hunt
- shootAt(user)
-
-/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
- ..()
- if(emagged == 2)
- if(user)
- to_chat(user, "You short out [src]'s target assessment circuits.")
- oldtarget_name = user.name
- audible_message("[src] buzzes oddly!")
- declare_arrests = 0
- icon_state = "[lasercolor]ed209[on]"
- set_weapon()
-
-/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
- if(istype(Proj , /obj/item/projectile/beam/laser)||istype(Proj, /obj/item/projectile/bullet))
- if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
- if(!Proj.nodamage && Proj.damage < src.health)
- retaliate(Proj.firer)
- ..()
-
-/mob/living/simple_animal/bot/ed209/handle_automated_action()
- if(!..())
- return
-
- if(disabled)
- return
-
- var/judgement_criteria = judgement_criteria()
- var/list/targets = list()
- for(var/mob/living/carbon/C in view(7,src)) //Let's find us a target
- var/threatlevel = 0
- if((C.stat) || (C.lying))
- continue
- threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
- //speak(C.real_name + text(": threat: []", threatlevel))
- if(threatlevel < 4 )
- continue
-
- var/dst = get_dist(src, C)
- if(dst <= 1 || dst > 7)
- continue
-
- targets += C
- if(targets.len>0)
- var/mob/living/carbon/t = pick(targets)
- if((t.stat!=2) && (t.lying != 1) && (!t.handcuffed)) //we don't shoot people who are dead, cuffed or lying down.
- shootAt(t)
- switch(mode)
-
- if(BOT_IDLE) // idle
- walk_to(src,0)
- if(!lasercolor) //lasertag bots don't want to arrest anyone
- look_for_perp() // see if any criminals are in range
- if(!mode && auto_patrol) // still idle, and set to patrol
- mode = BOT_START_PATROL // switch to patrol mode
-
- if(BOT_HUNT) // hunting for perp
- // if can't reach perp for long enough, go idle
- if(frustration >= 8)
- walk_to(src,0)
- back_to_idle()
-
- if(target) // make sure target exists
- if(Adjacent(target) && isturf(target.loc)) // if right next to perp
- stun_attack(target)
-
- mode = BOT_PREP_ARREST
- anchored = TRUE
- target_lastloc = target.loc
- return
-
- else // not next to perp
- var/turf/olddist = get_dist(src, target)
- walk_to(src, target,1,4)
- if((get_dist(src, target)) >= (olddist))
- frustration++
- else
- frustration = 0
- else
- back_to_idle()
-
- if(BOT_PREP_ARREST) // preparing to arrest target
-
- // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
- if(!Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40)
- back_to_hunt()
- return
-
- if(iscarbon(target) && target.canBeHandcuffed())
- if(!arrest_type)
- if(!target.handcuffed) //he's not cuffed? Try to cuff him!
- cuff(target)
- else
- back_to_idle()
- return
- else
- back_to_idle()
- return
-
- if(BOT_ARREST)
- if(!target)
- anchored = FALSE
- mode = BOT_IDLE
- last_found = world.time
- frustration = 0
- return
-
- if(target.handcuffed) //no target or target cuffed? back to idle.
- back_to_idle()
- return
-
- if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again.
- back_to_hunt()
- return
- else
- mode = BOT_PREP_ARREST
- anchored = FALSE
-
- if(BOT_START_PATROL)
- look_for_perp()
- start_patrol()
-
- if(BOT_PATROL)
- look_for_perp()
- bot_patrol()
-
-
- return
-
-/mob/living/simple_animal/bot/ed209/proc/back_to_idle()
- anchored = FALSE
- mode = BOT_IDLE
- target = null
- last_found = world.time
- frustration = 0
- INVOKE_ASYNC(src, .proc/handle_automated_action) //ensure bot quickly responds
-
-/mob/living/simple_animal/bot/ed209/proc/back_to_hunt()
- anchored = FALSE
- frustration = 0
- mode = BOT_HUNT
- INVOKE_ASYNC(src, .proc/handle_automated_action) //ensure bot quickly responds
-
-// look for a criminal in view of the bot
-
-/mob/living/simple_animal/bot/ed209/proc/look_for_perp()
- if(disabled)
- return
- anchored = FALSE
- threatlevel = 0
- var/judgement_criteria = judgement_criteria()
- for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
- if((C.stat) || (C.handcuffed))
- continue
-
- if((C.name == oldtarget_name) && (world.time < last_found + 100))
- continue
-
- threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
-
- if(!threatlevel)
- continue
-
- else if(threatlevel >= 4)
- target = C
- oldtarget_name = C.name
- speak("Level [threatlevel] infraction alert!")
- playsound(loc, pick('sound/voice/ed209_20sec.ogg', 'sound/voice/edplaceholder.ogg'), 50, 0)
- visible_message("[src] points at [C.name]!")
- mode = BOT_HUNT
- spawn(0)
- handle_automated_action() // ensure bot quickly responds to a perp
- break
- else
- continue
-
-/mob/living/simple_animal/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item)
- if(slot_item && slot_item.needs_permit)
- return 1
- return 0
-
-/mob/living/simple_animal/bot/ed209/explode()
- walk_to(src,0)
- visible_message("[src] blows apart!")
- var/turf/Tsec = get_turf(src)
-
- var/obj/item/ed209_assembly/Sa = new /obj/item/ed209_assembly(Tsec)
- Sa.build_step = 1
- Sa.add_overlay("hs_hole")
- Sa.created_name = name
- new /obj/item/device/assembly/prox_sensor(Tsec)
-
- if(!lasercolor)
- var/obj/item/gun/energy/e_gun/advtaser/G = new /obj/item/gun/energy/e_gun/advtaser(Tsec)
- G.cell.charge = 0
- G.update_icon()
- else if(lasercolor == "b")
- var/obj/item/gun/energy/laser/bluetag/G = new /obj/item/gun/energy/laser/bluetag(Tsec)
- G.cell.charge = 0
- G.update_icon()
- else if(lasercolor == "r")
- var/obj/item/gun/energy/laser/redtag/G = new /obj/item/gun/energy/laser/redtag(Tsec)
- G.cell.charge = 0
- G.update_icon()
-
- if(prob(50))
- new /obj/item/bodypart/l_leg/robot(Tsec)
- if(prob(25))
- new /obj/item/bodypart/r_leg/robot(Tsec)
- if(prob(25))//50% chance for a helmet OR vest
- if(prob(50))
- new /obj/item/clothing/head/helmet(Tsec)
- else
- if(!lasercolor)
- new /obj/item/clothing/suit/armor/vest(Tsec)
- if(lasercolor == "b")
- new /obj/item/clothing/suit/bluetag(Tsec)
- if(lasercolor == "r")
- new /obj/item/clothing/suit/redtag(Tsec)
-
- do_sparks(3, TRUE, src)
-
- new /obj/effect/decal/cleanable/oil(loc)
- ..()
-
-/mob/living/simple_animal/bot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
- shoot_sound = 'sound/weapons/laser.ogg'
- if(emagged == 2)
- if(lasercolor)
- projectile = /obj/item/projectile/beam/lasertag
- else
- projectile = /obj/item/projectile/beam
- else
- if(!lasercolor)
- shoot_sound = 'sound/weapons/taser.ogg'
- projectile = /obj/item/projectile/energy/electrode
- else if(lasercolor == "b")
- projectile = /obj/item/projectile/beam/lasertag/bluetag
- else if(lasercolor == "r")
- projectile = /obj/item/projectile/beam/lasertag/redtag
-
-/mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target)
- if(lastfired && world.time - lastfired < shot_delay)
- return
- lastfired = world.time
- var/turf/T = loc
- var/turf/U = get_turf(target)
- if(!U)
- return
- if(!isturf(T))
- return
-
- if(!projectile)
- return
-
- var/obj/item/projectile/A = new projectile (loc)
- playsound(loc, shoot_sound, 50, 1)
- A.current = U
- A.yo = U.y - T.y
- A.xo = U.x - T.x
- A.fire()
-
-/mob/living/simple_animal/bot/ed209/attack_alien(mob/living/carbon/alien/user)
- ..()
- if(!isalien(target))
- target = user
- mode = BOT_HUNT
-
-
-/mob/living/simple_animal/bot/ed209/emp_act(severity)
-
- if(severity==2 && prob(70))
- ..(severity-1)
- else
- new /obj/effect/temp_visual/emp(loc)
- var/list/mob/living/carbon/targets = new
- for(var/mob/living/carbon/C in view(12,src))
- if(C.stat==DEAD)
- continue
- targets += C
- if(targets.len)
- if(prob(50))
- var/mob/toshoot = pick(targets)
- if(toshoot)
- targets-=toshoot
- if(prob(50) && emagged < 2)
- emagged = 2
- set_weapon()
- shootAt(toshoot)
- emagged = FALSE
- set_weapon()
- else
- shootAt(toshoot)
- else if(prob(50))
- if(targets.len)
- var/mob/toarrest = pick(targets)
- if(toarrest)
- target = toarrest
- mode = BOT_HUNT
-
-
-/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
- if(!disabled)
- var/lasertag_check = 0
- if((lasercolor == "b"))
- if(istype(Proj, /obj/item/projectile/beam/lasertag/redtag))
- lasertag_check++
- else if((lasercolor == "r"))
- if(istype(Proj, /obj/item/projectile/beam/lasertag/bluetag))
- lasertag_check++
- if(lasertag_check)
- icon_state = "[lasercolor]ed2090"
- disabled = 1
- target = null
- spawn(100)
- disabled = 0
- icon_state = "[lasercolor]ed2091"
- return 1
- else
- ..(Proj)
- else
- ..(Proj)
-
-/mob/living/simple_animal/bot/ed209/bluetag
- lasercolor = "b"
-
-/mob/living/simple_animal/bot/ed209/redtag
- lasercolor = "r"
-
-/mob/living/simple_animal/bot/ed209/UnarmedAttack(atom/A)
- if(!on)
- return
- if(iscarbon(A))
- var/mob/living/carbon/C = A
- if(!C.IsStun() || arrest_type)
- stun_attack(A)
- else if(C.canBeHandcuffed() && !C.handcuffed)
- cuff(A)
- else
- ..()
-
-/mob/living/simple_animal/bot/ed209/RangedAttack(atom/A)
- if(!on)
- return
- shootAt(A)
-
-/mob/living/simple_animal/bot/ed209/proc/stun_attack(mob/living/carbon/C)
- playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
- icon_state = "[lasercolor]ed209-c"
- spawn(2)
- icon_state = "[lasercolor]ed209[on]"
- var/threat = 5
- C.Knockdown(100)
- C.stuttering = 5
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- var/judgement_criteria = judgement_criteria()
- threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
- add_logs(src,C,"stunned")
- if(declare_arrests)
- var/area/location = get_area(src)
- speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel)
- C.visible_message("[src] has stunned [C]!",\
- "[src] has stunned you!")
-
-/mob/living/simple_animal/bot/ed209/proc/cuff(mob/living/carbon/C)
- mode = BOT_ARREST
- playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
- C.visible_message("[src] is trying to put zipties on [C]!",\
- "[src] is trying to put zipties on you!")
-
- spawn(60)
- if( !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing.
- return
- if(!C.handcuffed)
- C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
- C.update_handcuffed()
- back_to_idle()
+/mob/living/simple_animal/bot/ed209
+ name = "\improper ED-209 Security Robot"
+ desc = "A security robot. He looks less than thrilled."
+ icon = 'icons/mob/aibots.dmi'
+ icon_state = "ed2090"
+ density = TRUE
+ anchored = FALSE
+ health = 100
+ maxHealth = 100
+ damage_coeff = list(BRUTE = 0.5, BURN = 0.7, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
+ obj_damage = 60
+ environment_smash = ENVIRONMENT_SMASH_WALLS //Walls can't stop THE LAW
+ mob_size = MOB_SIZE_LARGE
+
+ radio_key = /obj/item/device/encryptionkey/headset_sec
+ radio_channel = "Security"
+ bot_type = SEC_BOT
+ model = "ED-209"
+ bot_core = /obj/machinery/bot_core/secbot
+ window_id = "autoed209"
+ window_name = "Automatic Security Unit v2.6"
+ allow_pai = 0
+ data_hud_type = DATA_HUD_SECURITY_ADVANCED
+
+ var/lastfired = 0
+ var/shot_delay = 15
+ var/lasercolor = ""
+ var/disabled = 0//A holder for if it needs to be disabled, if true it will not seach for targets, shoot at targets, or move, currently only used for lasertag
+
+
+ var/mob/living/carbon/target
+ var/oldtarget_name
+ var/threatlevel = 0
+ var/target_lastloc //Loc of target when arrested.
+ var/last_found //There's a delay
+ var/declare_arrests = 1 //When making an arrest, should it notify everyone wearing sechuds?
+ var/idcheck = 1 //If true, arrest people with no IDs
+ var/weaponscheck = 1 //If true, arrest people for weapons if they don't have access
+ var/check_records = 1 //Does it check security records?
+ var/arrest_type = 0 //If true, don't handcuff
+ var/projectile = /obj/item/projectile/energy/electrode //Holder for projectile type
+ var/shoot_sound = 'sound/weapons/taser.ogg'
+
+
+/mob/living/simple_animal/bot/ed209/Initialize(mapload,created_name,created_lasercolor)
+ . = ..()
+ if(created_name)
+ name = created_name
+ if(created_lasercolor)
+ lasercolor = created_lasercolor
+ icon_state = "[lasercolor]ed209[on]"
+ set_weapon() //giving it the right projectile and firing sound.
+ spawn(3)
+ var/datum/job/detective/J = new/datum/job/detective
+ access_card.access += J.get_access()
+ prev_access = access_card.access
+
+ if(lasercolor)
+ shot_delay = 6//Longer shot delay because JESUS CHRIST
+ check_records = 0//Don't actively target people set to arrest
+ arrest_type = 1//Don't even try to cuff
+ bot_core.req_access = list(ACCESS_MAINT_TUNNELS, ACCESS_THEATRE)
+ arrest_type = 1
+ if((lasercolor == "b") && (name == "\improper ED-209 Security Robot"))//Picks a name if there isn't already a custome one
+ name = pick("BLUE BALLER","SANIC","BLUE KILLDEATH MURDERBOT")
+ if((lasercolor == "r") && (name == "\improper ED-209 Security Robot"))
+ name = pick("RED RAMPAGE","RED ROVER","RED KILLDEATH MURDERBOT")
+
+ //SECHUD
+ var/datum/atom_hud/secsensor = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
+ secsensor.add_hud_to(src)
+
+/mob/living/simple_animal/bot/ed209/turn_on()
+ . = ..()
+ icon_state = "[lasercolor]ed209[on]"
+ mode = BOT_IDLE
+
+/mob/living/simple_animal/bot/ed209/turn_off()
+ ..()
+ icon_state = "[lasercolor]ed209[on]"
+
+/mob/living/simple_animal/bot/ed209/bot_reset()
+ ..()
+ target = null
+ oldtarget_name = null
+ anchored = FALSE
+ walk_to(src,0)
+ last_found = world.time
+ set_weapon()
+
+/mob/living/simple_animal/bot/ed209/set_custom_texts()
+ text_hack = "You disable [name]'s combat inhibitor."
+ text_dehack = "You restore [name]'s combat inhibitor."
+ text_dehack_fail = "[name] ignores your attempts to restrict him!"
+
+/mob/living/simple_animal/bot/ed209/get_controls(mob/user)
+ var/dat
+ dat += hack(user)
+ dat += showpai(user)
+ dat += text({"
+Security Unit v2.6 controls
+Status: []
+Behaviour controls are [locked ? "locked" : "unlocked"]
+Maintenance panel panel is [open ? "opened" : "closed"]
"},
+
+"[on ? "On" : "Off"]" )
+
+ if(!locked || issilicon(user)|| IsAdminGhost(user))
+ if(!lasercolor)
+ dat += text({"
+Arrest Unidentifiable Persons: []
+Arrest for Unauthorized Weapons: []
+Arrest for Warrant: []
+
+Operating Mode: []
+Report Arrests[]
+Auto Patrol[]"},
+
+"[idcheck ? "Yes" : "No"]",
+"[weaponscheck ? "Yes" : "No"]",
+"[check_records ? "Yes" : "No"]",
+"[arrest_type ? "Detain" : "Arrest"]",
+"[declare_arrests ? "Yes" : "No"]",
+"[auto_patrol ? "On" : "Off"]" )
+
+ return dat
+
+/mob/living/simple_animal/bot/ed209/Topic(href, href_list)
+ if(lasercolor && ishuman(usr))
+ var/mob/living/carbon/human/H = usr
+ if((lasercolor == "b") && (istype(H.wear_suit, /obj/item/clothing/suit/redtag)))//Opposing team cannot operate it
+ return
+ else if((lasercolor == "r") && (istype(H.wear_suit, /obj/item/clothing/suit/bluetag)))
+ return
+ if(..())
+ return 1
+
+ switch(href_list["operation"])
+ if("idcheck")
+ idcheck = !idcheck
+ update_controls()
+ if("weaponscheck")
+ weaponscheck = !weaponscheck
+ update_controls()
+ if("ignorerec")
+ check_records = !check_records
+ update_controls()
+ if("switchmode")
+ arrest_type = !arrest_type
+ update_controls()
+ if("declarearrests")
+ declare_arrests = !declare_arrests
+ update_controls()
+
+/mob/living/simple_animal/bot/ed209/proc/judgement_criteria()
+ var/final = FALSE
+ if(idcheck)
+ final = final|JUDGE_IDCHECK
+ if(check_records)
+ final = final|JUDGE_RECORDCHECK
+ if(weaponscheck)
+ final = final|JUDGE_WEAPONCHECK
+ if(emagged)
+ final = final|JUDGE_EMAGGED
+ //ED209's ignore monkeys
+ final = final|JUDGE_IGNOREMONKEYS
+ return final
+
+/mob/living/simple_animal/bot/ed209/proc/retaliate(mob/living/carbon/human/H)
+ var/judgement_criteria = judgement_criteria()
+ threatlevel = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ threatlevel += 6
+ if(threatlevel >= 4)
+ target = H
+ mode = BOT_HUNT
+
+/mob/living/simple_animal/bot/ed209/attack_hand(mob/living/carbon/human/H)
+ if(H.a_intent == INTENT_HARM)
+ retaliate(H)
+ return ..()
+
+/mob/living/simple_animal/bot/ed209/attackby(obj/item/W, mob/user, params)
+ ..()
+ if(istype(W, /obj/item/weldingtool) && user.a_intent != INTENT_HARM) // Any intent but harm will heal, so we shouldn't get angry.
+ return
+ if(!istype(W, /obj/item/screwdriver) && (!target)) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass.
+ if(W.force && W.damtype != STAMINA)//If force is non-zero and damage type isn't stamina.
+ retaliate(user)
+ if(lasercolor)//To make up for the fact that lasertag bots don't hunt
+ shootAt(user)
+
+/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
+ ..()
+ if(emagged == 2)
+ if(user)
+ to_chat(user, "You short out [src]'s target assessment circuits.")
+ oldtarget_name = user.name
+ audible_message("[src] buzzes oddly!")
+ declare_arrests = 0
+ icon_state = "[lasercolor]ed209[on]"
+ set_weapon()
+
+/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
+ if(istype(Proj , /obj/item/projectile/beam/laser)||istype(Proj, /obj/item/projectile/bullet))
+ if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
+ if(!Proj.nodamage && Proj.damage < src.health)
+ retaliate(Proj.firer)
+ ..()
+
+/mob/living/simple_animal/bot/ed209/handle_automated_action()
+ if(!..())
+ return
+
+ if(disabled)
+ return
+
+ var/judgement_criteria = judgement_criteria()
+ var/list/targets = list()
+ for(var/mob/living/carbon/C in view(7,src)) //Let's find us a target
+ var/threatlevel = 0
+ if((C.stat) || (C.lying))
+ continue
+ threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ //speak(C.real_name + text(": threat: []", threatlevel))
+ if(threatlevel < 4 )
+ continue
+
+ var/dst = get_dist(src, C)
+ if(dst <= 1 || dst > 7)
+ continue
+
+ targets += C
+ if(targets.len>0)
+ var/mob/living/carbon/t = pick(targets)
+ if((t.stat!=2) && (t.lying != 1) && (!t.handcuffed)) //we don't shoot people who are dead, cuffed or lying down.
+ shootAt(t)
+ switch(mode)
+
+ if(BOT_IDLE) // idle
+ walk_to(src,0)
+ if(!lasercolor) //lasertag bots don't want to arrest anyone
+ look_for_perp() // see if any criminals are in range
+ if(!mode && auto_patrol) // still idle, and set to patrol
+ mode = BOT_START_PATROL // switch to patrol mode
+
+ if(BOT_HUNT) // hunting for perp
+ // if can't reach perp for long enough, go idle
+ if(frustration >= 8)
+ walk_to(src,0)
+ back_to_idle()
+
+ if(target) // make sure target exists
+ if(Adjacent(target) && isturf(target.loc)) // if right next to perp
+ stun_attack(target)
+
+ mode = BOT_PREP_ARREST
+ anchored = TRUE
+ target_lastloc = target.loc
+ return
+
+ else // not next to perp
+ var/turf/olddist = get_dist(src, target)
+ walk_to(src, target,1,4)
+ if((get_dist(src, target)) >= (olddist))
+ frustration++
+ else
+ frustration = 0
+ else
+ back_to_idle()
+
+ if(BOT_PREP_ARREST) // preparing to arrest target
+
+ // see if he got away. If he's no no longer adjacent or inside a closet or about to get up, we hunt again.
+ if(!Adjacent(target) || !isturf(target.loc) || target.AmountKnockdown() < 40)
+ back_to_hunt()
+ return
+
+ if(iscarbon(target) && target.canBeHandcuffed())
+ if(!arrest_type)
+ if(!target.handcuffed) //he's not cuffed? Try to cuff him!
+ cuff(target)
+ else
+ back_to_idle()
+ return
+ else
+ back_to_idle()
+ return
+
+ if(BOT_ARREST)
+ if(!target)
+ anchored = FALSE
+ mode = BOT_IDLE
+ last_found = world.time
+ frustration = 0
+ return
+
+ if(target.handcuffed) //no target or target cuffed? back to idle.
+ back_to_idle()
+ return
+
+ if(!Adjacent(target) || !isturf(target.loc) || (target.loc != target_lastloc && target.AmountKnockdown() < 40)) //if he's changed loc and about to get up or not adjacent or got into a closet, we prep arrest again.
+ back_to_hunt()
+ return
+ else
+ mode = BOT_PREP_ARREST
+ anchored = FALSE
+
+ if(BOT_START_PATROL)
+ look_for_perp()
+ start_patrol()
+
+ if(BOT_PATROL)
+ look_for_perp()
+ bot_patrol()
+
+
+ return
+
+/mob/living/simple_animal/bot/ed209/proc/back_to_idle()
+ anchored = FALSE
+ mode = BOT_IDLE
+ target = null
+ last_found = world.time
+ frustration = 0
+ INVOKE_ASYNC(src, .proc/handle_automated_action) //ensure bot quickly responds
+
+/mob/living/simple_animal/bot/ed209/proc/back_to_hunt()
+ anchored = FALSE
+ frustration = 0
+ mode = BOT_HUNT
+ INVOKE_ASYNC(src, .proc/handle_automated_action) //ensure bot quickly responds
+
+// look for a criminal in view of the bot
+
+/mob/living/simple_animal/bot/ed209/proc/look_for_perp()
+ if(disabled)
+ return
+ anchored = FALSE
+ threatlevel = 0
+ var/judgement_criteria = judgement_criteria()
+ for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
+ if((C.stat) || (C.handcuffed))
+ continue
+
+ if((C.name == oldtarget_name) && (world.time < last_found + 100))
+ continue
+
+ threatlevel = C.assess_threat(judgement_criteria, lasercolor, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+
+ if(!threatlevel)
+ continue
+
+ else if(threatlevel >= 4)
+ target = C
+ oldtarget_name = C.name
+ speak("Level [threatlevel] infraction alert!")
+ playsound(loc, pick('sound/voice/ed209_20sec.ogg', 'sound/voice/edplaceholder.ogg'), 50, 0)
+ visible_message("[src] points at [C.name]!")
+ mode = BOT_HUNT
+ spawn(0)
+ handle_automated_action() // ensure bot quickly responds to a perp
+ break
+ else
+ continue
+
+/mob/living/simple_animal/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item)
+ if(slot_item && slot_item.needs_permit)
+ return 1
+ return 0
+
+/mob/living/simple_animal/bot/ed209/explode()
+ walk_to(src,0)
+ visible_message("[src] blows apart!")
+ var/turf/Tsec = get_turf(src)
+
+ var/obj/item/ed209_assembly/Sa = new /obj/item/ed209_assembly(Tsec)
+ Sa.build_step = 1
+ Sa.add_overlay("hs_hole")
+ Sa.created_name = name
+ new /obj/item/device/assembly/prox_sensor(Tsec)
+
+ if(!lasercolor)
+ var/obj/item/gun/energy/e_gun/advtaser/G = new /obj/item/gun/energy/e_gun/advtaser(Tsec)
+ G.cell.charge = 0
+ G.update_icon()
+ else if(lasercolor == "b")
+ var/obj/item/gun/energy/laser/bluetag/G = new /obj/item/gun/energy/laser/bluetag(Tsec)
+ G.cell.charge = 0
+ G.update_icon()
+ else if(lasercolor == "r")
+ var/obj/item/gun/energy/laser/redtag/G = new /obj/item/gun/energy/laser/redtag(Tsec)
+ G.cell.charge = 0
+ G.update_icon()
+
+ if(prob(50))
+ new /obj/item/bodypart/l_leg/robot(Tsec)
+ if(prob(25))
+ new /obj/item/bodypart/r_leg/robot(Tsec)
+ if(prob(25))//50% chance for a helmet OR vest
+ if(prob(50))
+ new /obj/item/clothing/head/helmet(Tsec)
+ else
+ if(!lasercolor)
+ new /obj/item/clothing/suit/armor/vest(Tsec)
+ if(lasercolor == "b")
+ new /obj/item/clothing/suit/bluetag(Tsec)
+ if(lasercolor == "r")
+ new /obj/item/clothing/suit/redtag(Tsec)
+
+ do_sparks(3, TRUE, src)
+
+ new /obj/effect/decal/cleanable/oil(loc)
+ ..()
+
+/mob/living/simple_animal/bot/ed209/proc/set_weapon() //used to update the projectile type and firing sound
+ shoot_sound = 'sound/weapons/laser.ogg'
+ if(emagged == 2)
+ if(lasercolor)
+ projectile = /obj/item/projectile/beam/lasertag
+ else
+ projectile = /obj/item/projectile/beam
+ else
+ if(!lasercolor)
+ shoot_sound = 'sound/weapons/taser.ogg'
+ projectile = /obj/item/projectile/energy/electrode
+ else if(lasercolor == "b")
+ projectile = /obj/item/projectile/beam/lasertag/bluetag
+ else if(lasercolor == "r")
+ projectile = /obj/item/projectile/beam/lasertag/redtag
+
+/mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target)
+ if(lastfired && world.time - lastfired < shot_delay)
+ return
+ lastfired = world.time
+ var/turf/T = loc
+ var/turf/U = get_turf(target)
+ if(!U)
+ return
+ if(!isturf(T))
+ return
+
+ if(!projectile)
+ return
+
+ var/obj/item/projectile/A = new projectile (loc)
+ playsound(loc, shoot_sound, 50, 1)
+ A.current = U
+ A.yo = U.y - T.y
+ A.xo = U.x - T.x
+ A.fire()
+
+/mob/living/simple_animal/bot/ed209/attack_alien(mob/living/carbon/alien/user)
+ ..()
+ if(!isalien(target))
+ target = user
+ mode = BOT_HUNT
+
+
+/mob/living/simple_animal/bot/ed209/emp_act(severity)
+
+ if(severity==2 && prob(70))
+ ..(severity-1)
+ else
+ new /obj/effect/temp_visual/emp(loc)
+ var/list/mob/living/carbon/targets = new
+ for(var/mob/living/carbon/C in view(12,src))
+ if(C.stat==DEAD)
+ continue
+ targets += C
+ if(targets.len)
+ if(prob(50))
+ var/mob/toshoot = pick(targets)
+ if(toshoot)
+ targets-=toshoot
+ if(prob(50) && emagged < 2)
+ emagged = 2
+ set_weapon()
+ shootAt(toshoot)
+ emagged = FALSE
+ set_weapon()
+ else
+ shootAt(toshoot)
+ else if(prob(50))
+ if(targets.len)
+ var/mob/toarrest = pick(targets)
+ if(toarrest)
+ target = toarrest
+ mode = BOT_HUNT
+
+
+/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
+ if(!disabled)
+ var/lasertag_check = 0
+ if((lasercolor == "b"))
+ if(istype(Proj, /obj/item/projectile/beam/lasertag/redtag))
+ lasertag_check++
+ else if((lasercolor == "r"))
+ if(istype(Proj, /obj/item/projectile/beam/lasertag/bluetag))
+ lasertag_check++
+ if(lasertag_check)
+ icon_state = "[lasercolor]ed2090"
+ disabled = 1
+ target = null
+ spawn(100)
+ disabled = 0
+ icon_state = "[lasercolor]ed2091"
+ return 1
+ else
+ ..(Proj)
+ else
+ ..(Proj)
+
+/mob/living/simple_animal/bot/ed209/bluetag
+ lasercolor = "b"
+
+/mob/living/simple_animal/bot/ed209/redtag
+ lasercolor = "r"
+
+/mob/living/simple_animal/bot/ed209/UnarmedAttack(atom/A)
+ if(!on)
+ return
+ if(iscarbon(A))
+ var/mob/living/carbon/C = A
+ if(!C.IsStun() || arrest_type)
+ stun_attack(A)
+ else if(C.canBeHandcuffed() && !C.handcuffed)
+ cuff(A)
+ else
+ ..()
+
+/mob/living/simple_animal/bot/ed209/RangedAttack(atom/A)
+ if(!on)
+ return
+ shootAt(A)
+
+/mob/living/simple_animal/bot/ed209/proc/stun_attack(mob/living/carbon/C)
+ playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
+ icon_state = "[lasercolor]ed209-c"
+ spawn(2)
+ icon_state = "[lasercolor]ed209[on]"
+ var/threat = 5
+ C.Knockdown(100)
+ C.stuttering = 5
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ var/judgement_criteria = judgement_criteria()
+ threat = H.assess_threat(judgement_criteria, weaponcheck=CALLBACK(src, .proc/check_for_weapons))
+ add_logs(src,C,"stunned")
+ if(declare_arrests)
+ var/area/location = get_area(src)
+ speak("[arrest_type ? "Detaining" : "Arresting"] level [threat] scumbag [C] in [location].", radio_channel)
+ C.visible_message("[src] has stunned [C]!",\
+ "[src] has stunned you!")
+
+/mob/living/simple_animal/bot/ed209/proc/cuff(mob/living/carbon/C)
+ mode = BOT_ARREST
+ playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
+ C.visible_message("[src] is trying to put zipties on [C]!",\
+ "[src] is trying to put zipties on you!")
+
+ spawn(60)
+ if( !Adjacent(C) || !isturf(C.loc) ) //if he's in a closet or not adjacent, we cancel cuffing.
+ return
+ if(!C.handcuffed)
+ C.handcuffed = new /obj/item/restraints/handcuffs/cable/zipties/used(C)
+ C.update_handcuffed()
+ back_to_idle()
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index 1b7647d412..9f86737717 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -39,7 +39,7 @@
#define TILE_EMAG 7
/mob/living/simple_animal/bot/floorbot/Initialize()
- ..()
+ . = ..()
update_icon()
var/datum/job/engineer/J = new/datum/job/engineer
access_card.access += J.get_access()
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 42bf87421b..4007822ebb 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -47,7 +47,7 @@
var/bloodiness = 0
/mob/living/simple_animal/bot/mulebot/Initialize()
- ..()
+ . = ..()
wires = new /datum/wires/mulebot(src)
var/datum/job/cargo_tech/J = new/datum/job/cargo_tech
access_card.access = J.get_access()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index ee8a25b679..49ef79a4d9 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -32,7 +32,7 @@
devourable = TRUE
/mob/living/simple_animal/pet/cat/Initialize()
- ..()
+ . = ..()
verbs += /mob/living/proc/lay_down
/mob/living/simple_animal/pet/cat/update_canmove()
@@ -92,7 +92,7 @@
icon_living = "original"
icon_dead = "original_dead"
Read_Memory()
- ..()
+ . = ..()
/mob/living/simple_animal/pet/cat/Runtime/Life()
if(!cats_deployed && SSticker.current_state >= GAME_STATE_SETTING_UP)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 7d7ec3db82..d920bf63b3 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -33,7 +33,7 @@
flavortext = null
/mob/living/simple_animal/drone/syndrone/Initialize()
- ..()
+ . = ..()
internal_storage.hidden_uplink.telecrystals = 10
/mob/living/simple_animal/drone/syndrone/Login()
@@ -46,7 +46,7 @@
default_storage = /obj/item/device/radio/uplink/nuclear
/mob/living/simple_animal/drone/syndrone/badass/Initialize()
- ..()
+ . = ..()
internal_storage.hidden_uplink.telecrystals = 30
var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(src)
W.implant(src)
@@ -55,7 +55,7 @@
default_hatmask = /obj/item/clothing/head/chameleon/drone
/mob/living/simple_animal/drone/snowflake/Initialize()
- ..()
+ . = ..()
desc += " This drone appears to have a complex holoprojector built on its 'head'."
/obj/item/drone_shell/syndrone
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index c95cbb116a..6983bed378 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -27,7 +27,7 @@
devourable = TRUE
/mob/living/simple_animal/mouse/Initialize()
- ..()
+ . = ..()
if(!body_color)
body_color = pick( list("brown","gray","white") )
icon_state = "mouse_[body_color]"
diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm
index b2c14faaa2..3200c8b7d7 100644
--- a/code/modules/mob/living/simple_animal/friendly/pet.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pet.dm
@@ -31,7 +31,7 @@
..()
/mob/living/simple_animal/pet/Initialize()
- ..()
+ . = ..()
if(pcollar)
pcollar = new(src)
regenerate_icons()
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 637b0f456a..91fe96ca86 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
GLOB.parasites += src
setthemename(theme)
- ..()
+ . = ..()
/mob/living/simple_animal/hostile/guardian/med_hud_set_health()
if(!QDELETED(summoner))
@@ -659,7 +659,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians
name = "holoparasite injector kit"
/obj/item/storage/box/syndie_kit/guardian/Initialize()
- ..()
+ . = ..()
new /obj/item/guardiancreator/tech/choose/traitor(src)
new /obj/item/paper/guides/antag/guardian(src)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
index cc81367196..9ae70745cf 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
@@ -12,7 +12,7 @@
/mob/living/simple_animal/hostile/boss/Initialize()
- ..()
+ . = ..()
atb = new()
atb.point_regen_delay = point_regen_delay
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index c23dc13a15..467bd13c65 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -896,7 +896,7 @@
else
speak += pick("...alive?", "This isn't parrot heaven!", "I live, I die, I live again!", "The void fades!")
- ..()
+ . = ..()
/mob/living/simple_animal/parrot/Poly/Life()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)