diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm
index fd79d83dc5..92dd6f5d51 100644
--- a/code/ZAS/Phoron.dm
+++ b/code/ZAS/Phoron.dm
@@ -95,14 +95,14 @@ obj/var/phoronproof = 0
return
//Burn skin if exposed.
- if(vsc.plc.SKIN_BURNS)
+ if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron"))
if(!pl_head_protected() || !pl_suit_protected())
burn_skin(0.75)
if(prob(20)) src << "Your skin burns!"
updatehealth()
//Burn eyes if exposed.
- if(vsc.plc.EYE_BURNS)
+ if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron"))
if(!head)
if(!wear_mask)
burn_eyes()
@@ -118,22 +118,12 @@ obj/var/phoronproof = 0
burn_eyes()
//Genetic Corruption
- if(vsc.plc.GENETIC_CORRUPTION)
+ if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron"))
if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION)
randmutb(src)
src << "High levels of toxins cause you to spontaneously mutate!"
domutcheck(src,null)
-/mob/living/carbon/human/vox/pl_effects()
- //Handles all the bad things phoron can do to Vox.
-
- //Contamination
- if(vsc.plc.CLOTH_CONTAMINATION) contaminate()
-
- //Anything else requires them to not be dead.
- if(stat >= 2)
- return
-
/mob/living/carbon/human/proc/burn_eyes()
var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES]
if(E)
diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm
index 11dc34c404..90d05fbbdc 100644
--- a/code/datums/supplypacks/robotics.dm
+++ b/code/datums/supplypacks/robotics.dm
@@ -39,7 +39,7 @@
name = "All robolimb blueprints"
contains = list(
/obj/item/weapon/disk/limb/bishop,
- /obj/item/weapon/disk/limb/hesphiastos,
+ /obj/item/weapon/disk/limb/hephaestus,
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/veymed,
/obj/item/weapon/disk/limb/wardtakahashi,
@@ -68,6 +68,13 @@
containername = "Robolimb blueprints (Xion)"
access = access_robotics
+/datum/supply_packs/robotics/robolimbs/hephaestus
+ name = "Hephaistos robolimb blueprints"
+ contains = list(/obj/item/weapon/disk/limb/hephaestus)
+ containertype = /obj/structure/closet/crate/secure/gear
+ containername = "Robolimb blueprints (Hephaestus)"
+ access = access_robotics
+
/datum/supply_packs/robotics/robolimbs/wardtakahashi
name = "Ward-Takahashi robolimb blueprints"
contains = list(/obj/item/weapon/disk/limb/wardtakahashi)
diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm
index 9983d30501..ef79a5712b 100644
--- a/code/datums/supplypacks/science_vr.dm
+++ b/code/datums/supplypacks/science_vr.dm
@@ -14,7 +14,7 @@
name = "Advanced Robolimb Blueprints"
contains = list(
/obj/item/weapon/disk/limb/bishop,
- /obj/item/weapon/disk/limb/hesphiastos,
+ /obj/item/weapon/disk/limb/hephaestus,
/obj/item/weapon/disk/limb/morpheus,
/obj/item/weapon/disk/limb/veymed,
/obj/item/weapon/disk/limb/wardtakahashi,
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 4c48b84532..b76620fa95 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -125,8 +125,17 @@
if(A:lying) continue
src.throw_impact(A,speed)
if(isobj(A))
- if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement
- src.throw_impact(A,speed)
+ if(!A.density || A.throwpass)
+ continue
+ // Special handling of windows, which are dense but block only from some directions
+ if(istype(A, /obj/structure/window))
+ var/obj/structure/window/W = A
+ if (!W.is_full_window() && !(turn(src.last_move, 180) & A.dir))
+ continue
+ // Same thing for (closed) windoors, which have the same problem
+ else if(istype(A, /obj/machinery/door/window) && !(turn(src.last_move, 180) & A.dir))
+ continue
+ src.throw_impact(A,speed)
/atom/movable/proc/throw_at(atom/target, range, speed, thrower)
if(!target || !src) return 0
diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm
index 37614b4d20..82d3ecc5dd 100644
--- a/code/game/gamemodes/events.dm
+++ b/code/game/gamemodes/events.dm
@@ -350,6 +350,11 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is
M << "
"
M.add_ion_law("THE STATION IS [who2pref] [who2]")
+ if(botEmagChance)
+ for(var/mob/living/bot/bot in machines)
+ if(prob(botEmagChance))
+ bot.emag_act(1)
+
/*
var/apcnum = 0
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 5cf1c188d8..dcce5fb938 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -348,7 +348,7 @@ update_flag
"\[N2O\]" = "redws", \
"\[N2\]" = "red", \
"\[O2\]" = "blue", \
- "\[Phoron\]" = "purple", \
+ "\[Phoron\]" = "orangeps", \
"\[CO2\]" = "black", \
"\[Air\]" = "grey", \
"\[CAUTION\]" = "yellow", \
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index fe5cac9c44..8700caf785 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -1,52 +1,45 @@
// Navigation beacon for AI robots
// Functions as a transponder: looks for incoming signal matching
-var/global/list/navbeacons // no I don't like putting this in, but it will do for now
+var/global/list/navbeacons = list() // no I don't like putting this in, but it will do for now
/obj/machinery/navbeacon
icon = 'icons/obj/objects.dmi'
icon_state = "navbeacon0-f"
name = "navigation beacon"
- desc = "A radio beacon used for bot navigation."
+ desc = "A beacon used for bot navigation."
level = 1 // underfloor
layer = 2.5
anchored = 1
var/open = 0 // true if cover is open
var/locked = 1 // true if controls are locked
- var/freq = 1445 // radio frequency
+ var/freq = null // DEPRECATED we don't use radios anymore!
var/location = "" // location response text
- var/list/codes // assoc. list of transponder codes
- var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value"
+ var/codes_txt // DEPRECATED codes as set on map: "tag1;tag2" or "tag1=value;tag2=value"
+ var/list/codes = list() // assoc. list of transponder codes
req_access = list(access_engine)
/obj/machinery/navbeacon/New()
..()
-
- set_codes()
+ set_codes_from_txt(codes_txt)
+ if(freq)
+ warning("[src] at [x],[y],[z] has deprecated var freq=[freq]. Replace it with proper type.")
var/turf/T = loc
hide(!T.is_plating())
-
- // add beacon to MULE bot beacon list
- if(freq == 1400)
- if(!navbeacons)
- navbeacons = new()
- navbeacons += src
-
-
- spawn(5) // must wait for map loading to finish
- if(radio_controller)
- radio_controller.add_object(src, freq, RADIO_NAVBEACONS)
+ navbeacons += src
// set the transponder codes assoc list from codes_txt
-/obj/machinery/navbeacon/proc/set_codes()
+// DEPRECATED - This is kept only for compatibilty with old map files! Do not use this!
+// Instead, you should replace the map instance with one of the appropriate navbeacon subtypes.
+// See the bottom of this file for a list of subtypes, make your own examples if your map needs more
+/obj/machinery/navbeacon/proc/set_codes_from_txt()
if(!codes_txt)
return
+ warning("[src] at [x],[y],[z] in [get_area(src)] is using the deprecated 'codes_txt' mapping method. Replace it with proper type.")
- codes = new()
-
+ codes = list()
var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons
-
for(var/e in entries)
var/index = findtext(e, "=") // format is "key=value"
if(index)
@@ -56,6 +49,8 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do
else
codes[e] = "1"
+/obj/machinery/navbeacon/hides_under_flooring()
+ return 1
// called when turf state changes
// hide the object if turf is intact
@@ -73,38 +68,6 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do
else
icon_state = "[state]"
-
-// look for a signal of the form "findbeacon=X"
-// where X is any
-// or the location
-// or one of the set transponder keys
-// if found, return a signal
-/obj/machinery/navbeacon/receive_signal(datum/signal/signal)
-
- var/request = signal.data["findbeacon"]
- if(request && ((request in codes) || request == "any" || request == location))
- spawn(1)
- post_signal()
-
-// return a signal giving location and transponder codes
-
-/obj/machinery/navbeacon/proc/post_signal()
-
- var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq)
-
- if(!frequency) return
-
- var/datum/signal/signal = new()
- signal.source = src
- signal.transmission_method = 1
- signal.data["beacon"] = location
-
- for(var/key in codes)
- signal.data[key] = codes[key]
-
- frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
-
-
/obj/machinery/navbeacon/attackby(var/obj/item/I, var/mob/user)
var/turf/T = loc
if(!T.is_plating())
@@ -117,7 +80,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do
updateicon()
- else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
+ else if(I.GetID())
if(open)
if(allowed(user))
locked = !locked
@@ -153,8 +116,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do
if(locked && !ai)
t = {"Navigation Beacon
-(swipe card to unlock controls)
-Frequency: [format_frequency(freq)]
+(swipe card to unlock controls)
Location: [location ? location : "(none)"]
Transponder Codes:"}
@@ -165,14 +127,7 @@ Transponder Codes:"}
else
t = {"Navigation Beacon
-(swipe card to lock controls)
-Frequency:
--
--
-[format_frequency(freq)]
-+
-+
-
+(swipe card to lock controls)
Location: [location ? location : "(none)"]
Transponder Codes:"}
@@ -195,11 +150,7 @@ Transponder Codes:"}
if(open && !locked)
usr.set_machine(src)
- if(href_list["freq"])
- freq = sanitize_frequency(freq + text2num(href_list["freq"]))
- updateDialog()
-
- else if(href_list["locedit"])
+ if(href_list["locedit"])
var/newloc = sanitize(input("Enter New Location", "Navigation Beacon", location) as text|null)
if(newloc)
location = newloc
@@ -248,6 +199,41 @@ Transponder Codes:"}
/obj/machinery/navbeacon/Destroy()
navbeacons.Remove(src)
- if(radio_controller)
- radio_controller.remove_object(src, freq)
+ ..()
+
+
+//
+// Nav Beacon Mapping
+// These subtypes are what you should actually put into maps! they will make your life much easier.
+//
+// Developer Note: navbeacons do not HAVE to use these subtypes. They are purely for mapping convenience.
+// You can feel free to construct them in-game as just /obj/machinery/navbeacon and they will work just
+// fine, and you can define your own specific types for every instance on map if you want (BayStation does)
+// This design is a compromise that means you can do mapping without every single one being its own type
+// but with it still being easy to map ~ Leshana
+//
+
+// Mulebot delivery destinations
+
+/obj/machinery/navbeacon/delivery/north
+ codes = list("delivery" = 1, "dir" = NORTH)
+
+/obj/machinery/navbeacon/delivery/south
+ codes = list("delivery" = 1, "dir" = SOUTH)
+
+/obj/machinery/navbeacon/delivery/east
+ codes = list("delivery" = 1, "dir" = EAST)
+
+/obj/machinery/navbeacon/delivery/west
+ codes = list("delivery" = 1, "dir" = WEST)
+
+
+// For part of the patrol route
+// You MUST set "location"
+// You MUST set "next_patrol"
+/obj/machinery/navbeacon/patrol
+ var/next_patrol
+
+/obj/machinery/navbeacon/patrol/New()
+ codes = list("patrol" = 1, "next_patrol" = next_patrol)
..()
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 610746339b..485ea6987b 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -333,7 +333,7 @@ steam.start() -- spawns the effect
spawn(0)
var/turf/T = get_turf(src.holder)
if(T != src.oldposition)
- if(istype(T, /turf/simulated))
+ if(isturf(T))
var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition)
src.oldposition = T
I.set_dir(src.holder.dir)
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 60bb06b5d5..8598a035c5 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -213,6 +213,17 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
update_icon()
ui_interact(user)
+// Proc: MouseDrop()
+//Same thing PDAs do
+/obj/item/device/communicator/MouseDrop(obj/over_object as obj)
+ var/mob/M = usr
+ if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
+ return
+ if(!istype(over_object, /obj/screen))
+ return attack_self(M)
+ return
+
+
// Proc: attack_ghost()
// Parameters: 1 (user - the ghost clicking on the device)
// Description: Recreates the known_devices list, so that the ghost looking at the device can see themselves, then calls ..() so that NanoUI appears.
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 39f5e19693..0ff657e9cc 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -104,7 +104,6 @@
name = "phoron tank"
desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable."
icon_state = "phoron_vox"
- item_state = "oxygen_fr"
gauge_icon = null
flags = CONDUCT
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 1e22826d0b..4c702038a9 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -86,6 +86,12 @@
"admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\
"director", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno")
+/datum/event/ionstorm/tick()
+ if(botEmagChance)
+ for(var/mob/living/bot/bot in world)
+ if(prob(botEmagChance))
+ bot.emag_act(1)
+
/datum/event/ionstorm/end()
spawn(rand(5000,8000))
if(prob(50))
diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm
index 0ad82ae384..cb73171c7e 100644
--- a/code/modules/mob/living/bot/bot.dm
+++ b/code/modules/mob/living/bot/bot.dm
@@ -27,7 +27,7 @@
var/turf/obstacle = null
var/wait_if_pulled = 0 // Only applies to moving to the target
- var/will_patrol = 0 // Not a setting - whether or no this type of bots patrols at all
+ var/will_patrol = 0 // If set to 1, will patrol, duh
var/patrol_speed = 1 // How many times per tick we move when patrolling
var/target_speed = 2 // Ditto for chasing the target
var/min_target_dist = 1 // How close we try to get to the target
@@ -49,7 +49,11 @@
access_scanner.req_access = req_access.Copy()
access_scanner.req_one_access = req_one_access.Copy()
- turn_on()
+// Make sure mapped in units start turned on.
+/mob/living/bot/initialize()
+ ..()
+ if(on)
+ turn_on() // Update lights and other stuff
/mob/living/bot/Life()
..()
@@ -61,7 +65,8 @@
paralysis = 0
if(on && !client && !busy)
- handleAI()
+ spawn(0)
+ handleAI()
/mob/living/bot/updatehealth()
if(status_flags & GODMODE)
@@ -145,20 +150,18 @@
handleRangedTarget()
if(!wait_if_pulled || !pulledby)
for(var/i = 1 to target_speed)
+ sleep(20 / (target_speed + 1))
stepToTarget()
- if(i < target_speed)
- sleep(20 / target_speed)
if(max_frustration && frustration > max_frustration * target_speed)
handleFrustrated(1)
else
resetTarget()
lookForTargets()
if(will_patrol && !pulledby && !target)
- if(patrol_path.len)
+ if(patrol_path && patrol_path.len)
for(var/i = 1 to patrol_speed)
+ sleep(20 / (patrol_speed + 1))
handlePatrol()
- if(i < patrol_speed)
- sleep(20 / patrol_speed)
if(max_frustration && frustration > max_frustration * patrol_speed)
handleFrustrated(0)
else
@@ -219,6 +222,25 @@
return
/mob/living/bot/proc/getPatrolTurf()
+ var/minDist = INFINITY
+ var/obj/machinery/navbeacon/targ = locate() in get_turf(src)
+
+ if(!targ)
+ for(var/obj/machinery/navbeacon/N in navbeacons)
+ if(!N.codes["patrol"])
+ continue
+ if(get_dist(src, N) < minDist)
+ minDist = get_dist(src, N)
+ targ = N
+
+ if(targ && targ.codes["next_patrol"])
+ for(var/obj/machinery/navbeacon/N in navbeacons)
+ if(N.location == targ.codes["next_patrol"])
+ targ = N
+ break
+
+ if(targ)
+ return get_turf(targ)
return null
/mob/living/bot/proc/handleIdle()
@@ -255,15 +277,16 @@
on = 1
set_light(light_strength)
update_icons()
+ resetTarget()
+ patrol_path = list()
+ ignore_list = list()
return 1
/mob/living/bot/proc/turn_off()
on = 0
+ busy = 0 // If ever stuck... reboot!
set_light(0)
update_icons()
- resetTarget()
- patrol_path = list()
- ignore_list = list()
/mob/living/bot/proc/explode()
qdel(src)
diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm
index 779d912cf3..d4cb723861 100644
--- a/code/modules/mob/living/bot/cleanbot.dm
+++ b/code/modules/mob/living/bot/cleanbot.dm
@@ -12,7 +12,6 @@
var/cleaning = 0
var/screwloose = 0
var/oddbutton = 0
- var/should_patrol = 0
var/blood = 1
var/list/target_types = list()
@@ -32,9 +31,11 @@
if(oddbutton && prob(5)) // Make a big mess
visible_message("Something flies out of [src]. He seems to be acting oddly.")
var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(loc)
- ignore_list += gib
+ // TODO - I have a feeling weakrefs will not work in ignore_list, verify this ~Leshana
+ var/weakref/g = weakref(gib)
+ ignore_list += g
spawn(600)
- ignore_list -= gib
+ ignore_list -= g
/mob/living/bot/cleanbot/lookForTargets()
for(var/obj/effect/decal/cleanable/D in view(world.view, src)) // There was some odd code to make it start with nearest decals, it's unnecessary, this works
@@ -110,7 +111,7 @@
dat += "Maintenance panel is [open ? "opened" : "closed"]"
if(!locked || issilicon(user))
dat += "
Cleans Blood: [blood ? "Yes" : "No"]
"
- dat += "
Patrol station: [should_patrol ? "Yes" : "No"]
"
+ dat += "
Patrol station: [will_patrol ? "Yes" : "No"]
"
if(open && !locked)
dat += "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]
"
dat += "Weird button pressed: [oddbutton ? "Yes" : "No"]"
@@ -134,7 +135,7 @@
blood = !blood
get_targets()
if("patrol")
- should_patrol = !should_patrol
+ will_patrol = !will_patrol
patrol_path = null
if("screw")
screwloose = !screwloose
diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm
index 09320fd323..1e23af341c 100644
--- a/code/modules/mob/living/bot/farmbot.dm
+++ b/code/modules/mob/living/bot/farmbot.dm
@@ -170,7 +170,7 @@
visible_message("[src] starts [T.dead? "removing the plant from" : "harvesting"] \the [A].")
busy = 1
- if(do_after(src, 30))
+ if(do_after(src, 30, A))
visible_message("[src] [T.dead? "removes the plant from" : "harvests"] \the [A].")
T.attack_hand(src)
if(FARMBOT_WATER)
@@ -179,7 +179,7 @@
visible_message("[src] starts watering \the [A].")
busy = 1
- if(do_after(src, 30))
+ if(do_after(src, 30, A))
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
visible_message("[src] waters \the [A].")
tank.reagents.trans_to(T, 100 - T.waterlevel)
@@ -198,7 +198,7 @@
visible_message("[src] starts fertilizing \the [A].")
busy = 1
- if(do_after(src, 30))
+ if(do_after(src, 30, A))
visible_message("[src] fertilizes \the [A].")
T.reagents.add_reagent("ammonia", 10)
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index 2259515941..323d2909fb 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -1,3 +1,9 @@
+// Configure whether or not floorbot will fix hull breaches.
+// This can be a problem if it tries to pave over space or shuttles. That should be fixed but...
+// If it can see space outside windows, it can be laggy since it keeps wondering if it should fix them.
+// Therefore that functionality is disabled for now. But it can be turned on by uncommenting this.
+// #define FLOORBOT_PATCHES_HOLES 1
+
/mob/living/bot/floorbot
name = "Floorbot"
desc = "A little floor repairing robot, he looks so excited!"
@@ -25,7 +31,7 @@
/mob/living/bot/floorbot/attack_hand(var/mob/user)
user.set_machine(src)
- var/dat
+ var/list/dat = list()
dat += "Automatic Station Floor Repairer v1.0
"
dat += "Status: [src.on ? "On" : "Off"]
"
dat += "Maintenance panel is [open ? "opened" : "closed"]
"
@@ -41,9 +47,9 @@
else
bmode = "Disabled"
dat += "
Bridge Mode : [bmode]
"
-
- user << browse("Repairbot v1.0 controls[dat]", "window=autorepair")
- onclose(user, "autorepair")
+ var/datum/browser/popup = new(user, "autorepair", "Repairbot v1.1 controls")
+ popup.set_content(jointext(dat,null))
+ popup.open()
return
/mob/living/bot/floorbot/emag_act(var/remaining_charges, var/mob/user)
@@ -115,23 +121,24 @@
target = T
return
T = get_step(T, targetdirection)
+ return // In bridge mode we don't want to step off that line even to eat plates!
- else // Fixing floors
- for(var/turf/space/T in view(src)) // Breaches are of higher priority
- if(confirmTarget(T))
- target = T
- return
+#ifdef FLOORBOT_PATCHES_HOLES
+ for(var/turf/space/T in view(src)) // Breaches are of higher priority
+ if(confirmTarget(T))
+ target = T
+ return
- for(var/turf/simulated/mineral/floor/T in view(src)) // Asteroids are of smaller priority
- if(confirmTarget(T))
- target = T
- return
-
- if(improvefloors)
- for(var/turf/simulated/floor/T in view(src))
- if(confirmTarget(T))
- target = T
- return
+ for(var/turf/simulated/mineral/floor/T in view(src)) // Asteroids are of smaller priority
+ if(confirmTarget(T))
+ target = T
+ return
+#endif
+ // Look for broken floors even if we aren't improvefloors
+ for(var/turf/simulated/floor/T in view(src))
+ if(confirmTarget(T))
+ target = T
+ return
if(amount < maxAmount && (eattiles || maketiles))
for(var/obj/item/stack/S in view(src))
@@ -148,7 +155,11 @@
if(istype(A, /obj/item/stack/material/steel))
return (amount < maxAmount && maketiles)
- if(A.loc.name == "Space")
+ // Don't pave over all of space, build there only if in bridge mode
+ if(!targetdirection && istype(A.loc, /area/space)) // Note name == "Space" does not work!
+ return 0
+
+ if(istype(A.loc, /area/shuttle)) // Do NOT mess with shuttle drop zones
return 0
if(emagged)
@@ -157,14 +168,16 @@
if(!amount)
return 0
+#ifdef FLOORBOT_PATCHES_HOLES
if(istype(A, /turf/space))
return 1
if(istype(A, /turf/simulated/mineral/floor))
return 1
+#endif
var/turf/simulated/floor/T = A
- return (istype(T) && improvefloors && !T.flooring && (get_turf(T) == loc || prob(40)))
+ return (istype(T) && (T.broken || T.burnt || (improvefloors && !T.flooring)) && (get_turf(T) == loc || prob(40)))
/mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity)
if(!..())
@@ -181,12 +194,12 @@
busy = 1
update_icons()
if(F.flooring)
- visible_message("[src] begins to tear the floor tile from the floor!")
+ visible_message("\The [src] begins to tear the floor tile from the floor!")
if(do_after(src, 50))
F.break_tile_to_plating()
addTiles(1)
else
- visible_message("[src] begins to tear through the floor!")
+ visible_message("\The [src] begins to tear through the floor!")
if(do_after(src, 150)) // Extra time because this can and will kill.
F.ReplaceWithLattice()
addTiles(1)
@@ -201,7 +214,7 @@
return
busy = 1
update_icons()
- visible_message("[src] begins to repair the hole.")
+ visible_message("\The [src] begins to repair the hole.")
if(do_after(src, 50))
if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs
var/obj/item/I
@@ -215,10 +228,20 @@
update_icons()
else if(istype(A, /turf/simulated/floor))
var/turf/simulated/floor/F = A
- if(!F.flooring && amount)
+ if(F.broken || F.burnt)
busy = 1
update_icons()
- visible_message("[src] begins to improve the floor.")
+ visible_message("\The [src] begins to remove the broken floor.")
+ if(do_after(src, 50, F))
+ if(F.broken || F.burnt)
+ F.make_plating()
+ target = null
+ busy = 0
+ update_icons()
+ else if(!F.flooring && amount)
+ busy = 1
+ update_icons()
+ visible_message("\The [src] begins to improve the floor.")
if(do_after(src, 50))
if(!F.flooring)
F.set_flooring(get_flooring_data(floor_build_type))
@@ -228,7 +251,7 @@
update_icons()
else if(istype(A, /obj/item/stack/tile/floor) && amount < maxAmount)
var/obj/item/stack/tile/floor/T = A
- visible_message("[src] begins to collect tiles.")
+ visible_message("\The [src] begins to collect tiles.")
busy = 1
update_icons()
if(do_after(src, 20))
@@ -242,7 +265,7 @@
else if(istype(A, /obj/item/stack/material) && amount + 4 <= maxAmount)
var/obj/item/stack/material/M = A
if(M.get_material_name() == DEFAULT_WALL_MATERIAL)
- visible_message("[src] begins to make tiles.")
+ visible_message("\The [src] begins to make tiles.")
busy = 1
update_icons()
if(do_after(50))
@@ -252,7 +275,7 @@
/mob/living/bot/floorbot/explode()
turn_off()
- visible_message("[src] blows apart!")
+ visible_message("\The [src] blows apart!")
var/turf/Tsec = get_turf(src)
var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec)
@@ -353,4 +376,4 @@
return
if(!in_range(src, user) && loc != user)
return
- created_name = t
\ No newline at end of file
+ created_name = t
diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm
index c330e0efc0..2079f77a35 100644
--- a/code/modules/mob/living/bot/mulebot.dm
+++ b/code/modules/mob/living/bot/mulebot.dm
@@ -130,10 +130,7 @@
if("sethome")
var/new_dest
- var/list/beaconlist = new()
- for(var/obj/machinery/navbeacon/N in navbeacons)
- beaconlist.Add(N.location)
- beaconlist[N.location] = N
+ var/list/beaconlist = GetBeaconList()
if(beaconlist.len)
new_dest = input("Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", null) in null|beaconlist
else
@@ -168,10 +165,7 @@
targetName = "Home"
if("SetD")
var/new_dest
- var/list/beaconlist = new()
- for(var/obj/machinery/navbeacon/N in navbeacons)
- beaconlist.Add(N.location)
- beaconlist[N.location] = N
+ var/list/beaconlist = GetBeaconList()
if(beaconlist.len)
new_dest = input("Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]") in null|beaconlist
else
@@ -285,6 +279,15 @@
new /obj/effect/decal/cleanable/blood/oil(Tsec)
..()
+/mob/living/bot/mulebot/proc/GetBeaconList()
+ var/list/beaconlist = list()
+ for(var/obj/machinery/navbeacon/N in navbeacons)
+ if(!N.codes["delivery"])
+ continue
+ beaconlist.Add(N.location)
+ beaconlist[N.location] = N
+ return beaconlist
+
/mob/living/bot/mulebot/proc/load(var/atom/movable/C)
if(busy || load || get_dist(C, src) > 1 || !isturf(C.loc))
return
@@ -304,11 +307,11 @@
busy = 1
- C.loc = loc
+ C.forceMove(loc)
sleep(2)
if(C.loc != loc) //To prevent you from going onto more than one bot.
return
- C.loc = src
+ C.forceMove(src)
load = C
C.pixel_y += 9
@@ -325,7 +328,7 @@
busy = 1
overlays.Cut()
- load.loc = loc
+ load.forceMove(loc)
load.pixel_y -= 9
load.layer = initial(load.layer)
@@ -338,7 +341,7 @@
if(AM == botcard || AM == access_scanner)
continue
- AM.loc = loc
+ AM.forceMove(loc)
AM.layer = initial(AM.layer)
AM.pixel_y = initial(AM.pixel_y)
busy = 0
diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm
index f7556e0ece..d6a014c450 100644
--- a/code/modules/mob/living/bot/secbot.dm
+++ b/code/modules/mob/living/bot/secbot.dm
@@ -1,10 +1,14 @@
+#define SECBOT_WAIT_TIME 5 //number of in-game seconds to wait for someone to surrender
+#define SECBOT_THREAT_ARREST 4 //threat level at which we decide to arrest someone
+#define SECBOT_THREAT_ATTACK 8 //threat level at which was assume immediate danger and attack right away
+
/mob/living/bot/secbot
name = "Securitron"
desc = "A little security robot. He looks less than thrilled."
icon_state = "secbot0"
maxHealth = 100
health = 100
- req_one_access = list(access_robotics, access_security, access_forensics_lockers)
+ req_one_access = list(access_security, access_forensics_lockers)
botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
patrol_speed = 2
target_speed = 3
@@ -14,18 +18,17 @@
var/check_arrest = 1 // If true, arrests people who are set to arrest.
var/arrest_type = 0 // If true, doesn't handcuff. You monster.
var/declare_arrests = 0 // If true, announces arrests over sechuds.
- var/auto_patrol = 0 // If true, patrols on its own
var/is_ranged = 0
var/awaiting_surrender = 0
- var/list/threat_found_sounds = new('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg')
- var/list/preparing_arrest_sounds = new('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg')
+ var/list/threat_found_sounds = list('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg')
+ var/list/preparing_arrest_sounds = list('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bcreep.ogg')
/mob/living/bot/secbot/beepsky
name = "Officer Beepsky"
desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey."
- auto_patrol = 1
+ will_patrol = 1
/mob/living/bot/secbot/update_icons()
if(on && busy)
@@ -40,7 +43,7 @@
/mob/living/bot/secbot/attack_hand(var/mob/user)
user.set_machine(src)
- var/dat
+ var/list/dat = list()
dat += "Automatic Security Unit
"
dat += "Status: [on ? "On" : "Off"]
"
dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
"
@@ -51,10 +54,10 @@
dat += "Check Arrest Status: [check_arrest ? "Yes" : "No"]
"
dat += "Operating Mode: [arrest_type ? "Detain" : "Arrest"]
"
dat += "Report Arrests: [declare_arrests ? "Yes" : "No"]
"
- dat += "Auto Patrol: [auto_patrol ? "On" : "Off"]"
- user << browse("Securitron controls[dat]", "window=autosec")
- onclose(user, "autosec")
- return
+ dat += "Auto Patrol: [will_patrol ? "On" : "Off"]"
+ var/datum/browser/popup = new(user, "autosec", "Securitron controls")
+ popup.set_content(jointext(dat,null))
+ popup.open()
/mob/living/bot/secbot/Topic(href, href_list)
if(..())
@@ -80,7 +83,7 @@
if("switchmode")
arrest_type = !arrest_type
if("patrol")
- auto_patrol = !auto_patrol
+ will_patrol = !will_patrol
if("declarearrests")
declare_arrests = !declare_arrests
attack_hand(usr)
@@ -99,10 +102,46 @@
/mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user)
var/curhealth = health
- ..()
+ . = ..()
if(health < curhealth)
- target = user
- awaiting_surrender = 5
+ react_to_attack(user)
+
+/mob/living/bot/secbot/bullet_act(var/obj/item/projectile/P)
+ var/curhealth = health
+ var/mob/shooter = P.firer
+ . = ..()
+ //if we already have a target just ignore to avoid lots of checking
+ if(!target && health < curhealth && shooter && (shooter in view(world.view, src)))
+ react_to_attack(shooter)
+
+/mob/living/bot/secbot/proc/react_to_attack(mob/attacker)
+ if(!target)
+ playsound(src.loc, pick(threat_found_sounds), 50)
+ broadcast_security_hud_message("[src] was attacked by a hostile [target_name(attacker)] in [get_area(src)].", src)
+ target = attacker
+ awaiting_surrender = INFINITY // Don't try and wait for surrender
+
+// Say "freeze!" and demand surrender
+/mob/living/bot/secbot/proc/demand_surrender(mob/target, var/threat)
+ var/suspect_name = target_name(target)
+ if(declare_arrests)
+ broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [threat] suspect [suspect_name] in [get_area(src)].", src)
+ say("Down on the floor, [suspect_name]! You have [SECBOT_WAIT_TIME] seconds to comply.")
+ playsound(src.loc, pick(preparing_arrest_sounds), 50)
+ // Register to be told when the target moves
+ moved_event.register(target, src, /mob/living/bot/secbot/proc/target_moved)
+
+// Callback invoked if the registered target moves
+/mob/living/bot/secbot/proc/target_moved(atom/movable/moving_instance, atom/old_loc, atom/new_loc)
+ if(get_dist(get_turf(src), get_turf(target)) >= 1)
+ awaiting_surrender = INFINITY // Done waiting!
+ moved_event.unregister(moving_instance, src)
+
+/mob/living/bot/secbot/resetTarget()
+ ..()
+ moved_event.unregister(target, src)
+ awaiting_surrender = -1
+ walk_to(src, 0)
/mob/living/bot/secbot/startPatrol()
if(!locked) // Stop running away when we set you up
@@ -112,8 +151,7 @@
/mob/living/bot/secbot/confirmTarget(var/atom/A)
if(!..())
return 0
-
- return (check_threat(A) > 3)
+ return (check_threat(A) >= SECBOT_THREAT_ARREST)
/mob/living/bot/secbot/lookForTargets()
for(var/mob/living/M in view(src))
@@ -127,23 +165,17 @@
custom_emote(1, "points at [M.name]!")
return
-/mob/living/bot/secbot/calcTargetPath()
- ..()
- if(awaiting_surrender != -1)
- awaiting_surrender = 5 // This implies that a) we have already approached the target and b) it has moved after the warning
-
/mob/living/bot/secbot/handleAdjacentTarget()
- if(awaiting_surrender < 5 && ishuman(target) && !target:lying)
- if(awaiting_surrender == -1)
- say("Down on the floor, [target]! You have five seconds to comply.")
+ var/mob/living/carbon/human/H = target
+ var/threat = check_threat(target)
+ if(awaiting_surrender < SECBOT_WAIT_TIME && istype(H) && !H.lying && threat < SECBOT_THREAT_ATTACK)
+ if(awaiting_surrender == -1) // On first tick of awaiting...
+ demand_surrender(target, threat)
++awaiting_surrender
else
+ if(declare_arrests)
+ broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [threat] suspect [target_name(target)] in [get_area(src)].", src)
UnarmedAttack(target)
- if(ishuman(target) && declare_arrests)
- var/area/location = get_area(src)
- broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [check_threat(target)] suspect [target] in [location].", src)
-
- // say("Engaging patrol mode.")
/mob/living/bot/secbot/UnarmedAttack(var/mob/M, var/proximity)
if(!..())
@@ -170,17 +202,15 @@
spawn(2)
busy = 0
update_icons()
- visible_message("[C] was prodded by [src] with a stun baton!")
+ visible_message("\The [C] was prodded by \the [src] with a stun baton!")
else
playsound(loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2)
- visible_message("[src] is trying to put handcuffs on [C]!")
+ visible_message("\The [src] is trying to put handcuffs on \the [C]!")
busy = 1
if(do_mob(src, C, 60))
if(!C.handcuffed)
C.handcuffed = new /obj/item/weapon/handcuffs(C)
C.update_inv_handcuffed()
- if(preparing_arrest_sounds.len)
- playsound(loc, pick(preparing_arrest_sounds), 50, 0)
busy = 0
else if(istype(M, /mob/living/simple_animal))
var/mob/living/simple_animal/S = M
@@ -193,7 +223,8 @@
spawn(2)
busy = 0
update_icons()
- visible_message("[M] was beaten by [src] with a stun baton!")
+ visible_message("\The [M] was beaten by \the [src] with a stun baton!")
+
/mob/living/bot/secbot/explode()
visible_message("[src] blows apart!")
@@ -215,11 +246,17 @@
new /obj/effect/decal/cleanable/blood/oil(Tsec)
qdel(src)
+/mob/living/bot/secbot/proc/target_name(mob/living/T)
+ if(ishuman(T))
+ var/mob/living/carbon/human/H = T
+ return H.get_id_name("unidentified person")
+ return "unidentified lifeform"
+
/mob/living/bot/secbot/proc/check_threat(var/mob/living/M)
if(!M || !istype(M) || M.stat == DEAD || src == M)
return 0
- if(emagged)
+ if(emagged && !M.incapacitated()) //check incapacitated so emagged secbots don't keep attacking the same target forever
return 10
return M.assess_perp(access_scanner, 0, idcheck, check_records, check_arrest)
@@ -297,4 +334,4 @@
return
if(!in_range(src, usr) && loc != usr)
return
- created_name = t
\ No newline at end of file
+ created_name = t
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 389a25066b..32cbb6c685 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -190,6 +190,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/medical/surgeon/New()
..()
+ src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)
src.modules += new /obj/item/weapon/surgical/scalpel(src)
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index a1512b11c6..8177ab0e84 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -70,30 +70,30 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
-/datum/robolimb/hesphiastos
- company = "Hesphiastos"
+/datum/robolimb/hephaestus
+ company = "Hephaestus"
desc = "This limb has a militaristic black and green casing with gold stripes."
- icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi'
+ icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi'
unavailable_to_build = 1
-/datum/robolimb/hesphiastos_alt1
- company = "Hesphiastos - Frontier"
- desc = "A rugged prosthetic head featuring the standard Hesphiastos theme, a visor and an external display."
- icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi'
+/datum/robolimb/hephaestus_alt1
+ company = "Hephaistos - Frontier"
+ desc = "A rugged prosthetic head featuring the standard Hephaestus theme, a visor and an external display."
+ icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt1.dmi'
unavailable_to_build = 1
parts = list(BP_HEAD)
- monitor_styles = "blank=hesphiastos_alt_off;\
- pink=hesphiastos_alt_pink;\
- orange=hesphiastos_alt_orange;\
- goggles=hesphiastos_alt_goggles;\
- scroll=hesphiastos_alt_scroll;\
- rgb=hesphiastos_alt_rgb;\
- rainbow=hesphiastos_alt_rainbow"
+ monitor_styles = "blank=hephaestus_alt_off;\
+ pink=hephaestus_alt_pink;\
+ orange=hephaestus_alt_orange;\
+ goggles=hephaestus_alt_goggles;\
+ scroll=hephaestus_alt_scroll;\
+ rgb=hephaestus_alt_rgb;\
+ rainbow=hephaestus_alt_rainbow"
-/datum/robolimb/hesphiastos_monitor
- company = "Hesphiastos Monitor"
- desc = "Hesphiastos' unique spin on a popular prosthetic head model. It looks rugged and sturdy."
- icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi'
+/datum/robolimb/hephaistos_monitor
+ company = "Hephaestus Monitor"
+ desc = "Hephaestus' unique spin on a popular prosthetic head model. It looks rugged and sturdy."
+ icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_monitor.dmi'
unavailable_to_build = 1
parts = list(BP_HEAD)
monitor_styles = standard_monitor_styles
@@ -190,8 +190,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
/obj/item/weapon/disk/limb/bishop
company = "Bishop"
-/obj/item/weapon/disk/limb/hesphiastos
- company = "Hesphiastos"
+/obj/item/weapon/disk/limb/hephaestus
+ company = "Hephaestus"
/obj/item/weapon/disk/limb/morpheus
company = "Morpheus"
diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm
index d244c4eeaa..6683b48377 100644
--- a/code/modules/power/singularity/act.dm
+++ b/code/modules/power/singularity/act.dm
@@ -29,7 +29,7 @@
if(current_size >= STAGE_THREE)
var/list/handlist = list(l_hand, r_hand)
for(var/obj/item/hand in handlist)
- if(prob(current_size*5) && hand.w_class >= ((11-current_size)/2) && u_equip(hand))
+ if(prob(current_size*5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand))
step_towards(hand, src)
src << "The [S] pulls \the [hand] from your grip!"
apply_effect(current_size * 3, IRRADIATE)
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 7e0941ce75..39090ceac5 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -298,7 +298,7 @@
if(target && prob(60))
movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one
- if(current_size >= 9)//The superlarge one does not care about things in its way
+ if(current_size >= STAGE_FIVE)//The superlarge one does not care about things in its way
spawn(0)
step(src, movement_dir)
spawn(1)
@@ -319,17 +319,17 @@
var/steps = 0
if(!step)
switch(current_size)
- if(1)
+ if(STAGE_ONE)
steps = 1
- if(3)
+ if(STAGE_TWO)
steps = 3//Yes this is right
- if(5)
+ if(STAGE_THREE)
steps = 3
- if(7)
+ if(STAGE_FOUR)
steps = 4
- if(9)
+ if(STAGE_FIVE)
steps = 5
- if(11)
+ if(STAGE_SUPER)
steps = 6
else
steps = step
@@ -397,7 +397,7 @@
mezzer()
else
return 0
- if(current_size == 11)
+ if(current_size == STAGE_SUPER)
smwave()
return 1
@@ -429,18 +429,18 @@
if(M.stat == CONSCIOUS)
if (istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(istype(H.glasses,/obj/item/clothing/glasses/meson) && current_size != 11)
+ if(istype(H.glasses,/obj/item/clothing/glasses/meson) && current_size != STAGE_SUPER)
H << "You look directly into The [src.name], good thing you had your protective eyewear on!"
return
else
H << "You look directly into The [src.name], but your eyewear does absolutely nothing to protect you from it!"
- M << "You look directly into The [src.name] and feel [current_size == 11 ? "helpless" : "weak"]."
+ M << "You look directly into The [src.name] and feel [current_size == STAGE_SUPER ? "helpless" : "weak"]."
M.apply_effect(3, STUN)
for(var/mob/O in viewers(M, null))
O.show_message(text("[] stares blankly at The []!", M, src), 1)
/obj/singularity/proc/emp_area()
- if(current_size != 11)
+ if(current_size != STAGE_SUPER)
empulse(src, 4, 6, 8, 10)
else
empulse(src, 12, 14, 16, 18)
@@ -467,15 +467,15 @@
overlays = 0
move_self = 0
switch (current_size)
- if(1)
+ if(STAGE_ONE)
overlays += image('icons/obj/singularity.dmi',"chain_s1")
- if(3)
+ if(STAGE_TWO)
overlays += image('icons/effects/96x96.dmi',"chain_s3")
- if(5)
+ if(STAGE_THREE)
overlays += image('icons/effects/160x160.dmi',"chain_s5")
- if(7)
+ if(STAGE_FOUR)
overlays += image('icons/effects/224x224.dmi',"chain_s7")
- if(9)
+ if(STAGE_FIVE)
overlays += image('icons/effects/288x288.dmi',"chain_s9")
/obj/singularity/proc/on_release()
diff --git a/html/changelogs/Anewbe - Communicator Drag.yml b/html/changelogs/Anewbe - Communicator Drag.yml
new file mode 100644
index 0000000000..3d232d7bb9
--- /dev/null
+++ b/html/changelogs/Anewbe - Communicator Drag.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "You can now click+drag communicators to access them."
diff --git a/html/changelogs/Anewbe - Hephaestus Industries.yml b/html/changelogs/Anewbe - Hephaestus Industries.yml
new file mode 100644
index 0000000000..fc489b5be0
--- /dev/null
+++ b/html/changelogs/Anewbe - Hephaestus Industries.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Hephaistos Industries prosthetic disks can now be ordered again."
+ - wip: "Hephaistos Industries is the correct spelling for that company, per the wiki. Please submit a bug report if you find any references that don't match."
diff --git a/html/changelogs/Atermonera - Surgeonborg.yml b/html/changelogs/Atermonera - Surgeonborg.yml
new file mode 100644
index 0000000000..c4be42fbbe
--- /dev/null
+++ b/html/changelogs/Atermonera - Surgeonborg.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Atermonera
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Surgeon Borgs now have a proper medical hud module"
+
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index c9acba40a4..13614d0ed7 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi b/icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt1.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi
rename to icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt1.dmi
diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi b/icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi
rename to icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi
diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi b/icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_monitor.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi
rename to icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_monitor.dmi
diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi
index 89ab898f56..8767b66127 100644
Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ
diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi
index d3b7507edc..b00173777f 100644
Binary files a/icons/obj/atmos.dmi and b/icons/obj/atmos.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 97821a32cc..b1ce814e1d 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -891,7 +891,7 @@
"arg" = (/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/structure/closet/crate/secure{name = "Gold Crate"; req_access = list(19)},/turf/simulated/floor/tiled/dark,/area/security/nuke_storage)
"arh" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/storage/primary)
"ari" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/turf/simulated/floor/tiled,/area/storage/primary)
-"arj" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Tool Storage"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/storage/primary)
+"arj" = (/obj/machinery/navbeacon/delivery/west{location = "Tool Storage"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/storage/primary)
"ark" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/storage/primary)
"arl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary)
"arm" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary)
@@ -1167,7 +1167,7 @@
"aww" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"awx" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/maintenance/disposal)
"awy" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/maintenance/disposal)
-"awz" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/door/firedoor/border_only,/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Command"},/turf/simulated/floor/tiled,/area/bridge_hallway)
+"awz" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/door/firedoor/border_only,/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/south{location = "Command"},/turf/simulated/floor/tiled,/area/bridge_hallway)
"awA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/interrogation{c_tag = "INT - Interrogation"},/turf/simulated/floor/tiled/dark,/area/security/interrogation)
"awB" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/security/interrogation)
"awC" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/interrogation)
@@ -1515,7 +1515,7 @@
"aDg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
"aDi" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/westright{name = "Security Delivery"; req_access = list(1)},/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/security/security_cell_hallway)
-"aDj" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Security"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/security/security_cell_hallway)
+"aDj" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Security"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/security/security_cell_hallway)
"aDk" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/security_starboard)
"aDl" = (/obj/effect/decal/cleanable/blood/oil,/obj/item/trash/tastybread,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"aDm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/holodeck)
@@ -1789,7 +1789,7 @@
"aIu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/red,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/security/brig)
"aIv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/red{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled,/area/security/brig)
"aIw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/red{dir = 8},/obj/machinery/camera/network/security{c_tag = "SEC - Brig Port"; dir = 1},/turf/simulated/floor/tiled,/area/security/brig)
-"aIx" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH2"; location = "CH1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
+"aIx" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/navbeacon/patrol{next_patrol = "CH2"; location = "CH1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aIy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/brig)
"aIz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/red{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/security/brig)
"aIA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/red{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/security/brig)
@@ -1882,7 +1882,7 @@
"aKj" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/prison)
"aKk" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison)
"aKl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/security_starboard)
-"aKm" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor)
+"aKm" = (/obj/machinery/navbeacon/delivery/east{location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor)
"aKn" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10)
"aKo" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/janitor)
"aKp" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10)
@@ -2494,7 +2494,7 @@
"aVX" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aVY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aVZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
-"aWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH3"; location = "CH2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
+"aWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH3"; location = "CH2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aWb" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aWd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
@@ -2510,7 +2510,7 @@
"aWn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aWo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"aWp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
-"aWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH4"; location = "CH3"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
+"aWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH4"; location = "CH3"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one)
"aWr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"aWs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"aWt" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
@@ -3068,7 +3068,7 @@
"bgZ" = (/turf/simulated/wall,/area/medical/cryo)
"bha" = (/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bhb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/lime{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hydroponics)
-"bhc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH5"; location = "CH4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
+"bhc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/navbeacon/patrol{next_patrol = "CH5"; location = "CH4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bhd" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bhe" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak)
"bhf" = (/turf/simulated/wall,/area/crew_quarters/medical_restroom)
@@ -4343,7 +4343,7 @@
"bFA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/central)
"bFB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/central)
"bFC" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/tactical)
-"bFD" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Kitchen"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/crew_quarters/kitchen)
+"bFD" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/south{location = "Kitchen"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/crew_quarters/kitchen)
"bFE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/item/weapon/book/manual/chef_recipes,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 3},/obj/machinery/camera/network/civilian{c_tag = "CIV - Kitchen Port"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bFF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bFG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/grill,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
@@ -4356,7 +4356,7 @@
"bFN" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bFO" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "hop_office_desk"; name = "Desk Privacy Shutter"; pixel_x = 16; pixel_y = 28},/obj/machinery/button/windowtint{id = "hop_office"; pixel_x = 26; pixel_y = 29},/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 9},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop)
"bFP" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
-"bFQ" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/hydroponics)
+"bFQ" = (/obj/machinery/navbeacon/delivery/south{location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/hydroponics)
"bFR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"bFS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_x = 32; pixel_y = 0},/obj/structure/sign/directions/cargo{dir = 2; pixel_x = 32; pixel_z = 8},/obj/structure/sign/directions/engineering{dir = 2; pixel_x = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two)
"bFT" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/effect/floor_decal/corner/paleblue{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/reception)
@@ -4718,7 +4718,7 @@
"bML" = (/obj/machinery/vending/medical,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bMM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bMN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/rnd/research)
-"bMO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH1"; location = "CH12"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
+"bMO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH1"; location = "CH12"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
"bMP" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/patient_wing)
"bMQ" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/medical/virologyaccess)
"bMR" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess)
@@ -4831,7 +4831,7 @@
"bOU" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Research Dock Hallway"; req_access = list(47)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/rnd/docking)
"bOV" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/maintenance/research)
"bOW" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/research)
-"bOX" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/rnd/research)
+"bOX" = (/obj/machinery/navbeacon/delivery/east{location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/rnd/research)
"bOY" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/window/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Research Division Delivery"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/rnd/research)
"bOZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research)
"bPa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research)
@@ -4975,14 +4975,14 @@
"bRI" = (/obj/machinery/vending/boozeomat,/obj/machinery/status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"bRJ" = (/obj/machinery/vending/dinnerware,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bRK" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/delivery)
-"bRL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH6"; location = "CH5"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
+"bRL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH6"; location = "CH5"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bRM" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{name = "Robotics Desk"; req_access = list(29)},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bRN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"bRO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"bRP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria)
-"bRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH12"; location = "CH11"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
+"bRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH12"; location = "CH11"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
"bRR" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Port Primary 3"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port)
-"bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH7"; location = "CH6"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
+"bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH7"; location = "CH6"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bRT" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
"bRU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"bRV" = (/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/cyan,/turf/simulated/floor/bluegrid,/area/ai)
@@ -5138,7 +5138,7 @@
"bUP" = (/turf/simulated/wall/r_wall,/area/bridge_hallway)
"bUQ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Colony Director's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/obj/item/weapon/pen/multi,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bUR" = (/turf/simulated/wall,/area/crew_quarters/cafeteria)
-"bUS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing)
+"bUS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing)
"bUT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/lino,/area/crew_quarters/bar)
"bUU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria)
"bUV" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/clothing/head/cakehat,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria)
@@ -6388,13 +6388,13 @@
"csR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port)
"csS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway)
"csT" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/flora/pottedplant,/turf/simulated/floor/tiled,/area/quartermaster/foyer)
-"csU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH11"; location = "CH10"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
-"csV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH10"; location = "CH9"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
+"csU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH11"; location = "CH10"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four)
+"csV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH10"; location = "CH9"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
"csW" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
"csX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/locker)
"csY" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"csZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH9"; location = "CH8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
-"cta" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH8"; location = "CH7"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
+"csZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH9"; location = "CH8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
+"cta" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH8"; location = "CH7"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three)
"ctb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"ctc" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2)
"ctd" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker)
@@ -6544,7 +6544,7 @@
"cvR" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"cvS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/storage)
"cvT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/storage)
-"cvU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage)
+"cvU" = (/obj/machinery/navbeacon/delivery/south{location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage)
"cvV" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Port"; dir = 1},/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station)
"cvW" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/quartermaster/office)
"cvX" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/qm)
@@ -7532,7 +7532,7 @@
"cOR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge)
"cOS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11)
"cOT" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/bar)
-"cOU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
+"cOU" = (/obj/machinery/navbeacon/delivery/east{location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar)
"cOV" = (/obj/structure/bed/chair/wood{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop)
"cOW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/coffee_shop)
"cOX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/turf/simulated/floor,/area/maintenance/atmos_control)
@@ -8903,7 +8903,7 @@
"dpk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dpl" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dpm" = (/obj/machinery/door/window/westleft{name = "Engineering Reception Desk"; req_access = list(10); req_one_access = newlist()},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
-"dpn" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
+"dpn" = (/obj/machinery/navbeacon/delivery/west{location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway)
"dpo" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/maintenance/engineering)
"dpp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering)
"dpq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/engineering)
@@ -9705,8 +9705,8 @@
"dEG" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/longue_area)
"dEH" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/crew_quarters/longue_area)
"dEI" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2)
-"dEJ" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #1"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage)
-"dEK" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage)
+"dEJ" = (/obj/machinery/navbeacon/delivery/south{location = "QM #1"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage)
+"dEK" = (/obj/machinery/navbeacon/delivery/south{location = "QM #2"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage)
"dEL" = (/turf/simulated/mineral,/area/mine/explored/upper_level)
"dEM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/longue_area)
"dEN" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6)