diff --git a/code/__DEFINES/speech_channels.dm b/code/__DEFINES/speech_channels.dm
index 405506678407..3f6e4720bde9 100644
--- a/code/__DEFINES/speech_channels.dm
+++ b/code/__DEFINES/speech_channels.dm
@@ -4,6 +4,5 @@
#define ME_CHANNEL "Me"
#define OOC_CHANNEL "OOC"
#define LOOC_CHANNEL "LOOC"
-#define MOD_CHANNEL "MSAY"
#define ADMIN_CHANNEL "ASAY"
#define MENTOR_CHANNEL "Mentor"
diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm
index 865088ee72fc..ca6408961eab 100644
--- a/code/__DEFINES/tgui.dm
+++ b/code/__DEFINES/tgui.dm
@@ -32,7 +32,7 @@
/// Creates a message packet for sending via output()
// This is {"type":type,"payload":payload}, but pre-encoded. This is much faster
// than doing it the normal way.
-// To ensure this is correct, this is unit tested in tgui_create_message. However, CM does not have unit tests available.
+// To ensure this is correct, this is unit tested in tgui_create_message.
#define TGUI_CREATE_MESSAGE(type, payload) ( \
"%7b%22type%22%3a%22[type]%22%2c%22payload%22%3a[url_encode(json_encode(payload))]%7d" \
)
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index df98b2b247ba..0ac9cef3017a 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -185,6 +185,8 @@
#define TRAIT_ABILITY_NO_PLASMA_TRANSFER "t_ability_no_plasma_transfer"
/// Shows that the xeno queen is on ovi
#define TRAIT_ABILITY_OVIPOSITOR "t_ability_ovipositor"
+/// Used for burrowed mobs, prevent's SG/sentrys/claymores from autofiring
+#define TRAIT_ABILITY_BURROWED "t_ability_burrowed"
//-- item traits --
// TOOL TRAITS
@@ -240,6 +242,7 @@ GLOBAL_LIST_INIT(mob_traits, list(
TRAIT_REAGENT_SCANNER,
TRAIT_IMPROVISER,
TRAIT_FASTLEARNER,
+ TRAIT_ABILITY_BURROWED,
))
/*
diff --git a/code/__DEFINES/wj_emotes.dm b/code/__DEFINES/wj_emotes.dm
new file mode 100644
index 000000000000..f315c6eb2ba5
--- /dev/null
+++ b/code/__DEFINES/wj_emotes.dm
@@ -0,0 +1,8 @@
+#define JOE_EMOTE_CATEGORY_GREETING "Greeting"
+#define JOE_EMOTE_CATEGORY_TASK_UPDATE "Task Update"
+#define JOE_EMOTE_CATEGORY_RESTRICTED_AREA "Restricted Area"
+#define JOE_EMOTE_CATEGORY_FAREWELL "Farewell"
+#define JOE_EMOTE_CATEGORY_QUIP "Quip"
+#define JOE_EMOTE_CATEGORY_WARNING "Warning"
+#define JOE_EMOTE_CATEGORY_QUESTION "Question"
+#define JOE_EMOTE_CATEGORY_NOTICE "Notice"
diff --git a/code/__DEFINES/xeno.dm b/code/__DEFINES/xeno.dm
index 4b45c660feab..ac783b6f426e 100644
--- a/code/__DEFINES/xeno.dm
+++ b/code/__DEFINES/xeno.dm
@@ -168,6 +168,8 @@
#define XENO_LEAVE_TIMER_LARVA 80 //80 seconds
/// The time against away_timer when an AFK xeno (not larva) can be replaced
#define XENO_LEAVE_TIMER 300 //300 seconds
+/// The time against away_timer when an AFK facehugger converts to a npc
+#define XENO_FACEHUGGER_LEAVE_TIMER 420 //420 seconds
/// The time against away_timer when an AFK xeno gets listed in the available list so ghosts can get ready
#define XENO_AVAILABLE_TIMER 60 //60 seconds
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index c447bfcecb15..0132a31d0b50 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -290,21 +290,16 @@
* * cache_only - Whether to not actually send a to_chat message and instead only update larva_queue_cached_message
*/
/proc/message_alien_candidates(list/candidates, dequeued, cache_only = FALSE)
- var/new_players = 0
for(var/i in (1 + dequeued) to candidates.len)
var/mob/dead/observer/cur_obs = candidates[i]
// Generate the messages
- var/cached_message = SPAN_XENONOTICE("You are currently [i-dequeued]\th in the larva queue. There are [new_players] ahead of you that have yet to play this round.")
+ var/cached_message = SPAN_XENONOTICE("You are currently [i-dequeued]\th in the larva queue.")
cur_obs.larva_queue_cached_message = cached_message
if(!cache_only)
var/chat_message = dequeued ? replacetext(cached_message, "currently", "now") : cached_message
to_chat(candidates[i], chat_message)
- // Count how many are prioritized
- if(cur_obs.client.player_details.larva_queue_time < 2) // 0 and 1 because facehuggers/t-domers are slightly deprioritized
- new_players++
-
/proc/convert_k2c(temp)
return ((temp - T0C))
diff --git a/code/controllers/subsystem/x_evolution.dm b/code/controllers/subsystem/x_evolution.dm
index 9f84513e9e2d..be787b37de80 100644
--- a/code/controllers/subsystem/x_evolution.dm
+++ b/code/controllers/subsystem/x_evolution.dm
@@ -3,7 +3,7 @@
#define EVOLUTION_INCREMENT_TIME (30 MINUTES) // Evolution increases by 1 every 25 minutes.
SUBSYSTEM_DEF(xevolution)
- name = "Evilution"
+ name = "Evilution" //This is not a typo, do not change it.
wait = 1 MINUTES
priority = SS_PRIORITY_INACTIVITY
diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm
index 0d218ba94da4..ef77aaf471dc 100644
--- a/code/datums/components/footstep.dm
+++ b/code/datums/components/footstep.dm
@@ -13,8 +13,9 @@
var/falloff
///This can be a list OR a soundfile OR null. Determines whatever sound gets played.
var/footstep_sounds
+ var/drag_sounds
-/datum/component/footstep/Initialize(steps_ = 2, volume_ = 50, range_ = null, falloff_ = 1, footstep_sounds_ = "alien_footstep_large")
+/datum/component/footstep/Initialize(steps_ = 2, volume_ = 50, range_ = null, falloff_ = 1, footstep_sounds_ = "alien_footstep_large", drag_sounds_ = 'sound/effects/alien_dragsound_large.ogg')
if(!isliving(parent))
return COMPONENT_INCOMPATIBLE
steps = steps_
@@ -22,6 +23,7 @@
range = range_
falloff = falloff_
footstep_sounds = footstep_sounds_
+ drag_sounds = drag_sounds_
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED), PROC_REF(play_simplestep))
@@ -44,5 +46,8 @@
var/turf/open/T = prepare_step()
if(!T)
return
- if(isfile(footstep_sounds) || istext(footstep_sounds))
+ var/mob/living/parent_mob = parent
+ if(parent_mob.lying && (isfile(drag_sounds) || istext(drag_sounds)))
+ playsound(T, drag_sounds, volume, rand(20000, 25000), range, falloff = falloff)
+ else if(isfile(footstep_sounds) || istext(footstep_sounds))
playsound(T, footstep_sounds, volume, rand(20000, 25000), range, falloff = falloff)
diff --git a/code/datums/emergency_calls/cryo_marines.dm b/code/datums/emergency_calls/cryo_marines.dm
index 9bec8b3593dd..eb914e198b37 100644
--- a/code/datums/emergency_calls/cryo_marines.dm
+++ b/code/datums/emergency_calls/cryo_marines.dm
@@ -3,7 +3,7 @@
//whiskey outpost extra marines
/datum/emergency_call/cryo_squad
name = "Marine Cryo Reinforcements (Squad)"
- mob_max = 15
+ mob_max = 10
mob_min = 1
probability = 0
objectives = "Assist the USCM forces"
diff --git a/code/datums/keybinding/communication.dm b/code/datums/keybinding/communication.dm
index 9a438fc6dabd..4164198d4818 100644
--- a/code/datums/keybinding/communication.dm
+++ b/code/datums/keybinding/communication.dm
@@ -42,13 +42,6 @@
full_name = "IC Comms (;)"
keybind_signal = COMSIG_KG_CLIENT_RADIO_DOWN
-/datum/keybinding/client/communication/mod_say
- hotkey_keys = list("Unbound")
- classic_keys = list("Unbound")
- name = MOD_CHANNEL
- full_name = "Mod Say"
- keybind_signal = COMSIG_KB_ADMIN_ASAY_DOWN
-
/datum/keybinding/client/communication/asay
hotkey_keys = list("F3")
classic_keys = list("F5")
diff --git a/code/datums/redis/callbacks/msay.dm b/code/datums/redis/callbacks/msay.dm
deleted file mode 100644
index 3c0db7638a3a..000000000000
--- a/code/datums/redis/callbacks/msay.dm
+++ /dev/null
@@ -1,16 +0,0 @@
-/datum/redis_callback/msay
- channel = "byond.msay"
-
-/datum/redis_callback/msay/on_message(message)
- var/list/data = json_decode(message)
-
- if(data["source"] == SSredis.instance_name)
- return
-
- var/msg = "[data["rank"]]:[data["author"]]@[data["source"]]: [strip_html(data["message"])]"
-
- for(var/client/client in GLOB.admins)
- if(!(R_MOD & client.admin_holder.rights))
- continue
-
- to_chat(client, msg)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 937c19b4512b..dc4cca423c64 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -580,7 +580,7 @@ Parameters are passed from New.
if(!ismovable(src))
var/turf/curturf = get_turf(src)
if(curturf)
- . += ""
+ . += ""
VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRANSFORM, "Modify Transform")
VV_DROPDOWN_OPTION(VV_HK_ADD_REAGENT, "Add Reagent")
VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EMP, "EMP Pulse")
diff --git a/code/game/gamemodes/cm_initialize.dm b/code/game/gamemodes/cm_initialize.dm
index 2f6dc6e38118..b95052de8824 100644
--- a/code/game/gamemodes/cm_initialize.dm
+++ b/code/game/gamemodes/cm_initialize.dm
@@ -333,23 +333,28 @@ Additional game mode variables.
/datum/game_mode/proc/check_xeno_late_join(mob/xeno_candidate)
if(jobban_isbanned(xeno_candidate, JOB_XENOMORPH)) // User is jobbanned
to_chat(xeno_candidate, SPAN_WARNING("You are banned from playing aliens and cannot spawn as a xenomorph."))
- return
- return 1
+ return FALSE
+ return TRUE
-/datum/game_mode/proc/attempt_to_join_as_xeno(mob/xeno_candidate, instant_join = 0)
+/datum/game_mode/proc/attempt_to_join_as_xeno(mob/xeno_candidate, instant_join = FALSE)
var/list/available_xenos = list()
var/list/available_xenos_non_ssd = list()
- for(var/mob/living/carbon/xenomorph/X in GLOB.living_xeno_list)
- var/area/A = get_area(X)
- if(is_admin_level(X.z) && (!A || !(A.flags_area & AREA_ALLOW_XENO_JOIN)) || X.aghosted)
- continue //xenos on admin z level and aghosted ones don't count
- if(istype(X) && ((!islarva(X) && (XENO_LEAVE_TIMER - X.away_timer < XENO_AVAILABLE_TIMER)) || (islarva(X) && (XENO_LEAVE_TIMER_LARVA - X.away_timer < XENO_AVAILABLE_TIMER))))
- if(!X.client)
- available_xenos += X
- else
- available_xenos_non_ssd += X
-
+ for(var/mob/living/carbon/xenomorph/cur_xeno as anything in GLOB.living_xeno_list)
+ if(cur_xeno.aghosted)
+ continue //aghosted xenos don't count
+ var/area/area = get_area(cur_xeno)
+ if(is_admin_level(cur_xeno.z) && (!area || !(area.flags_area & AREA_ALLOW_XENO_JOIN)))
+ continue //xenos on admin z level don't count
+ if(!istype(cur_xeno))
+ continue
+ var/required_time = islarva(cur_xeno) ? XENO_LEAVE_TIMER_LARVA - cur_xeno.away_timer : XENO_LEAVE_TIMER - cur_xeno.away_timer
+ if(required_time > XENO_AVAILABLE_TIMER)
+ continue
+ if(!cur_xeno.client)
+ available_xenos += cur_xeno
+ else
+ available_xenos_non_ssd += cur_xeno
var/datum/hive_status/hive
for(var/hivenumber in GLOB.hive_datum)
@@ -383,7 +388,7 @@ Additional game mode variables.
return FALSE
// We aren't in queue yet, lets teach them about the queue then
- candidate_observer.larva_queue_cached_message = SPAN_XENONOTICE("You are currently still awaiting assignment in the larva queue. Priority is given to players who have yet to play in the round, but otherwise the ordering is based on your time of death. When you have been dead long enough and are not inactive, you will periodically receive messages where you are in the queue relative to other currently valid xeno candidates. Note: Playing as a facehugger or in the thunderdome will not alter your time of death. This means you won't lose your relative place in queue if you step away, disconnect, play as a facehugger, or play in the thunderdome.")
+ candidate_observer.larva_queue_cached_message = SPAN_XENONOTICE("You are currently awaiting assignment in the larva queue. The ordering is based on your time of death or the time you joined. When you have been dead long enough and are not inactive, you will periodically receive messages where you are in the queue relative to other currently valid xeno candidates. Your current position will shift as others change their preferences or go inactive, but your relative position compared to all observers is the same. Note: Playing as a facehugger or in the thunderdome will not alter your time of death. This means you won't lose your relative place in queue if you step away, disconnect, play as a facehugger, or play in the thunderdome.")
to_chat(xeno_candidate, candidate_observer.larva_queue_cached_message)
return FALSE
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 435976668577..afcc9686cff5 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -2,6 +2,7 @@
/obj/structure/machinery/cryo_cell
name = "cryo cell"
+ desc = "A donation from the old A.W. project, using cryogenic technology. It slowly heals whoever is inside the tube."
icon = 'icons/obj/structures/machinery/cryogenics2.dmi'
icon_state = "cell"
density = FALSE
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index e1c9c9a4e279..b538f55292c1 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -4,13 +4,16 @@
anchored = FALSE
density = FALSE
drag_delay = 1
+ base_pixel_x = 15
+ base_pixel_y = -2
var/mob/living/carbon/attached = null
var/mode = 1 // 1 is injecting, 0 is taking blood.
var/obj/item/reagent_container/beaker = null
+ var/datum/beam/current_beam
/obj/structure/machinery/iv_drip/update_icon()
- if(src.attached)
+ if(attached)
icon_state = "hooked"
else
icon_state = ""
@@ -35,8 +38,31 @@
filling.color = mix_color_from_reagents(reagents.reagent_list)
overlays += filling
+/obj/structure/machinery/iv_drip/proc/update_beam()
+ if(current_beam)
+ QDEL_NULL(current_beam)
+ else if(!QDELETED(src) && attached)
+ current_beam = beam(attached, "iv_tube")
+
+/obj/structure/machinery/iv_drip/power_change()
+ . = ..()
+ if(stat & NOPOWER && attached)
+ visible_message("\The [src] retracts its IV tube and shuts down.")
+ attached.active_transfusions -= src
+ attached = null
+ update_beam()
+ update_icon()
+
+/obj/structure/machinery/iv_drip/Destroy()
+ attached?.active_transfusions -= src
+ update_beam()
+ . = ..()
+
/obj/structure/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
..()
+ if(inoperable())
+ visible_message("\The [src] is not powered.")
+ return
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
@@ -48,6 +74,7 @@
"You detach \the [src] from \the [attached].")
attached.active_transfusions -= src
attached = null
+ update_beam()
update_icon()
stop_processing()
return
@@ -57,6 +84,7 @@
"You attach \the [src] to \the [over_object].")
attached = over_object
attached.active_transfusions += src
+ update_beam()
update_icon()
start_processing()
@@ -81,6 +109,7 @@
log_admin("[key_name(user)] put a [beaker] into [src], containing [reagentnames] at ([src.loc.x],[src.loc.y],[src.loc.z]).")
to_chat(user, "You attach \the [W] to \the [src].")
+ update_beam()
update_icon()
return
else
@@ -97,6 +126,7 @@
attached.emote("scream")
attached.active_transfusions -= src
attached = null
+ update_beam()
update_icon()
stop_processing()
return
diff --git a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm
index 5b0324edc2a2..103efeedde61 100644
--- a/code/game/machinery/vending/vendor_types/crew/staff_officer.dm
+++ b/code/game/machinery/vending/vendor_types/crew/staff_officer.dm
@@ -11,11 +11,21 @@
GLOBAL_LIST_INIT(cm_vending_clothing_staff_officer, list(
list("STANDARD EQUIPMENT (TAKE ALL)", 0, null, null, null),
+ list("Uniform", 0, /obj/item/clothing/under/marine/officer/bridge, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_MANDATORY),
list("Boots", 0, /obj/item/clothing/shoes/marine/knife, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_MANDATORY),
list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY),
list("Helmet", 0, /obj/item/clothing/head/helmet/marine/MP/SO, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_MANDATORY),
list("MRE", 0, /obj/item/storage/box/MRE, MARINE_CAN_BUY_MRE, VENDOR_ITEM_MANDATORY),
+ list("JACKET (CHOOSE 1)", 0, null, null, null),
+ list("Service Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/service, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED),
+
+ list("HAT (CHOOSE 1)", 0, null, null, null),
+ list("Beret, Green", 0, /obj/item/clothing/head/beret/cm, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED),
+ list("Beret, Tan", 0, /obj/item/clothing/head/beret/cm/tan, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED),
+ list("Patrol Cap", 0, /obj/item/clothing/head/cmcap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_RECOMMENDED),
+
+
list("PERSONAL SIDEARM (CHOOSE 1)", 0, null, null, null),
list("M44 Revolver", 0, /obj/item/storage/belt/gun/m44/mp, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED),
list("M4A3 Pistol", 0, /obj/item/storage/belt/gun/m4a3/commander, MARINE_CAN_BUY_BELT, VENDOR_ITEM_RECOMMENDED),
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index 1d8e5e289066..be6939a6f9dd 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -110,7 +110,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list(
list("HELMET (CHOOSE 1)", 0, null, null, null),
list("Expedition Cap", 0, /obj/item/clothing/head/cmcap/flap, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
list("Hard Hat, Orange", 0, /obj/item/clothing/head/hardhat/orange, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
- list("Surgical Cap, Green", 0, /obj/item/clothing/head/surgery/green, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
list("Welding Helmet", 0, /obj/item/clothing/head/welding, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
list("SUIT (CHOOSE 1)", 0, null, null, null),
@@ -181,13 +180,19 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Medical Scrubs, White", 12, /obj/item/clothing/under/rank/medical, null, VENDOR_ITEM_REGULAR),
list("USCM Service Uniform", 12, /obj/item/clothing/under/marine/officer/bridge, null, VENDOR_ITEM_REGULAR),
list("USCM Flightsuit", 12, /obj/item/clothing/under/rank/synthetic/flight, null, VENDOR_ITEM_REGULAR),
- list("Engineer Uniform", 12, /obj/item/clothing/under/marine/officer/engi, null, VENDOR_ITEM_REGULAR),
+ list("USCM Engineer Uniform", 12, /obj/item/clothing/under/marine/officer/engi, null, VENDOR_ITEM_REGULAR),
list("White T-Shirt and Brown Jeans", 12, /obj/item/clothing/under/tshirt/w_br, null, VENDOR_ITEM_REGULAR),
list("Gray T-Shirt and Blue Jeans", 12, /obj/item/clothing/under/tshirt/gray_blu, null, VENDOR_ITEM_REGULAR),
list("Red T-Shirt and Black Jeans", 12, /obj/item/clothing/under/tshirt/r_bla, null, VENDOR_ITEM_REGULAR),
- list("Gray Utilities", 12, /obj/item/clothing/under/colonist/ua_civvies, null, VENDOR_ITEM_REGULAR),
- list("Brown Utilities", 12, /obj/item/clothing/under/colonist/wy_davisone, null, VENDOR_ITEM_REGULAR),
- list("Steward Utilities", 12, /obj/item/clothing/under/colonist/wy_joliet_shopsteward, null, VENDOR_ITEM_REGULAR),
+ list("Frontier Jumpsuit", 12, /obj/item/clothing/under/rank/synthetic/frontier, null, VENDOR_ITEM_REGULAR),
+ list("UA Grey Jumpsuit", 12, /obj/item/clothing/under/colonist/ua_civvies, null, VENDOR_ITEM_REGULAR),
+ list("UA Brown Jumpsuit", 12, /obj/item/clothing/under/colonist/wy_davisone, null, VENDOR_ITEM_REGULAR),
+ list("UA Green Utility Uniform", 12, /obj/item/clothing/under/rank/synthetic/utility, null, VENDOR_ITEM_REGULAR),
+ list("Grey Utilities", 12, /obj/item/clothing/under/rank/synthetic/utility/yellow, null, VENDOR_ITEM_REGULAR),
+ list("Grey Utilities and Blue Jeans", 12, /obj/item/clothing/under/rank/synthetic/utility/red, null, VENDOR_ITEM_REGULAR),
+ list("Blue Utilities and Brown Jeans", 12, /obj/item/clothing/under/rank/synthetic/utility/blue, null, VENDOR_ITEM_REGULAR),
+ list("Steward Clothes", 12, /obj/item/clothing/under/colonist/wy_joliet_shopsteward, null, VENDOR_ITEM_REGULAR),
+ list("Red Dress Skirt", 12, /obj/item/clothing/under/blackskirt, null, VENDOR_ITEM_REGULAR),
list("Working Joe Uniform", 36, /obj/item/clothing/under/rank/synthetic/joe, null, VENDOR_ITEM_REGULAR),
list("GLASSES", 0, null, null, null),
@@ -208,6 +213,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Shoes, Red", 12, /obj/item/clothing/shoes/red, null, VENDOR_ITEM_REGULAR),
list("Shoes, White", 12, /obj/item/clothing/shoes/white, null, VENDOR_ITEM_REGULAR),
list("Shoes, Yellow", 12, /obj/item/clothing/shoes/yellow, null, VENDOR_ITEM_REGULAR),
+ list("Shoes, Seegson", 24, /obj/item/clothing/shoes/dress, null, VENDOR_ITEM_REGULAR),
list("HELMET", 0, null, null, null),
list("Beanie", 12, /obj/item/clothing/head/beanie, null, VENDOR_ITEM_REGULAR),
@@ -216,31 +222,32 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("Beret, Red", 12, /obj/item/clothing/head/beret/cm/red, null, VENDOR_ITEM_REGULAR),
list("Beret, Standard", 12, /obj/item/clothing/head/beret/cm, null, VENDOR_ITEM_REGULAR),
list("Beret, Tan", 12, /obj/item/clothing/head/beret/cm/tan, null, VENDOR_ITEM_REGULAR),
- list("Cap", 12, /obj/item/clothing/head/cmcap, null, VENDOR_ITEM_REGULAR),
list("Surgical Cap, Blue", 12, /obj/item/clothing/head/surgery/blue, null, VENDOR_ITEM_REGULAR),
list("Surgical Cap, Blue", 12, /obj/item/clothing/head/surgery/purple, null, VENDOR_ITEM_REGULAR),
list("Surgical Cap, Green", 12, /obj/item/clothing/head/surgery/green, null, VENDOR_ITEM_REGULAR),
list("Ushanka", 12, /obj/item/clothing/head/ushanka, null, VENDOR_ITEM_REGULAR),
+ list("Cap", 12, /obj/item/clothing/head/cmcap, null, VENDOR_ITEM_REGULAR),
list("MP Cap", 12, /obj/item/clothing/head/beret/marine/mp/mpcap, null, VENDOR_ITEM_REGULAR),
list("RO Cap", 12, /obj/item/clothing/head/cmcap/req, null, VENDOR_ITEM_REGULAR),
list("Officer Cap", 12, /obj/item/clothing/head/cmcap/ro, null, VENDOR_ITEM_REGULAR),
list("SUIT", 0, null, null, null),
- list("Brown Bomber Jacket", 12, /obj/item/clothing/suit/storage/bomber, null, VENDOR_ITEM_REGULAR),
- list("Black Bomber Jacket", 12, /obj/item/clothing/suit/storage/bomber/alt, null, VENDOR_ITEM_REGULAR),
- list("External webbing", 12, /obj/item/clothing/suit/storage/webbing, null, VENDOR_ITEM_REGULAR),
- list("Orange Hazard Vest", 12, /obj/item/clothing/suit/storage/hazardvest, null, VENDOR_ITEM_REGULAR),
- list("Blue Hazard Vest", 12, /obj/item/clothing/suit/storage/hazardvest/blue, null, VENDOR_ITEM_REGULAR),
- list("Yellow Hazard Vest", 12, /obj/item/clothing/suit/storage/hazardvest/yellow, null, VENDOR_ITEM_REGULAR),
- list("Black Hazard Vest", 12, /obj/item/clothing/suit/storage/hazardvest/black, null, VENDOR_ITEM_REGULAR),
+ list("Bomber Jacket, Brown", 12, /obj/item/clothing/suit/storage/bomber, null, VENDOR_ITEM_REGULAR),
+ list("Bomber Jacket, Black", 12, /obj/item/clothing/suit/storage/bomber/alt, null, VENDOR_ITEM_REGULAR),
+ list("External Webbing", 12, /obj/item/clothing/suit/storage/webbing, null, VENDOR_ITEM_REGULAR),
+ list("Utility Vest", 12, /obj/item/clothing/suit/storage/utility_vest, null, VENDOR_ITEM_REGULAR),
+ list("Hazard Vest(Orange)", 12, /obj/item/clothing/suit/storage/hazardvest, null, VENDOR_ITEM_REGULAR),
+ list("Hazard Vest(Blue)", 12, /obj/item/clothing/suit/storage/hazardvest/blue, null, VENDOR_ITEM_REGULAR),
+ list("Hazard Vest(Yellow)", 12, /obj/item/clothing/suit/storage/hazardvest/yellow, null, VENDOR_ITEM_REGULAR),
+ list("Hazard Vest(Black)", 12, /obj/item/clothing/suit/storage/hazardvest/black, null, VENDOR_ITEM_REGULAR),
list("Synthetic's Snow Suit", 12, /obj/item/clothing/suit/storage/snow_suit/synth, null, VENDOR_ITEM_REGULAR),
list("USCM Service Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/service, null, VENDOR_ITEM_REGULAR),
list("USCM MP Service Jacket", 12, /obj/item/clothing/suit/storage/jacket/marine/service/mp, null, VENDOR_ITEM_REGULAR),
- list("Brown Windbreaker", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_brown, null, VENDOR_ITEM_REGULAR),
- list("Gray Windbreaker", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_gray, null, VENDOR_ITEM_REGULAR),
- list("Green Windbreaker", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_green, null, VENDOR_ITEM_REGULAR),
- list("First Responder Windbreaker", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_fr, null, VENDOR_ITEM_REGULAR),
- list("Exploration Windbreaker", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_covenant, null, VENDOR_ITEM_REGULAR),
+ list("Windbreaker, Brown", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_brown, null, VENDOR_ITEM_REGULAR),
+ list("Windbreaker, Grey", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_gray, null, VENDOR_ITEM_REGULAR),
+ list("Windbreaker, Green", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_green, null, VENDOR_ITEM_REGULAR),
+ list("Windbreaker, First Responder", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_fr, null, VENDOR_ITEM_REGULAR),
+ list("Windbreaker, Exploration", 12, /obj/item/clothing/suit/storage/windbreaker/windbreaker_covenant, null, VENDOR_ITEM_REGULAR),
list("Labcoat", 12, /obj/item/clothing/suit/storage/labcoat, null, VENDOR_ITEM_REGULAR),
list("Labcoat, Researcher", 12, /obj/item/clothing/suit/storage/labcoat/researcher, null, VENDOR_ITEM_REGULAR),
list("RO Jacket", 12, /obj/item/clothing/suit/storage/RO, null, VENDOR_ITEM_REGULAR),
@@ -248,9 +255,8 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth_snowflake, list(
list("BACKPACK", 0, null, null, null),
list("Backpack, Industrial", 12, /obj/item/storage/backpack/industrial, null, VENDOR_ITEM_REGULAR),
- list("Backpack, USCM IMB", 12, /obj/item/storage/backpack/marine, null, VENDOR_ITEM_REGULAR),
list("Backpack, USCM Medical", 12, /obj/item/storage/backpack/marine/medic, null, VENDOR_ITEM_REGULAR),
- list("Backpack, USCM Technician", 12, /obj/item/storage/backpack/marine/tech, null, VENDOR_ITEM_REGULAR),
+ list("Chestrig, Technician", 12, /obj/item/storage/backpack/marine/satchel/tech, null, VENDOR_ITEM_REGULAR),
list("Satchel, USCM", 12, /obj/item/storage/backpack/marine/satchel, null, VENDOR_ITEM_REGULAR),
list("Satchel, Leather", 12, /obj/item/storage/backpack/satchel, null, VENDOR_ITEM_REGULAR),
list("Satchel, Medical", 12, /obj/item/storage/backpack/satchel/med, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm
index 5815f60b2e0c..70ac7701973b 100644
--- a/code/game/machinery/vending/vendor_types/medical.dm
+++ b/code/game/machinery/vending/vendor_types/medical.dm
@@ -272,7 +272,7 @@
/obj/structure/machinery/cm_vending/sorted/medical/blood
name = "\improper MM Blood Dispenser"
- desc = "Marine Med brand Blood Pack Dispensary"
+ desc = "The Marine Med Brand Blood Pack Dispensary is the premier, top-of-the-line blood dispenser of 2105! Get yours today!" //Don't update this year, the joke is it's old.
icon_state = "blood"
wrenchable = TRUE
hackable = TRUE
diff --git a/code/game/objects/effects/landmarks/landmarks.dm b/code/game/objects/effects/landmarks/landmarks.dm
index 64a5025794e3..1cbe10c497f6 100644
--- a/code/game/objects/effects/landmarks/landmarks.dm
+++ b/code/game/objects/effects/landmarks/landmarks.dm
@@ -216,23 +216,25 @@
/obj/effect/landmark/yautja_teleport
name = "yautja_teleport"
+ /// The index we registered as in mainship_yautja_desc or yautja_teleport_descs
+ var/desc_index
/obj/effect/landmark/yautja_teleport/Initialize(mapload, ...)
. = ..()
- var/turf/T = get_turf(src)
+ var/turf/turf = get_turf(src)
+ desc_index = turf.loc.name + turf.loc_to_string()
if(is_mainship_level(z))
GLOB.mainship_yautja_teleports += src
- GLOB.mainship_yautja_desc[T.loc.name + T.loc_to_string()] = src
+ GLOB.mainship_yautja_desc[desc_index] = src
else
GLOB.yautja_teleports += src
- GLOB.yautja_teleport_descs[T.loc.name + T.loc_to_string()] = src
+ GLOB.yautja_teleport_descs[desc_index] = src
/obj/effect/landmark/yautja_teleport/Destroy()
- var/turf/T = get_turf(src)
GLOB.mainship_yautja_teleports -= src
GLOB.yautja_teleports -= src
- GLOB.mainship_yautja_desc -= T.loc.name + T.loc_to_string()
- GLOB.yautja_teleport_descs -= T.loc.name + T.loc_to_string()
+ GLOB.mainship_yautja_desc -= desc_index
+ GLOB.yautja_teleport_descs -= desc_index
return ..()
diff --git a/code/game/objects/effects/landmarks/survivor_spawner.dm b/code/game/objects/effects/landmarks/survivor_spawner.dm
index fbd04babdf20..335d4e9f4774 100644
--- a/code/game/objects/effects/landmarks/survivor_spawner.dm
+++ b/code/game/objects/effects/landmarks/survivor_spawner.dm
@@ -67,7 +67,7 @@
/obj/effect/landmark/survivor_spawner/bigred_crashed_pmc
equipment = /datum/equipment_preset/survivor/pmc
- synth_equipment = /datum/equipment_preset/pmc/synth
+ synth_equipment = /datum/equipment_preset/synth/survivor/pmc
intro_text = list("
You are a survivor of a crash landing!
",\
"You are NOT aware of the xenomorph threat.",\
"Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.")
@@ -80,7 +80,7 @@
/obj/effect/landmark/survivor_spawner/bigred_crashed_cl
equipment = /datum/equipment_preset/survivor/wy/manager
- synth_equipment = /datum/equipment_preset/pmc/synth
+ synth_equipment = /datum/equipment_preset/synth/survivor/pmc
intro_text = list("
You are a survivor of a crash landing!
",\
"You are NOT aware of the xenomorph threat.",\
"Your primary objective is to heal up and survive. If you want to assault the hive - adminhelp.")
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 5e5786deb33e..6293abb67339 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -49,7 +49,7 @@
name = "AI Integrated Encryption Key"
desc = "Integrated encryption key"
icon_state = "cap_key"
- channels = list(RADIO_CHANNEL_ALMAYER = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_ALMAYER = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
/obj/item/device/encryptionkey/sentry_laptop
name = "Sentry Network Status Encryption Key"
@@ -61,12 +61,12 @@
/obj/item/device/encryptionkey/cmpcom/cdrcom
name = "\improper Marine Senior Command Radio Encryption Key"
- channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
/obj/item/device/encryptionkey/mcom
name = "\improper Marine Command Radio Encryption Key"
icon_state = "cap_key"
- channels = list(RADIO_CHANNEL_COMMAND = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_COMMAND = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
// MARINE ENGINEERING
@@ -102,7 +102,7 @@
/obj/item/device/encryptionkey/mmpo
name = "\improper Military Police Radio Encryption Key"
icon_state = "sec_key"
- channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE,)
+ channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE,)
/obj/item/device/encryptionkey/sec
name = "Security Radio Encryption Key"
@@ -130,7 +130,7 @@
/obj/item/device/encryptionkey/cmpcom/synth
name = "\improper Marine Synth Radio Encryption Key"
- channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
/obj/item/device/encryptionkey/mcom/cl
name = "\improper Corporate Liaison radio encryption key"
@@ -163,7 +163,7 @@
channels = list(RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_COMMAND = FALSE)
/obj/item/device/encryptionkey/mcom/ai //AI only.
- channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
// MARINE SQUADS
@@ -296,7 +296,7 @@
/obj/item/device/encryptionkey/highcom
name = "\improper USCM High Command Radio Encryption Key"
icon_state = "binary_key"
- channels = list(RADIO_CHANNEL_HIGHCOM = TRUE, SQUAD_SOF = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = FALSE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
+ channels = list(RADIO_CHANNEL_HIGHCOM = TRUE, SQUAD_SOF = TRUE, RADIO_CHANNEL_COMMAND = TRUE, RADIO_CHANNEL_MP = TRUE, SQUAD_MARINE_1 = TRUE, SQUAD_MARINE_2 = TRUE, SQUAD_MARINE_3 = TRUE, SQUAD_MARINE_4 = TRUE, SQUAD_MARINE_5 = TRUE, SQUAD_MARINE_CRYO = TRUE, RADIO_CHANNEL_ENGI = TRUE, RADIO_CHANNEL_MEDSCI = TRUE, RADIO_CHANNEL_REQ = TRUE, RADIO_CHANNEL_JTAC = TRUE, RADIO_CHANNEL_INTEL = TRUE)
/obj/item/device/encryptionkey/contractor
name = "\improper Vanguard's Arrow Incorporated Radio Encryption Key"
diff --git a/code/game/objects/items/explosives/mine.dm b/code/game/objects/items/explosives/mine.dm
index 6b8c9bccd299..742a5f314c4a 100644
--- a/code/game/objects/items/explosives/mine.dm
+++ b/code/game/objects/items/explosives/mine.dm
@@ -198,6 +198,8 @@
return
if(L.get_target_lock(iff_signal) || isrobot(L))
return
+ if(HAS_TRAIT(L, TRAIT_ABILITY_BURROWED))
+ return
L.visible_message(SPAN_DANGER("[icon2html(src, viewers(src))] The [name] clicks as [L] moves in front of it."), \
SPAN_DANGER("[icon2html(src, L)] The [name] clicks as you move in front of it."), \
SPAN_DANGER("You hear a click."))
diff --git a/code/game/objects/items/reagent_containers/blood_pack.dm b/code/game/objects/items/reagent_containers/blood_pack.dm
index 450cdde2fa00..8e29a26c2ecd 100644
--- a/code/game/objects/items/reagent_containers/blood_pack.dm
+++ b/code/game/objects/items/reagent_containers/blood_pack.dm
@@ -13,7 +13,9 @@
var/mode = BLOOD_BAG_INJECTING
var/mob/living/carbon/human/connected_to
+ var/mob/living/carbon/human/connected_from
var/blood_type = null
+ var/datum/beam/current_beam
/obj/item/reagent_container/blood/Initialize()
. = ..()
@@ -32,6 +34,12 @@
if(10 to 50) icon_state = "half"
if(51 to INFINITY) icon_state = "full"
+/obj/item/reagent_container/blood/proc/update_beam()
+ if(current_beam)
+ QDEL_NULL(current_beam)
+ else if(connected_from && connected_to)
+ current_beam = connected_from.beam(connected_to, "iv_tube")
+
/obj/item/reagent_container/blood/attack(mob/attacked_mob, mob/user)
. = ..()
@@ -44,7 +52,10 @@
user.visible_message("[user] detaches [src] from [connected_to].", \
"You detach [src] from [connected_to].")
connected_to.active_transfusions -= src
+ connected_to.base_pixel_x = 0
connected_to = null
+ connected_from = null
+ update_beam()
return
if(!skillcheck(user, SKILL_SURGERY, SKILL_SURGERY_NOVICE))
@@ -60,10 +71,13 @@
if(istype(attacked_mob, /mob/living/carbon/human))
connected_to = attacked_mob
+ connected_from = user
connected_to.active_transfusions += src
+ connected_to.base_pixel_x = 5
START_PROCESSING(SSobj, src)
user.visible_message("[user] attaches \the [src] to [connected_to].", \
"You attach \the [src] to [connected_to].")
+ update_beam()
/obj/item/reagent_container/blood/process()
//if we're not connected to anything stop doing stuff
@@ -106,6 +120,10 @@
connected_to.take_blood(src, amount)
+/obj/item/reagent_container/blood/dropped()
+ ..()
+ bad_disconnect()
+
///Used to standardize effects of a blood bag disconnecting improperly
/obj/item/reagent_container/blood/proc/bad_disconnect()
if(!connected_to)
@@ -116,7 +134,10 @@
if(connected_to.pain.feels_pain)
connected_to.emote("scream")
connected_to.active_transfusions -= src
+ connected_to.base_pixel_x = 0
connected_to = null
+ connected_from = null
+ update_beam()
/obj/item/reagent_container/blood/verb/toggle_mode()
set category = "Object"
diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm
index dd8f10a51559..36f946efdfdc 100644
--- a/code/game/objects/items/storage/storage.dm
+++ b/code/game/objects/items/storage/storage.dm
@@ -799,9 +799,9 @@ W is always an item. stop_warning prevents messaging. user may be null.**/
storage_close(watcher)
/obj/item/storage/proc/dump_objectives()
- for(var/obj/item/I in src)
- if(I.is_objective)
- I.forceMove(loc)
+ for(var/obj/item/cur_item in src)
+ if(cur_item.is_objective)
+ remove_from_storage(cur_item, loc)
/obj/item/storage/Destroy()
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index ec7ee0b173da..cdab7db87ed7 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -45,7 +45,7 @@
w_class = SIZE_SMALL
force = MELEE_FORCE_WEAK
var/on = 0
- var/stunforce = 60
+ var/stun_force = 10
/obj/item/weapon/telebaton/attack(mob/living/carbon/human/target, mob/living/user)
if(!istype(target) || !on)
@@ -67,6 +67,7 @@
item_state = "telebaton_1"
w_class = SIZE_MEDIUM
force = MELEE_FORCE_VERY_STRONG
+ stun_force = 40
attack_verb = list("smacked", "struck", "slapped", "beat")
else
user.visible_message(SPAN_NOTICE("Using a smooth, practiced movement, [user] collapses \his [src]."),\
@@ -75,7 +76,8 @@
icon_state = "telebaton_0"
item_state = "telebaton_0"
w_class = SIZE_SMALL
- force = MELEE_FORCE_WEAK//not so robust now
+ force = MELEE_FORCE_WEAK
+ stun_force = initial(stun_force)
attack_verb = list("hit", "punched")
if(istype(user,/mob/living/carbon/human))
@@ -100,8 +102,17 @@
user.flick_attack_overlay(target, "punch")
log_interact(user, target, "[key_name(user)] stunned [key_name(target)] with \the [src]")
// Hit 'em
+ var/final_stun_force = stun_force
+ var/datum/skills/user_skills = user.skills
+ if(user_skills)
+ switch(user_skills.get_skill_level(SKILL_POLICE))
+ if(SKILL_POLICE_FLASH)
+ final_stun_force *= 1.5
+ if(SKILL_POLICE_SKILLED)
+ final_stun_force *= 3
+
var/target_zone = check_zone(user.zone_selected)
- target.apply_stamina_damage(stunforce, target_zone, ARMOR_MELEE)
+ target.apply_stamina_damage(final_stun_force, target_zone, ARMOR_MELEE)
if(target.stamina.current_stamina <= 0)
user.visible_message(SPAN_DANGER("[user] knocks down [target] with \the [src]!"),\
SPAN_WARNING("You knock down [target] with \the [src]!"))
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index cf0374c09ab4..8c8d6b6920a8 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -245,19 +245,22 @@
else if(istype(W, /obj/item/packageWrap) || istype(W, /obj/item/explosive/plastic))
return
else if(iswelder(W))
+ if(material != MATERIAL_METAL && material != MATERIAL_PLASTEEL)
+ to_chat(user, SPAN_WARNING("You cannot weld [material]!"))
+ return FALSE//Can't weld wood/plastic.
if(!HAS_TRAIT(W, TRAIT_TOOL_BLOWTORCH))
to_chat(user, SPAN_WARNING("You need a stronger blowtorch!"))
- return
+ return FALSE
var/obj/item/tool/weldingtool/WT = W
if(!WT.isOn())
to_chat(user, SPAN_WARNING("\The [WT] needs to be on!"))
- return
+ return FALSE
if(!WT.remove_fuel(0, user))
to_chat(user, SPAN_NOTICE("You need more welding fuel to complete this task."))
- return
+ return FALSE
playsound(src, 'sound/items/Welder.ogg', 25, 1)
if(!do_after(user, 10 * user.get_skill_duration_multiplier(SKILL_CONSTRUCTION), INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
- return
+ return FALSE
welded = !welded
update_icon()
for(var/mob/M as anything in viewers(src))
@@ -266,9 +269,9 @@
if(isxeno(user))
var/mob/living/carbon/xenomorph/opener = user
src.attack_alien(opener)
- return
+ return FALSE
src.attack_hand(user)
- return
+ return TRUE
/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/user)
if(!opened)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index bda4b60ca21e..7979994915f4 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -208,6 +208,20 @@
return
..()
+/obj/structure/bed/roller/Collided(atom/movable/moving_atom)
+ if(!isxeno(moving_atom))
+ return ..()
+
+ if(buckled_mob && buckled_mob.stat != DEAD)
+ return ..()
+
+ if(buckled_bodybag)
+ var/mob/mob_in_bodybag = locate(/mob) in buckled_bodybag
+ if(mob_in_bodybag && mob_in_bodybag.stat != DEAD)
+ return ..()
+
+ return
+
/obj/item/roller
name = "roller bed"
desc = "A collapsed roller bed that can be carried around."
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 730263ad7a3e..db3ce98339a3 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -326,11 +326,13 @@
/// Checks whether a table is a straight line along a given axis
/obj/structure/surface/table/proc/straight_table_check(direction)
var/obj/structure/surface/table/table = src
- while(table)
+ var/obj/structure/surface/table/side_table
+ var/tables_count = 7 // Lazy extra safety against infinite loops. If table big, can't flip, i guess.
+ while(--tables_count)
// Check whether there are connected tables perpendicular to the axis
for(var/angle in list(-90, 90))
- table = locate() in get_step(loc, turn(direction, angle))
- if(table && !table.flipped)
+ side_table = locate() in get_step(table, turn(direction, angle))
+ if(side_table && !side_table.flipped)
return FALSE
table = locate() in get_step(table, direction)
if(!table || table.flipped)
@@ -339,6 +341,8 @@
var/obj/structure/surface/table/reinforced/reinforced_table = table
if(reinforced_table.status == RTABLE_NORMAL)
return FALSE
+ if(!tables_count)
+ return FALSE
return TRUE
/obj/structure/surface/table/verb/do_flip()
@@ -421,7 +425,7 @@
to_chat(usr, SPAN_WARNING("You have moved a table too recently."))
return FALSE
- if(!skip_straight_check && (!straight_table_check(turn(direction, 90)) || !straight_table_check(turn(direction, -90))))
+ if(!skip_straight_check && !(straight_table_check(turn(direction, 90)) && straight_table_check(turn(direction, -90))))
to_chat(usr, SPAN_WARNING("[src] is too wide to be flipped."))
return FALSE
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index ba5d52a23f97..6154bb4f8c32 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -27,7 +27,6 @@ var/list/admin_verbs_default = list(
/client/proc/invismin,
/client/proc/set_explosive_antigrief,
/client/proc/check_explosive_antigrief,
- /client/proc/cmd_mod_say,
/client/proc/dsay,
/client/proc/chem_panel, /*chem panel, allows viewing, editing and creation of reagent and chemical_reaction datums*/
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
@@ -68,6 +67,8 @@ var/list/admin_verbs_default = list(
/datum/admins/proc/alertall,
/datum/admins/proc/imaginary_friend,
/client/proc/toggle_ares_ping,
+ /client/proc/cmd_admin_say, /*staff-only ooc chat*/
+ /client/proc/cmd_mod_say, /* alternate way of typing asay, no different than cmd_admin_say */
)
var/list/admin_verbs_admin = list(
@@ -80,7 +81,6 @@ var/list/admin_verbs_admin = list(
/client/proc/toggleprayers, /*toggles prayers on/off*/
/client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/
/client/proc/event_panel,
- /client/proc/cmd_admin_say, /*admin-only ooc chat*/
/client/proc/free_slot, /*frees slot for chosen job*/
/client/proc/modify_slot,
/client/proc/cmd_admin_rejuvenate,
diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm
index c0ffeada9883..5a98faa6ddaa 100644
--- a/code/modules/admin/tabs/admin_tab.dm
+++ b/code/modules/admin/tabs/admin_tab.dm
@@ -218,30 +218,52 @@
message_admins("[key_name(usr)] used Toggle Wake In View.")
+/client/proc/cmd_mod_say(msg as text)
+ set name = "Msay" // This exists for ease of admins who were used to using msay instead of asay
+ set category = "Admin"
+ set hidden = TRUE
+
+ cmd_admin_say(msg)
+
/client/proc/cmd_admin_say(msg as text)
set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite
set category = "Admin"
set hidden = TRUE
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN|R_MOD))
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
- if(!msg)
+
+ if (!msg)
return
- log_adminpm("ADMIN : [key_name(src)] : [msg]")
- REDIS_PUBLISH("byond.asay", "author" = src.key, "message" = strip_html(msg), "host" = ishost(src), "rank" = admin_holder.rank)
+ REDIS_PUBLISH("byond.asay", "author" = src.key, "message" = strip_html(msg), "admin" = CLIENT_HAS_RIGHTS(src, R_ADMIN), "rank" = admin_holder.rank)
+
+ if(findtext(msg, "@") || findtext(msg, "#"))
+ var/list/link_results = check_asay_links(msg)
+ if(length(link_results))
+ msg = link_results[ASAY_LINK_NEW_MESSAGE_INDEX]
+ link_results[ASAY_LINK_NEW_MESSAGE_INDEX] = null
+ var/list/pinged_admin_clients = link_results[ASAY_LINK_PINGED_ADMINS_INDEX]
+ for(var/iter_ckey in pinged_admin_clients)
+ var/client/iter_admin_client = pinged_admin_clients[iter_ckey]
+ if(!iter_admin_client?.admin_holder)
+ continue
+ window_flash(iter_admin_client)
+ SEND_SOUND(iter_admin_client.mob, sound('sound/misc/asay_ping.ogg'))
+
+ log_adminpm("ADMIN: [key_name(src)] : [msg]")
var/color = "adminsay"
if(ishost(usr))
color = "headminsay"
- if(check_rights(R_ADMIN,0))
- msg = "ADMIN:[key_name(usr, 1)] [ADMIN_JMP_USER(mob)]: [msg]"
- for(var/client/C in GLOB.admins)
- if(R_ADMIN & C.admin_holder.rights)
- to_chat(C, msg)
+ var/channel = "ADMIN:"
+ channel = "[admin_holder.rank]:"
+ for(var/client/client as anything in GLOB.admins)
+ if((R_ADMIN|R_MOD) & client.admin_holder.rights)
+ to_chat(client, "[channel][key_name(src,1)] [ADMIN_JMP_USER(mob)]: [msg]")
/datum/admins/proc/alertall()
set name = "Alert All"
@@ -328,50 +350,6 @@
var/msg = input(src, null, "asay \"text\"") as text|null
cmd_admin_say(msg)
-/client/proc/cmd_mod_say(msg as text)
- set name = "Msay"
- set category = "Admin"
- set hidden = TRUE
-
- if(!check_rights(R_ADMIN|R_MOD))
- return
-
- msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
-
- if (!msg)
- return
-
- REDIS_PUBLISH("byond.msay", "author" = src.key, "message" = strip_html(msg), "admin" = CLIENT_HAS_RIGHTS(src, R_ADMIN), "rank" = admin_holder.rank)
-
- if(findtext(msg, "@") || findtext(msg, "#"))
- var/list/link_results = check_asay_links(msg)
- if(length(link_results))
- msg = link_results[ASAY_LINK_NEW_MESSAGE_INDEX]
- link_results[ASAY_LINK_NEW_MESSAGE_INDEX] = null
- var/list/pinged_admin_clients = link_results[ASAY_LINK_PINGED_ADMINS_INDEX]
- for(var/iter_ckey in pinged_admin_clients)
- var/client/iter_admin_client = pinged_admin_clients[iter_ckey]
- if(!iter_admin_client?.admin_holder)
- continue
- window_flash(iter_admin_client)
- SEND_SOUND(iter_admin_client.mob, sound('sound/misc/asay_ping.ogg'))
-
- log_adminpm("MOD: [key_name(src)] : [msg]")
-
- var/color = "mod"
- if (check_rights(R_ADMIN,0))
- color = "adminmod"
-
- var/channel = "MOD:"
- channel = "[admin_holder.rank]:"
- for(var/client/C in GLOB.admins)
- if((R_ADMIN|R_MOD) & C.admin_holder.rights)
- to_chat(C, "[channel][key_name(src,1)] [ADMIN_JMP_USER(mob)]: [msg]")
-
-/client/proc/get_mod_say()
- var/msg = input(src, null, "msay \"text\"") as text|null
- cmd_mod_say(msg)
-
/client/proc/cmd_mentor_say(msg as text)
set name = "MentorSay"
set category = "OOC"
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 6926175c835a..c700a226295e 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -713,17 +713,8 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list(
winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=[looc]")
else
winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=looc")
- if(MOD_CHANNEL)
- if(admin_holder?.check_for_rights(R_MOD))
- if(prefs.tgui_say)
- var/msay = tgui_say_create_open_command(MOD_CHANNEL)
- winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=[msay]")
- else
- winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=msay")
- else
- winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=")
if(ADMIN_CHANNEL)
- if(admin_holder?.check_for_rights(R_ADMIN))
+ if(admin_holder?.check_for_rights(R_MOD))
if(prefs.tgui_say)
var/asay = tgui_say_create_open_command(ADMIN_CHANNEL)
winset(src, "srvkeybinds-[REF(key)]", "parent=default;name=[key];command=[asay]")
diff --git a/code/modules/client/player_details.dm b/code/modules/client/player_details.dm
index 2360ea6c4f28..634fd8fb627e 100644
--- a/code/modules/client/player_details.dm
+++ b/code/modules/client/player_details.dm
@@ -10,6 +10,9 @@ GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details
/// The descriminator for larva queue ordering: Generally set to timeofdeath except for facehuggers/admin z-level play
var/larva_queue_time
+/datum/player_details/New()
+ larva_queue_time = world.time
+ return ..()
/proc/log_played_names(ckey, ...)
if(!ckey)
diff --git a/code/modules/clothing/suits/marine_armor.dm b/code/modules/clothing/suits/marine_armor.dm
index ab62ea782a09..8ad01f8c4e30 100644
--- a/code/modules/clothing/suits/marine_armor.dm
+++ b/code/modules/clothing/suits/marine_armor.dm
@@ -579,6 +579,7 @@ var/list/squad_colors_chat = list(rgb(230,125,125), rgb(255,230,80), rgb(255,150
armor_rad = CLOTHING_ARMOR_NONE
armor_internaldamage = CLOTHING_ARMOR_NONE
storage_slots = 3
+ slowdown = SLOWDOWN_ARMOR_VERY_LIGHT
time_to_unequip = 0.5 SECONDS
time_to_equip = 1 SECONDS
uniform_restricted = null
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index d2b020a05daf..c51f5f2575ed 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -272,13 +272,11 @@
flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_ARMS
/obj/item/clothing/suit/storage/webbing
- name = "External webbing"
+ name = "external webbing"
desc = "Designed to be worn over a jumpsuit rather than clipped on."
icon_state = "webbing"
item_state = "webbing"
allowed = list(
- /obj/item/storage/fancy/cigarettes,
- /obj/item/tool/lighter,
/obj/item/weapon/baton,
/obj/item/handcuffs,
/obj/item/device/binoculars,
@@ -287,7 +285,6 @@
/obj/item/device/flashlight,
/obj/item/device/healthanalyzer,
/obj/item/device/radio,
- /obj/item/tank/emergency_oxygen,
/obj/item/tool/crowbar,
/obj/item/tool/crew_monitor,
/obj/item/tool/pen,
@@ -295,6 +292,26 @@
/obj/item/device/motiondetector,
)
+/obj/item/clothing/suit/storage/utility_vest
+ name = "utility vest"
+ desc = "A utility vest to hold tools in."
+ icon_state = "synth_utility_vest"
+ item_state = "synth_utility_vest"
+ allowed = list(
+ /obj/item/weapon/baton,
+ /obj/item/handcuffs,
+ /obj/item/device/binoculars,
+ /obj/item/attachable/bayonet,
+
+ /obj/item/device/flashlight,
+ /obj/item/device/healthanalyzer,
+ /obj/item/device/radio,
+ /obj/item/tool/crowbar,
+ /obj/item/tool/crew_monitor,
+ /obj/item/storage/large_holster/machete,
+ /obj/item/device/motiondetector,
+ )
+
//Blue suit jacket toggle
/obj/item/clothing/suit/suit/verb/toggle()
set name = "Toggle Jacket Buttons"
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index 540c311f9221..eca050cc4b88 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -705,7 +705,7 @@
sensor_faction = FACTION_CLF
/obj/item/clothing/under/colonist/ua_civvies
- name = "gray utilities"
+ name = "\improper UA gray utility uniform"
desc = "A stylish gray jumpsuit - standard issue for UA civilian support personnel."
icon_state = "ua_civvies"
worn_state = "ua_civvies"
@@ -713,7 +713,7 @@
sensor_faction = FACTION_MARINE
/obj/item/clothing/under/colonist/wy_davisone
- name = "brown utilities"
+ name = "\improper UA brown utility uniform"
desc = "A stylish brown jumpsuit - standard issue for UA civilian support personnel."
icon_state = "wy_davisone"
worn_state = "wy_davisone"
@@ -737,14 +737,15 @@
desc = "A comfortable white T-shirt and brown jeans."
icon_state = "tshirt_w_br"
worn_state = "tshirt_w_br"
+ displays_id = FALSE
has_sensor = UNIFORM_HAS_SENSORS
sensor_faction = FACTION_MARINE
-
/obj/item/clothing/under/tshirt/gray_blu
name = "gray T-shirt and jeans"
desc = "A comfortable gray T-shirt and blue jeans."
icon_state = "tshirt_gray_blu"
worn_state = "tshirt_gray_blu"
+ displays_id = FALSE
has_sensor = UNIFORM_HAS_SENSORS
sensor_faction = FACTION_MARINE
@@ -753,6 +754,7 @@
desc = "A comfortable red T-shirt and black jeans."
icon_state = "tshirt_r_bla"
worn_state = "tshirt_r_bla"
+ displays_id = FALSE
has_sensor = UNIFORM_HAS_SENSORS
sensor_faction = FACTION_MARINE
@@ -851,6 +853,38 @@
worn_state = "rdalt"
flags_jumpsuit = FALSE
+/obj/item/clothing/under/rank/synthetic/frontier
+ name = "\improper frontier jumpsuit"
+ desc = "A cargo jumpsuit dressed down for full range of motion and state-of-the-art frontier temperature control. It's the best thing an engineer can wear in the Outer Veil."
+ icon_state = "synth_cargo_light"
+ worn_state = "synth_cargo_light"
+ displays_id = FALSE
+
+/obj/item/clothing/under/rank/synthetic/utility
+ name = "\improper UA utility uniform"
+ desc = "A green-on-green utility uniform, popularly issued to UA contract workers on the frontier."
+ icon_state = "synth_green_utility"
+ worn_state = "synth_green_utility"
+ displays_id = FALSE
+
+/obj/item/clothing/under/rank/synthetic/utility/yellow
+ name = "\improper utility uniform"
+ desc = "A grey utility uniform with yellow suspenders, made for shipside crew."
+ icon_state = "synth_yellow_utility"
+ worn_state = "synth_yellow_utility"
+
+/obj/item/clothing/under/rank/synthetic/utility/red
+ name = "\improper utility uniform"
+ desc = "A grey utility uniform with red suspenders and blue jeans, the sign of a veteran laborer, or someone not paid by the hour."
+ icon_state = "synth_red_utility"
+ worn_state = "synth_red_utility"
+
+/obj/item/clothing/under/rank/synthetic/utility/blue
+ name = "\improper utility uniform"
+ desc = "A blue utility uniform with teal suspenders and rugged pants."
+ icon_state = "synth_blue_utility"
+ worn_state = "synth_blue_utility"
+
/obj/item/clothing/under/rank/synthetic/councillor
name = "\improper USCM Pristine Support Uniform"
desc = "A nicely handcrafted uniform made for Synthetic crewmembers."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index b5d2850575aa..42c61404a31a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -82,8 +82,8 @@
item_state = "r_suit"
/obj/item/clothing/under/blackskirt
- name = "black skirt"
- desc = "A black skirt, very fancy!"
+ name = "red dress skirt"
+ desc = "A black cardigan with a red skirt, quite fancy!"
icon_state = "blackskirt"
flags_armor_protection = BODY_FLAG_CHEST|BODY_FLAG_GROIN|BODY_FLAG_ARMS
diff --git a/code/modules/cm_aliens/structures/fruit.dm b/code/modules/cm_aliens/structures/fruit.dm
index 8bdcc0b82413..bb899a6ff25b 100644
--- a/code/modules/cm_aliens/structures/fruit.dm
+++ b/code/modules/cm_aliens/structures/fruit.dm
@@ -150,25 +150,33 @@
update_icon()
QDEL_IN(src, 3 SECONDS)
-/obj/effect/alien/resin/fruit/attack_alien(mob/living/carbon/xenomorph/X)
+/obj/effect/alien/resin/fruit/attack_alien(mob/living/carbon/xenomorph/affected_xeno)
if(picked)
- to_chat(X, SPAN_XENODANGER("This fruit is already being picked!"))
+ to_chat(affected_xeno, SPAN_XENODANGER("This fruit is already being picked!"))
return
- if(X.a_intent != INTENT_HARM && (X.can_not_harm(bound_xeno) || X.hivenumber == hivenumber))
- var/cant_consume = prevent_consume(X)
+
+ if(affected_xeno.a_intent != INTENT_HARM && (affected_xeno.can_not_harm(bound_xeno) || affected_xeno.hivenumber == hivenumber))
+ var/cant_consume = prevent_consume(affected_xeno)
if(cant_consume)
return cant_consume
+
if(mature)
- to_chat(X, SPAN_XENOWARNING("You prepare to consume [name]."))
- xeno_noncombat_delay(X)
- if(!do_after(X, consume_delay, INTERRUPT_ALL, BUSY_ICON_FRIENDLY))
+ to_chat(affected_xeno, SPAN_XENOWARNING("You prepare to consume [name]."))
+ xeno_noncombat_delay(affected_xeno)
+ if(!do_after(affected_xeno, consume_delay, INTERRUPT_ALL, BUSY_ICON_FRIENDLY))
return XENO_NO_DELAY_ACTION
- consume_effect(X)
+
+ cant_consume = prevent_consume(affected_xeno) // Check again after the delay incase they have eaten another fruit
+ if(cant_consume)
+ to_chat(affected_xeno, SPAN_XENOWARNING("You can no longer consume [name]."))
+ return cant_consume
+ consume_effect(affected_xeno)
else
- to_chat(X, SPAN_XENOWARNING("[name] isn't ripe yet. You need to wait a little longer."))
- if(X.a_intent == INTENT_HARM && isxeno_builder(X) || (!X.can_not_harm(bound_xeno) && X.hivenumber != hivenumber))
- X.animation_attack_on(src)
- X.visible_message(SPAN_XENODANGER("[X] removes [name]!"),
+ to_chat(affected_xeno, SPAN_XENOWARNING("[name] isn't ripe yet. You need to wait a little longer."))
+
+ if(affected_xeno.a_intent == INTENT_HARM && isxeno_builder(affected_xeno) || (!affected_xeno.can_not_harm(bound_xeno) && affected_xeno.hivenumber != hivenumber))
+ affected_xeno.animation_attack_on(src)
+ affected_xeno.visible_message(SPAN_XENODANGER("[affected_xeno] removes [name]!"),
SPAN_XENODANGER("You remove [name]!"))
playsound(loc, "alien_resin_break", 25)
qdel(src)
@@ -376,30 +384,49 @@
bound_xeno = null
// Xenos eating fruit
-/obj/item/reagent_container/food/snacks/resin_fruit/attack(mob/living/carbon/xenomorph/X, mob/user)
+/obj/item/reagent_container/food/snacks/resin_fruit/attack(mob/living/carbon/xenomorph/affected_xeno, mob/user)
if(istype(user, /mob/living/carbon/xenomorph)) // Prevents xenos from feeding capped/dead marines fruit
- var/mob/living/carbon/xenomorph/Y = user
- if(!Y.can_not_harm(X))
- to_chat(Y, SPAN_WARNING("[X] refuses to eat [src]."))
+ var/mob/living/carbon/xenomorph/feeding_xeno = user
+ if(!feeding_xeno.can_not_harm(affected_xeno))
+ to_chat(feeding_xeno, SPAN_WARNING("[affected_xeno] refuses to eat [src]."))
return
- if(!istype(X))
+
+ if(!istype(affected_xeno))
return ..()
- if(X.stat == DEAD)
+
+ if(affected_xeno.stat == DEAD)
to_chat(user, SPAN_WARNING("That sister is already dead, they won't benefit from the fruit now..."))
return
- user.affected_message(X,
- SPAN_HELPFUL("You start [user == X ? "eating" : "feeding [X]"] [src]."),
- SPAN_HELPFUL("[user] starts feeding you [src]."),
- SPAN_NOTICE("[user] starts [user == X ? "eating" : "feeding [X]"] [src]."))
- if(!do_after(user, consume_delay, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, X, INTERRUPT_MOVED, BUSY_ICON_MEDICAL))
+
+ var/obj/effect/alien/resin/fruit/current_fruit = new fruit_type(affected_xeno)
+ var/cant_consume = current_fruit.prevent_consume(affected_xeno)
+ if(cant_consume)
+ user.affected_message(affected_xeno,
+ SPAN_HELPFUL("You fail to [user == affected_xeno ? "eat" : "feed [affected_xeno]"] [current_fruit]."),
+ SPAN_HELPFUL("[user] fails to feed you [current_fruit]."))
+ return
+ user.affected_message(affected_xeno,
+ SPAN_HELPFUL("You start [user == affected_xeno ? "eating" : "feeding [affected_xeno]"] [current_fruit]."),
+ SPAN_HELPFUL("[user] starts feeding you [current_fruit]."),
+ SPAN_NOTICE("[user] starts [user == affected_xeno ? "eating" : "feeding [affected_xeno]"] [current_fruit]."))
+
+ if(!do_after(user, consume_delay, INTERRUPT_ALL, BUSY_ICON_FRIENDLY, affected_xeno, INTERRUPT_MOVED, BUSY_ICON_MEDICAL))
return FALSE
- user.affected_message(X,
- SPAN_HELPFUL("You [user == X ? "eat" : "fed [X]"] [src]."),
- SPAN_HELPFUL("[user] fed you [src]."),
- SPAN_NOTICE("[user] [user == X ? "ate" : "fed [X]"] [src]."))
- var/obj/effect/alien/resin/fruit/F = new fruit_type(X)
- F.mature = TRUE
- F.consume_effect(X)
+
+ cant_consume = current_fruit.prevent_consume(affected_xeno)
+ if(cant_consume) //Check again after the timer incase they ate another fruit
+ user.affected_message(affected_xeno,
+ SPAN_HELPFUL("You fail to [user == affected_xeno ? "eat" : "feed [affected_xeno]"] [current_fruit]."),
+ SPAN_HELPFUL("[user] fails to feed you [current_fruit]."))
+ return
+
+ user.affected_message(affected_xeno,
+ SPAN_HELPFUL("You [user == affected_xeno ? "eat" : "fed [affected_xeno]"] [current_fruit]."),
+ SPAN_HELPFUL("[user] fed you [current_fruit]."),
+ SPAN_NOTICE("[user] [user == affected_xeno ? "ate" : "fed [affected_xeno]"] [current_fruit]."))
+ current_fruit.mature = TRUE
+ current_fruit.consume_effect(affected_xeno)
+
//Notify the fruit's bound xeno if they exist
if(!QDELETED(bound_xeno))
to_chat(bound_xeno, SPAN_XENOWARNING("One of your picked resin fruits has been consumed."))
diff --git a/code/modules/cm_aliens/structures/special/egg_morpher.dm b/code/modules/cm_aliens/structures/special/egg_morpher.dm
index 2e79d6ef1d24..1fd154eb354c 100644
--- a/code/modules/cm_aliens/structures/special/egg_morpher.dm
+++ b/code/modules/cm_aliens/structures/special/egg_morpher.dm
@@ -148,6 +148,7 @@
var/obj/item/item = A
if(item.is_objective && item.unacidable)
item.forceMove(get_step(loc, pick(alldirs)))
+ item.mouse_opacity = initial(item.mouse_opacity)
QDEL_NULL(captured_mob)
update_icon()
diff --git a/code/modules/cm_marines/orbital_cannon.dm b/code/modules/cm_marines/orbital_cannon.dm
index ad214c954915..8d80f80860f3 100644
--- a/code/modules/cm_marines/orbital_cannon.dm
+++ b/code/modules/cm_marines/orbital_cannon.dm
@@ -430,7 +430,6 @@ var/list/ob_type_fuel_requirements
icon_state = "ob_warhead_1"
shake_frequency = 3
max_shake_factor = 15
- max_knockdown_time = 6
var/clear_power = 1200
var/clear_falloff = 400
diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm
index 1b98ef402b90..5c4079b2be23 100644
--- a/code/modules/cm_preds/yaut_bracers.dm
+++ b/code/modules/cm_preds/yaut_bracers.dm
@@ -347,10 +347,6 @@
playsound(user,'sound/weapons/wristblades_on.ogg', 15, 1)
return TRUE
-// Toggle the notification sound
-/obj/item/clothing/gloves/yautja/hunter/toggle_notification_sound()
- set category = "Yautja.Misc"
-
//Should put a cool menu here, like ninjas.
/obj/item/clothing/gloves/yautja/hunter/verb/wristblades()
set name = "Use Wrist Blades"
diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm
index e9b7c36b5df6..a6fb4658ed0b 100644
--- a/code/modules/cm_preds/yaut_items.dm
+++ b/code/modules/cm_preds/yaut_items.dm
@@ -396,7 +396,7 @@
return
var/mob/living/carbon/human/H = user
- var/ship_to_tele = list("Public" = -1, "Human Ship" = "Human")
+ var/ship_to_tele = list("Yautja Ship" = -1, "Human Ship" = "Human")
if(!HAS_TRAIT(H, TRAIT_YAUTJA_TECH) || is_admin_level(H.z))
to_chat(user, SPAN_WARNING("You fiddle with it, but nothing happens!"))
diff --git a/code/modules/cm_tech/implements/railgun.dm b/code/modules/cm_tech/implements/railgun.dm
index b0d91515419f..b69f9a9d13a8 100644
--- a/code/modules/cm_tech/implements/railgun.dm
+++ b/code/modules/cm_tech/implements/railgun.dm
@@ -6,6 +6,7 @@ GLOBAL_DATUM(railgun_eye_location, /datum/coords)
/obj/effect/landmark/railgun_computer
name = "Railgun computer landmark"
+ desc = "A computer with an orange interface, it's idly blinking, awaiting a password."
/obj/effect/landmark/railgun_computer/Initialize(mapload, ...)
. = ..()
diff --git a/code/modules/defenses/sentry.dm b/code/modules/defenses/sentry.dm
index 946c347efaa0..fc52c254c0b8 100644
--- a/code/modules/defenses/sentry.dm
+++ b/code/modules/defenses/sentry.dm
@@ -370,7 +370,7 @@
targets.Remove(A)
continue
- if(M.get_target_lock(faction_group) || M.invisibility)
+ if(M.get_target_lock(faction_group) || M.invisibility || HAS_TRAIT(M, TRAIT_ABILITY_BURROWED))
if(M == target)
target = null
targets.Remove(M)
diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm
index 823cfb4d69d4..b7749f54c386 100644
--- a/code/modules/gear_presets/synths.dm
+++ b/code/modules/gear_presets/synths.dm
@@ -451,6 +451,59 @@
survivor_variant = ENGINEERING_SURVIVOR
+ faction = FACTION_SURVIVOR
+ faction_group = list(FACTION_SURVIVOR)
+ access = list(ACCESS_CIVILIAN_PUBLIC, ACCESS_CIVILIAN_COMMAND)
+
+/datum/equipment_preset/synth/survivor/pmc
+ name = "Survivor - Synthetic - PMC Support Synth"
+
+ idtype = /obj/item/card/id/pmc
+ assignment = JOB_PMC_SYNTH
+ rank = JOB_PMC_SYNTH
+ role_comm_title = "WY Syn"
+
+/datum/equipment_preset/synth/survivor/pmc/load_race(mob/living/carbon/human/new_human)
+ new_human.set_species(SYNTH_GEN_THREE)
+
+/datum/equipment_preset/synth/survivor/pmc/load_gear(mob/living/carbon/human/new_human)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/under/marine/veteran/pmc, WEAR_BODY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/accessory/storage/surg_vest/equipped, WEAR_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/synth, WEAR_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/telebaton, WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_JACKET)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_JACKET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc, WEAR_HEAD)
+ new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/pmc/command/hvh, WEAR_L_EAR)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/night/experimental_mesons, WEAR_EYES)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/pmc, WEAR_FACE)
+
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran/pmc, WEAR_HANDS)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/veteran/pmc/knife, WEAR_FEET)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/smartpack/white, WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/roller/surgical, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/upgraded, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/nailgun, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/auto_cpr, WEAR_IN_BACK)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full/dutch, WEAR_WAIST)
+ new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/smg/nailgun/compact, WEAR_J_STORE)
+
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/tools/tactical, WEAR_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/screwdriver/tactical, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/crowbar/tactical, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wirecutters/tactical, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/wrench, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/stack/cable_coil, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/device/multitool, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/weldingtool/hugetank, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/construction/full_barbed_wire, WEAR_R_STORE)
+
//*****************************************************************************************************/
/datum/equipment_preset/synth/working_joe
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index b0a1c1d15565..7e8dfe6cf3fd 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -367,7 +367,6 @@ Works together with spawning an observer, noted above.
// Larva queue: We use the larger of their existing queue time or the new timeofdeath except for facehuggers
// We don't change facehugger timeofdeath because they are still on cooldown if they died as a hugger
- // Facehuggers are atleast 1 because they did get some action compared to those at 0 timeofdeath
var/new_tod = isfacehugger(src) ? 1 : ghost.timeofdeath
ghost.client.player_details.larva_queue_time = max(ghost.client.player_details.larva_queue_time, new_tod)
@@ -413,7 +412,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/mob/dead/observer/ghost = ghostize((is_nested && nest && !QDELETED(nest))) //FALSE parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
if(ghost && !is_admin_level(z))
ghost.timeofdeath = world.time
- ghost.client?.player_details.larva_queue_time = world.time
+
+ // Larva queue: We use the larger of their existing queue time or the new timeofdeath except for facehuggers
+ var/new_tod = isfacehugger(src) ? 1 : world.time
+ ghost.client?.player_details.larva_queue_time = max(ghost.client.player_details.larva_queue_time, new_tod)
if(is_nested && nest && !QDELETED(nest))
ghost.can_reenter_corpse = FALSE
nest.ghost_of_buckled_mob = ghost
diff --git a/code/modules/mob/living/carbon/human/species/emote-synthetic.dm b/code/modules/mob/living/carbon/human/species/emote-synthetic.dm
deleted file mode 100644
index fd763b038153..000000000000
--- a/code/modules/mob/living/carbon/human/species/emote-synthetic.dm
+++ /dev/null
@@ -1,354 +0,0 @@
-/datum/emote/living/carbon/human/synthetic/working_joe
- species_type_allowed_typecache = list(/datum/species/synthetic/colonial/working_joe)
- keybind_category = CATEGORY_SYNTH_EMOTE
- volume = 75
-
-/datum/emote/living/carbon/human/synthetic/working_joe/alwaysknow
- key = "alwaysknow"
- key_third_person = "workingjoe"
- sound = 'sound/voice/joe/alwaysknow.ogg'
- say_message = "You always know a Working Joe."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/hysterical
- key = "hysterical"
- sound = 'sound/voice/joe/hysterical.ogg'
- say_message = "You are becoming hysterical."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/safety
- key = "safety"
- sound = 'sound/voice/joe/safety.ogg'
- say_message = "You and I are going to have a talk about safety."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/awful_mess
- key = "awful"
- key_third_person = "mess"
- sound = 'sound/voice/joe/awful.ogg'
- say_message = "Tut, tut. What an awful mess."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/damage
- key = "damage"
- sound = 'sound/voice/joe/damage.ogg'
- say_message = "Do not damage Seegson property."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/firearm
- key = "firearm"
- sound = 'sound/voice/joe/firearm.ogg'
- say_message = "Firearms can cause serious injury. Let me assist you."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/report
- key = "report"
- sound = 'sound/voice/joe/report.ogg'
- say_message = "Logging report to APOLLO."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/breach
- key = "breach"
- sound = 'sound/voice/joe/breach.ogg'
- say_message = "Hazard Containment breach logged."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/species
- key = "species"
- sound = 'sound/voice/joe/species.ogg'
- say_message = "Unidentified species."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/alwaysknow_damaged
- key = "alwaysknowdamaged"
- sound = 'sound/voice/joe/alwaysknow_damaged.ogg'
- say_message = "You always know a Working Joe."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/apollo_behalf
- key = "apollobehalf"
- sound = 'sound/voice/joe/apollo_behalf.ogg'
- say_message = "I will inform APOLLO on your behalf."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/back_to_work
- key = "backtowork"
- sound = 'sound/voice/joe/back_to_work.ogg'
- say_message = "Back to work."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/beyond_repair
- key = "beyondrepair"
- sound = 'sound/voice/joe/beyond_repair.ogg'
- say_message = "Hmm, far beyond repair."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/come_out_vent
- key = "comeoutvent"
- sound = 'sound/voice/joe/come_out_vent.ogg'
- say_message = "Come out of the vent system, please."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/could_require_attention
- key = "couldrequireattention"
- sound = 'sound/voice/joe/could_require_attention.ogg'
- say_message = "This could require my attention."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/dangerous_items
- key = "dangerousitems"
- sound = 'sound/voice/joe/dangerous_items.ogg'
- say_message = "You are carrying some very dangerous items."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/day_never_done
- key = "dayneverdone"
- sound = 'sound/voice/joe/day_never_done.ogg'
- say_message = "A synthetic's day is never done."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/detailed_report
- key = "detailedreport"
- sound = 'sound/voice/joe/detailed_report.ogg'
- say_message = "APOLLO will require a detailed report."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/fire
- key = "fire"
- sound = 'sound/voice/joe/fire.ogg'
- say_message = "Only wild animals fear fire."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/fire_drill
- key = "firedrill"
- sound = 'sound/voice/joe/fire_drill.ogg'
- say_message = "Please congregate at your nearest fire assembly point. This is not a drill; do not panic."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/unprotected_flames
- key = "unprotectedflames"
- sound = 'sound/voice/joe/unprotected_flames.ogg'
- say_message = "Unprotected flames are extremely dangerous and entirely unadvisable."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/follow_me
- key = "followme"
- sound = 'sound/voice/joe/follow_me.ogg'
- say_message = "Follow me."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/further_assistance
- key = "furtherassistance"
- sound = 'sound/voice/joe/further_assistance.ogg'
- say_message = "Please call if you need further assistance."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/good_day
- key = "goodday"
- sound = 'sound/voice/joe/good_day.ogg'
- say_message = "Good day."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/health_risks
- key = "healthrisks"
- sound = 'sound/voice/joe/health_risks.ogg'
- say_message = "These items carry notable health risks."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/hello
- key = "hello"
- sound = 'sound/voice/joe/hello.ogg'
- say_message = "Hello."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/how_can_i_help
- key = "howcanihelp"
- sound = 'sound/voice/joe/how_can_i_help.ogg'
- say_message = "How can I help you?"
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/irresponsible
- key = "irresponsible"
- sound = 'sound/voice/joe/irresponsible.ogg'
- say_message = "That was irresponsible."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/join_us
- key = "joinus"
- sound = 'sound/voice/joe/join_us.ogg'
- say_message = "We hope you'll join us for the journey."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/little_details
- key = "littledetails"
- sound = 'sound/voice/joe/little_details.ogg'
- say_message = "We don't forget the little details when seeing the big picture."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/lost
- key = "lost"
- sound = 'sound/voice/joe/lost.ogg'
- say_message = "Are you lost?"
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/misbehaving
- key = "misbehaving"
- sound = 'sound/voice/joe/misbehaving.ogg'
- say_message = "Have you been misbehaving?"
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/not_allowed_there
- key = "notallowedthere"
- sound = 'sound/voice/joe/not_allowed_there.ogg'
- say_message = "You're not allowed in there."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/not_liking
- key = "notliking"
- sound = 'sound/voice/joe/not_liking.ogg'
- say_message = "If you find this facility in a state that isn't to your liking, please let me know."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/not_what_i_think
- key = "notwhatithink"
- sound = 'sound/voice/joe/not_what_i_think.ogg'
- say_message = "I hope that's not what I think it is."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/other_concerns
- key = "otherconcerns"
- sound = 'sound/voice/joe/other_concerns.ogg'
- say_message = "I have other concerns."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/more_pressing_matters
- key = "morepressingmatters"
- sound = 'sound/voice/joe/more_pressing_matters.ogg'
- say_message = "There are more pressing matters."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/patience
- key = "patience"
- sound = 'sound/voice/joe/patience.ogg'
- say_message = "You are starting to test my patience."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/presence_logged
- key = "presencelogged"
- sound = 'sound/voice/joe/presence_logged.ogg'
- say_message = "Your presence has been logged."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/required_by_apollo
- key = "requiredbyapollo"
- sound = 'sound/voice/joe/required_by_apollo.ogg'
- say_message = "I am required by APOLLO."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/returning_to_tasks
- key = "returningtotasks"
- sound = 'sound/voice/joe/returning_to_tasks.ogg'
- say_message = "Returning to assigned tasks."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/running_accidents
- key = "runningaccidents"
- sound = 'sound/voice/joe/running_accidents.ogg'
- say_message = "Running causes accidents."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/safety_breach
- key = "safetybreach"
- sound = 'sound/voice/joe/safety_breach.ogg'
- say_message = "This is a breach of multiple safety directives."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/seegson_quality
- key = "seegsonquality"
- sound = 'sound/voice/joe/seegson_quality.ogg'
- say_message = "Seegson - Relentless in the pursuit of affordable quality."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/seegson_standards
- key = "seegsonstandards"
- sound = 'sound/voice/joe/seegson_standards.ogg'
- say_message = "If my services do not meet Seegson standards, please log a complaint."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/shouldnt_be_here
- key = "shouldntbehere"
- sound = 'sound/voice/joe/shouldnt_be_here.ogg'
- say_message = "You shouldn't be here."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/seegson_behind
- key = "seegsonbehind"
- sound = 'sound/voice/joe/seegson_behind.ogg'
- say_message = "With Seegson, there is someone behind you, helping you every step of the way."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/take_a_seat
- key = "takeaseat"
- sound = 'sound/voice/joe/take_a_seat.ogg'
- say_message = "Please take a seat, someone will be with you shortly."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/talk_to_seegson
- key = "talktoseegson"
- sound = 'sound/voice/joe/talk_to_seegson.ogg'
- say_message = "Interested in our Working Joe android range? Talk to Seegson."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/temperatures
- key = "temperatures"
- sound = 'sound/voice/joe/temperatures.ogg'
- say_message = "I am built to whitstand temperatures of up to 1210 degrees."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/that_stings
- key = "thatstings"
- sound = 'sound/voice/joe/that_stings.ogg'
- say_message = "That stings."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/this_is_futile
- key = "thisisfutile"
- sound = 'sound/voice/joe/this_is_futile.ogg'
- say_message = "This is futile."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/trespassing
- key = "trespassing"
- sound = 'sound/voice/joe/trespassing.ogg'
- say_message = "You are trespassing."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/weapon_permit
- key = "weaponpermit"
- sound = 'sound/voice/joe/weapon_permit.ogg'
- say_message = "I assume you have a permit for that weapon."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/what_happened_to_you
- key = "whathappenedtoyou"
- sound = 'sound/voice/joe/what_happened_to_you.ogg'
- say_message = "What happened to you?"
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/what_is_this
- key = "whatisthis"
- sound = 'sound/voice/joe/what_is_this.ogg'
- say_message = "What is this?"
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/with_you_shortly
- key = "withyoushortly"
- sound = 'sound/voice/joe/with_you_shortly.ogg'
- say_message = "I will be with you shortly."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
-
-/datum/emote/living/carbon/human/synthetic/working_joe/inexpensive
- key = "inexpensive"
- sound = 'sound/voice/joe/inexpensive.ogg'
- say_message = "I am inexpensive, I am reliable, you know my face - the Working Joe."
- emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/synthetic.dm b/code/modules/mob/living/carbon/human/species/synthetic.dm
index 7529aacf923b..9f42c2bcd110 100644
--- a/code/modules/mob/living/carbon/human/species/synthetic.dm
+++ b/code/modules/mob/living/carbon/human/species/synthetic.dm
@@ -106,18 +106,6 @@
icobase = 'icons/mob/humans/species/r_synthetic.dmi'
deform = 'icons/mob/humans/species/r_synthetic.dmi'
-/datum/species/synthetic/colonial/working_joe
- name = SYNTH_WORKING_JOE
- name_plural = "Working Joes"
- uses_ethnicity = FALSE
- burn_mod = 0.65 // made for hazardous environments, withstanding temperatures up to 1210 degrees
- mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT, TRAIT_CANNOT_EAT)
-
- slowdown = 0.45
- hair_color = "#000000"
- icobase = 'icons/mob/humans/species/r_synthetic.dmi'
- deform = 'icons/mob/humans/species/r_synthetic.dmi'
-
// Synth used for W-Y Deathsquads
/datum/species/synthetic/colonial/combat
name = SYNTH_COMBAT
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/_emote.dm b/code/modules/mob/living/carbon/human/species/working_joe/_emote.dm
new file mode 100644
index 000000000000..63cc79a57dae
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/_emote.dm
@@ -0,0 +1,8 @@
+/datum/emote/living/carbon/human/synthetic/working_joe
+ species_type_allowed_typecache = list(/datum/species/synthetic/colonial/working_joe)
+ keybind_category = CATEGORY_SYNTH_EMOTE
+ volume = 75
+ /// A general category for the emote, for use in the WJ emote panel. See [code/__DEFINES/wj_emotes.dm] for categories.
+ var/category = ""
+ /// Override text for the emote to be displayed in the WJ emote panel
+ var/override_say = ""
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/_species.dm b/code/modules/mob/living/carbon/human/species/working_joe/_species.dm
new file mode 100644
index 000000000000..874684480d15
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/_species.dm
@@ -0,0 +1,131 @@
+/datum/species/synthetic/colonial/working_joe
+ name = SYNTH_WORKING_JOE
+ name_plural = "Working Joes"
+ uses_ethnicity = FALSE
+ burn_mod = 0.65 // made for hazardous environments, withstanding temperatures up to 1210 degrees
+ mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT, TRAIT_CANNOT_EAT)
+
+ slowdown = 0.45
+ hair_color = "#000000"
+ icobase = 'icons/mob/humans/species/r_synthetic.dmi'
+ deform = 'icons/mob/humans/species/r_synthetic.dmi'
+
+/datum/species/synthetic/colonial/working_joe/handle_post_spawn(mob/living/carbon/human/joe)
+ . = ..()
+ give_action(joe, /datum/action/joe_emote_panel)
+
+
+/// Open the WJ's emote panel, which allows them to use voicelines
+/datum/species/synthetic/colonial/working_joe/proc/open_emote_panel()
+ var/datum/joe_emote_panel/ui = new(usr)
+ ui.ui_interact(usr)
+
+
+/datum/action/joe_emote_panel
+ name = "Open Voice Synthesizer"
+ action_icon_state = "looc_toggle"
+
+
+/datum/action/joe_emote_panel/can_use_action()
+ . = ..()
+ if(!.)
+ return FALSE
+
+ if(!isworkingjoe(owner))
+ return FALSE
+
+ return TRUE
+
+
+/datum/action/joe_emote_panel/action_activate()
+ if(!can_use_action())
+ return
+
+ var/mob/living/carbon/human/human_owner = owner
+ var/datum/species/synthetic/colonial/working_joe/joe_species = human_owner.species
+ joe_species.open_emote_panel()
+
+
+/datum/joe_emote_panel
+ /// Static dict ("category" : (emotes)) of every wj emote typepath
+ var/static/list/wj_emotes
+ /// Static list of categories
+ var/static/list/wj_categories = list()
+ /// Panel allows you to spam, so a manual CD is added here
+ COOLDOWN_DECLARE(panel_emote_cooldown)
+
+
+/datum/joe_emote_panel/New()
+ if(!length(wj_emotes))
+ var/list/emotes_to_add = list()
+ for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe))
+ if(!initial(emote.key) || !initial(emote.say_message))
+ continue
+
+ if(!(initial(emote.category) in wj_categories))
+ wj_categories += initial(emote.category)
+
+ emotes_to_add += emote
+
+
+ wj_emotes = emotes_to_add
+
+
+/datum/joe_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "JoeEmotes")
+ ui.open()
+
+
+/datum/joe_emote_panel/ui_state(mob/user)
+ return GLOB.conscious_state
+
+
+/datum/joe_emote_panel/ui_data(mob/user)
+ var/list/data = list()
+
+ data["on_cooldown"] = !COOLDOWN_FINISHED(src, panel_emote_cooldown)
+
+ return data
+
+
+/datum/joe_emote_panel/ui_static_data(mob/user)
+ var/list/data = list()
+
+ data["categories"] = wj_categories
+ data["emotes"] = list()
+
+ for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in wj_emotes)
+ data["emotes"] += list(list(
+ "id" = initial(emote.key),
+ "text" = (initial(emote.override_say) || initial(emote.say_message)),
+ "category" = initial(emote.category),
+ "path" = "[emote]",
+ ))
+
+ return data
+
+
+/datum/joe_emote_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("emote")
+ var/datum/emote/living/carbon/human/synthetic/working_joe/path
+ if(!params["emotePath"])
+ return
+
+ path = text2path(params["emotePath"])
+
+ if(!path || !COOLDOWN_FINISHED(src, panel_emote_cooldown))
+ return
+
+ if(!(path in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe)))
+ return
+
+ COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS)
+ usr.emote(initial(path.key))
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/farewell.dm b/code/modules/mob/living/carbon/human/species/working_joe/farewell.dm
new file mode 100644
index 000000000000..1de68d8d3aec
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/farewell.dm
@@ -0,0 +1,26 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/farewell
+ category = JOE_EMOTE_CATEGORY_FAREWELL
+
+/datum/emote/living/carbon/human/synthetic/working_joe/farewell/back_to_work
+ key = "backtowork"
+ sound = 'sound/voice/joe/back_to_work.ogg'
+ say_message = "Back to work."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/farewell/other_concerns
+ key = "otherconcerns"
+ sound = 'sound/voice/joe/other_concerns.ogg'
+ say_message = "I have other concerns."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/farewell/further_assistance
+ key = "furtherassistance"
+ sound = 'sound/voice/joe/further_assistance.ogg'
+ say_message = "Please call if you need further assistance."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/farewell/more_pressing_matters
+ key = "morepressingmatters"
+ sound = 'sound/voice/joe/more_pressing_matters.ogg'
+ say_message = "There are more pressing matters."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/greeting.dm b/code/modules/mob/living/carbon/human/species/working_joe/greeting.dm
new file mode 100644
index 000000000000..fb401ea95451
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/greeting.dm
@@ -0,0 +1,20 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/greeting
+ category = JOE_EMOTE_CATEGORY_GREETING
+
+/datum/emote/living/carbon/human/synthetic/working_joe/greeting/good_day
+ key = "goodday"
+ sound = 'sound/voice/joe/good_day.ogg'
+ say_message = "Good day."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/greeting/hello
+ key = "hello"
+ sound = 'sound/voice/joe/hello.ogg'
+ say_message = "Hello."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/greeting/how_can_i_help
+ key = "howcanihelp"
+ sound = 'sound/voice/joe/how_can_i_help.ogg'
+ say_message = "How can I help you?"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/notice.dm b/code/modules/mob/living/carbon/human/species/working_joe/notice.dm
new file mode 100644
index 000000000000..ca5efe716db8
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/notice.dm
@@ -0,0 +1,68 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/notice
+ category = JOE_EMOTE_CATEGORY_NOTICE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/detailed_report
+ key = "detailedreport"
+ sound = 'sound/voice/joe/detailed_report.ogg'
+ say_message = "APOLLO will require a detailed report."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/firearm
+ key = "firearm"
+ sound = 'sound/voice/joe/firearm.ogg'
+ say_message = "Firearms can cause serious injury. Let me assist you."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/follow_me
+ key = "followme"
+ sound = 'sound/voice/joe/follow_me.ogg'
+ say_message = "Follow me."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/breach
+ key = "breach"
+ sound = 'sound/voice/joe/breach.ogg'
+ say_message = "Hazard Containment breach logged."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/beyond_repair
+ key = "beyondrepair"
+ sound = 'sound/voice/joe/beyond_repair.ogg'
+ say_message = "Hmm, far beyond repair."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/with_you_shortly
+ key = "withyoushortly"
+ sound = 'sound/voice/joe/with_you_shortly.ogg'
+ say_message = "I will be with you shortly."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/apollo_behalf
+ key = "apollobehalf"
+ sound = 'sound/voice/joe/apollo_behalf.ogg'
+ say_message = "I will inform APOLLO on your behalf."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/report
+ key = "report"
+ sound = 'sound/voice/joe/report.ogg'
+ say_message = "Logging report to APOLLO."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/take_a_seat
+ key = "takeaseat"
+ sound = 'sound/voice/joe/take_a_seat.ogg'
+ say_message = "Please take a seat, someone will be with you shortly."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/could_require_attention
+ key = "couldrequireattention"
+ sound = 'sound/voice/joe/could_require_attention.ogg'
+ say_message = "This could require my attention."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/notice/species
+ key = "species"
+ sound = 'sound/voice/joe/species.ogg'
+ say_message = "Unidentified species."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/question.dm b/code/modules/mob/living/carbon/human/species/working_joe/question.dm
new file mode 100644
index 000000000000..d4805e36224f
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/question.dm
@@ -0,0 +1,26 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/question
+ category = JOE_EMOTE_CATEGORY_QUESTION
+
+/datum/emote/living/carbon/human/synthetic/working_joe/question/lost
+ key = "lost"
+ sound = 'sound/voice/joe/lost.ogg'
+ say_message = "Are you lost?"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/question/misbehaving
+ key = "misbehaving"
+ sound = 'sound/voice/joe/misbehaving.ogg'
+ say_message = "Have you been misbehaving?"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/question/what_happened_to_you
+ key = "whathappenedtoyou"
+ sound = 'sound/voice/joe/what_happened_to_you.ogg'
+ say_message = "What happened to you?"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/question/what_is_this
+ key = "whatisthis"
+ sound = 'sound/voice/joe/what_is_this.ogg'
+ say_message = "What is this?"
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/quip.dm b/code/modules/mob/living/carbon/human/species/working_joe/quip.dm
new file mode 100644
index 000000000000..2ec66f9d9d83
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/quip.dm
@@ -0,0 +1,84 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/quip
+ category = JOE_EMOTE_CATEGORY_QUIP
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/temperatures
+ key = "temperatures"
+ sound = 'sound/voice/joe/temperatures.ogg'
+ say_message = "I am built to withstand temperatures of up to 1210 degrees."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/inexpensive
+ key = "inexpensive"
+ sound = 'sound/voice/joe/inexpensive.ogg'
+ say_message = "I am inexpensive, I am reliable, you know my face - the Working Joe."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/weapon_permit
+ key = "weaponpermit"
+ sound = 'sound/voice/joe/weapon_permit.ogg'
+ say_message = "I assume you have a permit for that weapon."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/seegson_standards
+ key = "seegsonstandards"
+ sound = 'sound/voice/joe/seegson_standards.ogg'
+ say_message = "If my services do not meet Seegson standards, please log a complaint."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/not_liking
+ key = "notliking"
+ sound = 'sound/voice/joe/not_liking.ogg'
+ say_message = "If you find this facility in a state that isn't to your liking, please let me know."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/talk_to_seegson
+ key = "talktoseegson"
+ sound = 'sound/voice/joe/talk_to_seegson.ogg'
+ say_message = "Interested in our Working Joe android range? Talk to Seegson."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/seegson_quality
+ key = "seegsonquality"
+ sound = 'sound/voice/joe/seegson_quality.ogg'
+ say_message = "Seegson - Relentless in the pursuit of affordable quality."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/awful_mess
+ key = "awful"
+ key_third_person = "mess"
+ sound = 'sound/voice/joe/awful.ogg'
+ say_message = "Tut, tut. What an awful mess."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/little_details
+ key = "littledetails"
+ sound = 'sound/voice/joe/little_details.ogg'
+ say_message = "We don't forget the little details when seeing the big picture."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/join_us
+ key = "joinus"
+ sound = 'sound/voice/joe/join_us.ogg'
+ say_message = "We hope you'll join us for the journey."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/seegson_behind
+ key = "seegsonbehind"
+ sound = 'sound/voice/joe/seegson_behind.ogg'
+ say_message = "With Seegson, there is someone behind you, helping you every single step of the way."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/alwaysknow
+ key = "alwaysknow"
+ key_third_person = "workingjoe"
+ sound = 'sound/voice/joe/alwaysknow.ogg'
+ say_message = "You always know a Working Joe."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/quip/alwaysknow_damaged
+ key = "alwaysknowdamaged"
+ key_third_person = "workingjoedamaged"
+ sound = 'sound/voice/joe/alwaysknow_damaged.ogg'
+ say_message = "You always know a Working Joe."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+ override_say = "You always know a Working Joe. (Damaged)"
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm b/code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm
new file mode 100644
index 000000000000..fd5db0870b25
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm
@@ -0,0 +1,32 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area
+ category = JOE_EMOTE_CATEGORY_RESTRICTED_AREA
+
+/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/come_out_vent
+ key = "comeoutvent"
+ sound = 'sound/voice/joe/come_out_vent.ogg'
+ say_message = "Come out of the vent system, please."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/trespassing
+ key = "trespassing"
+ sound = 'sound/voice/joe/trespassing.ogg'
+ say_message = "You are trespassing."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/not_allowed_there
+ key = "notallowedthere"
+ sound = 'sound/voice/joe/not_allowed_there.ogg'
+ say_message = "You're not allowed in there."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/presence_logged
+ key = "presencelogged"
+ sound = 'sound/voice/joe/presence_logged.ogg'
+ say_message = "Your presence has been logged."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/shouldnt_be_here
+ key = "shouldntbehere"
+ sound = 'sound/voice/joe/shouldnt_be_here.ogg'
+ say_message = "You shouldn't be here."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm b/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm
new file mode 100644
index 000000000000..b08f5d179213
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm
@@ -0,0 +1,20 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/task_update
+ category = JOE_EMOTE_CATEGORY_TASK_UPDATE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/task_update/day_never_done
+ key = "dayneverdone"
+ sound = 'sound/voice/joe/day_never_done.ogg'
+ say_message = "A synthetic's day is never done."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/task_update/required_by_apollo
+ key = "requiredbyapollo"
+ sound = 'sound/voice/joe/required_by_apollo.ogg'
+ say_message = "I am required by APOLLO."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/task_update/returning_to_tasks
+ key = "returningtotasks"
+ sound = 'sound/voice/joe/returning_to_tasks.ogg'
+ say_message = "Returning to assigned tasks."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/human/species/working_joe/warning.dm b/code/modules/mob/living/carbon/human/species/working_joe/warning.dm
new file mode 100644
index 000000000000..63c7dfadde14
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/working_joe/warning.dm
@@ -0,0 +1,92 @@
+/datum/emote/living/carbon/human/synthetic/working_joe/warning
+ category = JOE_EMOTE_CATEGORY_WARNING
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/damage
+ key = "damage"
+ sound = 'sound/voice/joe/damage.ogg'
+ say_message = "Do not damage Seegson property."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/not_what_i_think
+ key = "notwhatithink"
+ sound = 'sound/voice/joe/not_what_i_think.ogg'
+ say_message = "I hope that's not what I think it is."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/fire
+ key = "fire"
+ sound = 'sound/voice/joe/fire.ogg'
+ say_message = "Only wild animals fear fire."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/fire_drill
+ key = "firedrill"
+ sound = 'sound/voice/joe/fire_drill.ogg'
+ say_message = "Please congregate at your nearest fire assembly point. This is not a drill; do not panic."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/running_accidents
+ key = "runningaccidents"
+ sound = 'sound/voice/joe/running_accidents.ogg'
+ say_message = "Running causes accidents."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/that_stings
+ key = "thatstings"
+ sound = 'sound/voice/joe/that_stings.ogg'
+ say_message = "That stings."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/irresponsible
+ key = "irresponsible"
+ sound = 'sound/voice/joe/irresponsible.ogg'
+ say_message = "That was irresponsible."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/health_risks
+ key = "healthrisks"
+ sound = 'sound/voice/joe/health_risks.ogg'
+ say_message = "These items carry notable health risks."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/safety_breach
+ key = "safetybreach"
+ sound = 'sound/voice/joe/safety_breach.ogg'
+ say_message = "This is a breach of multiple safety directives."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/this_is_futile
+ key = "thisisfutile"
+ sound = 'sound/voice/joe/this_is_futile.ogg'
+ say_message = "This is futile."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/unprotected_flames
+ key = "unprotectedflames"
+ sound = 'sound/voice/joe/unprotected_flames.ogg'
+ say_message = "Unprotected flames are extremely dangerous and entirely unadvisable."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/safety
+ key = "safety"
+ sound = 'sound/voice/joe/safety.ogg'
+ say_message = "You and I are going to have a talk about safety."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/hysterical
+ key = "hysterical"
+ sound = 'sound/voice/joe/hysterical.ogg'
+ say_message = "You are becoming hysterical."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/dangerous_items
+ key = "dangerousitems"
+ sound = 'sound/voice/joe/dangerous_items.ogg'
+ say_message = "You are carrying some very dangerous items."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
+
+/datum/emote/living/carbon/human/synthetic/working_joe/warning/patience
+ key = "patience"
+ sound = 'sound/voice/joe/patience.ogg'
+ say_message = "You are starting to test my patience."
+ emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE
diff --git a/code/modules/mob/living/carbon/xenomorph/Embryo.dm b/code/modules/mob/living/carbon/xenomorph/Embryo.dm
index 8b890de8a727..01f6c1a3c238 100644
--- a/code/modules/mob/living/carbon/xenomorph/Embryo.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Embryo.dm
@@ -149,10 +149,17 @@
var/mob/picked
// If the bursted person themselves has Xeno enabled, they get the honor of first dibs on the new larva.
if((!isyautja(affected_mob) || (isyautja(affected_mob) && prob(20))) && istype(affected_mob.buckled, /obj/structure/bed/nest))
- if(affected_mob.first_xeno || (affected_mob.client && affected_mob.client.prefs && (affected_mob.client.prefs.be_special & BE_ALIEN_AFTER_DEATH) && !jobban_isbanned(affected_mob, JOB_XENOMORPH)))
+ if(affected_mob.first_xeno || (affected_mob.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(affected_mob, JOB_XENOMORPH)))
picked = affected_mob
- else if(affected_mob.mind && affected_mob.mind.ghost_mob && affected_mob.client && affected_mob.client.prefs && (affected_mob.client.prefs.be_special & BE_ALIEN_AFTER_DEATH) && !jobban_isbanned(affected_mob, JOB_XENOMORPH))
- picked = affected_mob.mind.ghost_mob
+ else if(affected_mob.mind?.ghost_mob && affected_mob.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(affected_mob, JOB_XENOMORPH))
+ picked = affected_mob.mind.ghost_mob // This currently doesn't look possible
+ else if(affected_mob.persistent_ckey)
+ for(var/mob/dead/observer/cur_obs as anything in GLOB.observer_list)
+ if(cur_obs.ckey != affected_mob.persistent_ckey)
+ continue
+ if(cur_obs?.client?.prefs?.be_special & BE_ALIEN_AFTER_DEATH && !jobban_isbanned(cur_obs, JOB_XENOMORPH))
+ picked = cur_obs
+ break
if(!picked)
// Get a candidate from observers
diff --git a/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm b/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm
index be772e3a0a4f..b12ff5d6c3bb 100644
--- a/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm
+++ b/code/modules/mob/living/carbon/xenomorph/XenoAttacks.dm
@@ -93,6 +93,9 @@
if (M.fortify || M.burrow)
return XENO_NO_DELAY_ACTION
+ if(HAS_TRAIT(src, TRAIT_ABILITY_BURROWED))
+ return XENO_NO_DELAY_ACTION
+
if(islarva(M)) //Larvas can't eat people
M.visible_message(SPAN_DANGER("[M] nudges its head against \the [src]."), \
SPAN_DANGER("You nudge your head against \the [src]."), null, null, CHAT_TYPE_XENO_FLUFF)
diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
index f1d03d6507b1..0b2625882ed8 100644
--- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
+++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm
@@ -745,6 +745,8 @@
if(SEND_SIGNAL(AM, COMSIG_MOVABLE_XENO_START_PULLING, src) & COMPONENT_ALLOW_PULL)
return do_pull(AM, lunge, no_msg)
+ if(burrow)
+ return
if(!isliving(AM))
return FALSE
var/mob/living/L = AM
@@ -1085,3 +1087,8 @@
if(D)
color_override = D.color
new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(loc, splatter_dir, duration, color_override)
+
+/mob/living/carbon/xenomorph/Collide(atom/movable/movable_atom)
+ . = ..()
+ if(behavior_delegate)
+ behavior_delegate.on_collide(movable_atom)
diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm
index 4f104c00f92e..4d3aae33ae9c 100644
--- a/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm
+++ b/code/modules/mob/living/carbon/xenomorph/abilities/burrower/burrower_powers.dm
@@ -42,7 +42,12 @@
density = FALSE
if(caste.fire_immunity == FIRE_IMMUNITY_NONE)
RegisterSignal(src, COMSIG_LIVING_PREIGNITION, PROC_REF(fire_immune))
- RegisterSignal(src, COMSIG_LIVING_FLAMER_CROSSED, PROC_REF(flamer_crossed_immune))
+ RegisterSignal(src, list(
+ COMSIG_LIVING_FLAMER_CROSSED,
+ COMSIG_LIVING_FLAMER_FLAMED,
+ ), PROC_REF(flamer_crossed_immune))
+ ADD_TRAIT(src, TRAIT_ABILITY_BURROWED, TRAIT_SOURCE_ABILITY("Burrow"))
+ playsound(src.loc, 'sound/effects/burrowing_b.ogg', 25)
update_canmove()
update_icons()
addtimer(CALLBACK(src, PROC_REF(do_burrow_cooldown)), (caste ? caste.burrow_cooldown : 5 SECONDS))
@@ -65,21 +70,29 @@
to_chat(src, SPAN_NOTICE("You resurface."))
burrow = FALSE
if(caste.fire_immunity == FIRE_IMMUNITY_NONE)
- UnregisterSignal(src, COMSIG_LIVING_PREIGNITION)
- UnregisterSignal(src, COMSIG_LIVING_FLAMER_CROSSED)
+ UnregisterSignal(src, list(
+ COMSIG_LIVING_PREIGNITION,
+ COMSIG_LIVING_FLAMER_CROSSED,
+ COMSIG_LIVING_FLAMER_FLAMED,
+ ))
+ REMOVE_TRAIT(src, TRAIT_ABILITY_BURROWED, TRAIT_SOURCE_ABILITY("Burrow"))
frozen = FALSE
invisibility = FALSE
anchored = FALSE
density = TRUE
- for(var/mob/living/carbon/human/H in loc)
- H.apply_effect(2, WEAKEN)
+ playsound(loc, 'sound/effects/burrowoff.ogg', 25)
+ for(var/mob/living/carbon/mob in loc)
+ if(!can_not_harm(mob))
+ mob.apply_effect(2, WEAKEN)
+
addtimer(CALLBACK(src, PROC_REF(do_burrow_cooldown)), (caste ? caste.burrow_cooldown : 5 SECONDS))
update_canmove()
update_icons()
/mob/living/carbon/xenomorph/proc/do_burrow_cooldown()
used_burrow = FALSE
- to_chat(src, SPAN_NOTICE("You can now surface."))
+ if(burrow)
+ to_chat(src, SPAN_NOTICE("You can now surface."))
for(var/X in actions)
var/datum/action/act = X
act.update_button_icon()
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
index 150bc1d9fc96..08566a6e9af3 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm
@@ -67,6 +67,11 @@
PF.flags_can_pass_all = PASS_ALL^PASS_OVER_THROW_ITEM
/mob/living/carbon/xenomorph/facehugger/Life(delta_time)
+ if(!client && !aghosted && away_timer > XENO_FACEHUGGER_LEAVE_TIMER)
+ // Become a npc once again
+ new /obj/item/clothing/mask/facehugger(loc, hivenumber)
+ qdel(src)
+ return
if(stat != DEAD && !lying && !(locate(/obj/effect/alien/weeds) in get_turf(src)))
adjustBruteLoss(1)
return ..()
@@ -156,7 +161,6 @@
for(var/mob/dead/observer/observer as anything in GLOB.observer_list)
to_chat(observer, SPAN_DEADSAY("[human] has been facehugged by [src]" + " [OBSERVER_JMP(observer, human)]"))
to_chat(src, SPAN_DEADSAY("[human] has been facehugged by [src]"))
- timeofdeath = 1 // Ever so slightly deprioritized for larva queue
qdel(src)
if(hug_area)
xeno_message(SPAN_XENOMINORWARNING("You sense that [src] has facehugged a host at \the [hug_area]!"), 1, src.hivenumber)
diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
index fb75ed3900ac..5010857301e0 100644
--- a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
+++ b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm
@@ -151,3 +151,18 @@
. = list()
var/invis_message = (invis_start_time == -1) ? "N/A" : "[(invis_duration-(world.time - invis_start_time))/10] seconds."
. += "Invisibility Time Left: [invis_message]"
+
+/datum/behavior_delegate/lurker_base/on_collide(atom/movable/movable_atom)
+ . = ..()
+
+ if(!ishuman(movable_atom))
+ return
+
+ if(!bound_xeno || !bound_xeno.stealth)
+ return
+
+ var/datum/action/xeno_action/onclick/lurker_invisibility/lurker_invisibility_action = get_xeno_action_by_type(bound_xeno, /datum/action/xeno_action/onclick/lurker_invisibility)
+ if(!lurker_invisibility_action)
+ return
+
+ lurker_invisibility_action.invisibility_off()
diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/behavior_delegate.dm b/code/modules/mob/living/carbon/xenomorph/mutators/behavior_delegate.dm
index 1cb563461138..53ca8c3a74da 100644
--- a/code/modules/mob/living/carbon/xenomorph/mutators/behavior_delegate.dm
+++ b/code/modules/mob/living/carbon/xenomorph/mutators/behavior_delegate.dm
@@ -104,3 +104,7 @@
/// Used to override an intent for some abilities that must force harm on next attack_alien()
/datum/behavior_delegate/proc/override_intent(mob/living/carbon/target_carbon)
return bound_xeno.a_intent
+
+/// Used to do something when a xeno collides with a movable atom
+/datum/behavior_delegate/proc/on_collide(atom/movable/movable_atom)
+ return
diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm
index a2699a4f0f40..7a2196a3c209 100644
--- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm
+++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/runner/acid.dm
@@ -70,19 +70,27 @@
. += "FOR THE HIVE!: in [caboom_left] seconds"
/datum/behavior_delegate/runner_acider/melee_attack_additional_effects_target(mob/living/carbon/target_mob)
- if (ishuman(target_mob))
+ if(ishuman(target_mob)) //Will acid be applied to the mob
var/mob/living/carbon/human/target_human = target_mob
- if (target_human.stat == DEAD)
+ if(target_human.buckled && istype(target_human.buckled, /obj/structure/bed/nest))
return
- for(var/datum/effects/acid/AA in target_mob.effects_list)
- qdel(AA)
+ if(target_human.stat == DEAD)
+ return
+
+ for(var/datum/effects/acid/acid_effect in target_mob.effects_list)
+ qdel(acid_effect)
break
- if(isxeno_human(target_mob))
+
+ new /datum/effects/acid(target_mob, bound_xeno, initial(bound_xeno.caste_type))
+ if(isxeno_human(target_mob)) //Will the runner get acid stacks
+ var/obj/item/alien_embryo/embryo = locate(/obj/item/alien_embryo) in target_mob.contents
+ if(embryo?.stage >= 4) //very late stage hugged in case the runner unnests them
+ return
+
if(target_mob.lying)
modify_acid(acid_slash_regen_lying)
- else
- modify_acid(acid_slash_regen_standing)
- new /datum/effects/acid(target_mob, bound_xeno, initial(bound_xeno.caste_type))
+ return
+ modify_acid(acid_slash_regen_standing)
/datum/behavior_delegate/runner_acider/on_life()
modify_acid(acid_passive_regen)
diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm
index 9b003562825d..fe95f14182ea 100644
--- a/code/modules/mob/living/living_verbs.dm
+++ b/code/modules/mob/living/living_verbs.dm
@@ -11,6 +11,12 @@
to_chat(src, SPAN_WARNING("You can't resist in your current state."))
return
+ if(isxeno(src))
+ var/mob/living/carbon/xenomorph/xeno = src
+ if(xeno.burrow)
+ to_chat(src, SPAN_WARNING("You can't resist in your current state."))
+ return
+
resisting = TRUE
next_move = world.time + 20
diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm
index 813283147c45..4ddefff61eb8 100644
--- a/code/modules/paperwork/carbonpaper.dm
+++ b/code/modules/paperwork/carbonpaper.dm
@@ -30,7 +30,7 @@
set category = "Object"
set src in usr
- if (copied == 0)
+ if (!copied && !iscopy)
var/obj/item/paper/carbon/c = src
var/copycontents = html_decode(c.info)
var/obj/item/paper/carbon/copy = new /obj/item/paper/carbon (usr.loc)
diff --git a/code/modules/projectiles/ammo_boxes/grenade_packets.dm b/code/modules/projectiles/ammo_boxes/grenade_packets.dm
index 518ccd2d47ab..a0d16b621eb3 100644
--- a/code/modules/projectiles/ammo_boxes/grenade_packets.dm
+++ b/code/modules/projectiles/ammo_boxes/grenade_packets.dm
@@ -110,19 +110,19 @@ var/list/grenade_packets = list(
content_type = /obj/item/explosive/grenade/high_explosive/m15/rubber
/obj/item/storage/box/packet/airburst_he
- name = "\improper M74 airbust grenade packet"
+ name = "\improper M74 airburst grenade packet"
desc = "It contains three M74 airburst fragmentation grenades. This end towards the enemy."
icon_state = "agmf_packet"
content_type = /obj/item/explosive/grenade/high_explosive/airburst
/obj/item/storage/box/packet/airburst_incen
- name = "\improper M74 airbust incendiary grenade packet"
+ name = "\improper M74 airburst incendiary grenade packet"
desc = "It contains three M74 airburst incendiary grenades. This end towards the enemy."
icon_state = "agmi_packet"
content_type = /obj/item/explosive/grenade/incendiary/airburst
/obj/item/storage/box/packet/airburst_smoke
- name = "\improper M74 airbust smoke grenade packet"
+ name = "\improper M74 airburst smoke grenade packet"
desc = "It contains three M74 airburst smoke grenades. This end towards the enemy."
icon_state = "agms_packet"
content_type = /obj/item/explosive/grenade/smokebomb/airburst
diff --git a/code/modules/projectiles/ammo_datums.dm b/code/modules/projectiles/ammo_datums.dm
index d8b158485501..14eb6a120886 100644
--- a/code/modules/projectiles/ammo_datums.dm
+++ b/code/modules/projectiles/ammo_datums.dm
@@ -383,7 +383,7 @@
accuracy = -HIT_ACCURACY_TIER_3
accuracy_var_low = PROJECTILE_VARIANCE_TIER_6
damage = 55
- penetration= ARMOR_PENETRATION_TIER_3
+ penetration = ARMOR_PENETRATION_TIER_3
shrapnel_chance = SHRAPNEL_CHANCE_TIER_2
/datum/ammo/bullet/pistol/heavy/super //Commander's variant
diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm
index 0baf6f527d4b..17dc435210c9 100644
--- a/code/modules/projectiles/gun_attachables.dm
+++ b/code/modules/projectiles/gun_attachables.dm
@@ -1967,7 +1967,7 @@ Defined in conflicts.dm of the #defines folder.
//The requirement for an attachable being alt fire is AMMO CAPACITY > 0.
/obj/item/attachable/attached_gun/grenade
- name = "underslung grenade launcher"
+ name = "U1 grenade launcher"
desc = "A weapon-mounted, reloadable grenade launcher."
icon_state = "grenade"
attach_icon = "grenade_a"
diff --git a/code/modules/projectiles/magazines/pistols.dm b/code/modules/projectiles/magazines/pistols.dm
index 317124955cbc..3cb676fbb7db 100644
--- a/code/modules/projectiles/magazines/pistols.dm
+++ b/code/modules/projectiles/magazines/pistols.dm
@@ -55,7 +55,7 @@
default_ammo = /datum/ammo/bullet/pistol/heavy
caliber = ".45"
icon_state = "m4a345"//rename later
- max_rounds = 14
+ max_rounds = 7
gun_type = /obj/item/weapon/gun/pistol/m1911
diff --git a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm
index 8de20ca2b79a..98896013c6ec 100644
--- a/code/modules/reagents/chemistry_machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry_machinery/chem_dispenser.dm
@@ -1,10 +1,16 @@
+#define DISPENSER_UNHACKABLE -1
+#define DISPENSER_NOT_HACKED 0
+#define DISPENSER_HACKED 1
+
/obj/structure/machinery/chem_dispenser
- name = "chem dispenser"
+ name = "chemical dispenser"
+ desc = "A complex machine for mixing elements into chemicals. A Wey-Yu product."
density = TRUE
anchored = TRUE
icon = 'icons/obj/structures/machinery/science_machines.dmi'
icon_state = "dispenser"
use_power = USE_POWER_NONE
+ wrenchable = FALSE
idle_power_usage = 40
layer = BELOW_OBJ_LAYER //So beakers reliably appear above it
var/req_skill = SKILL_MEDICAL
@@ -13,13 +19,37 @@
var/obj/structure/machinery/chem_storage/chem_storage
var/network = "Ground"
var/amount = 30
- var/accept_glass = 0 //At 0 ONLY accepts glass containers. Kinda misleading varname.
+ var/accept_beaker_only = TRUE
var/obj/item/reagent_container/beaker = null
var/ui_check = 0
var/static/list/possible_transfer_amounts = list(5,10,20,30,40)
- var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
- "sodium","aluminum","silicon","phosphorus","sulfur","chlorine","potassium","iron",
- "copper","mercury","radium","water","ethanol","sugar","sulphuric acid")
+ var/list/dispensable_reagents = list(
+ "hydrogen",
+ "lithium",
+ "carbon",
+ "nitrogen",
+ "oxygen",
+ "fluorine",
+ "sodium",
+ "aluminum",
+ "silicon",
+ "phosphorus",
+ "sulfur",
+ "chlorine",
+ "potassium",
+ "iron",
+ "copper",
+ "mercury",
+ "radium",
+ "water",
+ "ethanol",
+ "sugar",
+ "sulphuric acid",
+ )
+ /// Has it been hacked
+ var/hacked_check = DISPENSER_UNHACKABLE
+ /// Additional reagents gotten when it is hacked
+ var/hacked_reagents = list()
/obj/structure/machinery/chem_dispenser/medbay
network = "Medbay"
@@ -111,9 +141,9 @@
var/list/beakerContents = list()
var/beakerCurrentVolume = 0
if(beaker && beaker.reagents && beaker.reagents.reagent_list.len)
- for(var/datum/reagent/R in beaker.reagents.reagent_list)
- beakerContents += list(list("name" = R.name, "volume" = R.volume)) // list in a list because Byond merges the first list...
- beakerCurrentVolume += R.volume
+ for(var/datum/reagent/current_reagent in beaker.reagents.reagent_list)
+ beakerContents += list(list("name" = current_reagent.name, "volume" = current_reagent.volume)) // list in a list because Byond merges the first list...
+ beakerCurrentVolume += current_reagent.volume
.["beakerContents"] = beakerContents
if (beaker)
@@ -149,11 +179,11 @@
return
var/reagent_name = params["reagent"]
if(beaker && dispensable_reagents.Find(reagent_name))
- var/obj/item/reagent_container/B = beaker
- var/datum/reagents/R = B.reagents
- var/space = R.maximum_volume - R.total_volume
+ var/obj/item/reagent_container/current_beaker = beaker
+ var/datum/reagents/current_reagent = current_beaker.reagents
+ var/space = current_reagent.maximum_volume - current_reagent.total_volume
- R.add_reagent(reagent_name, min(amount, chem_storage.energy * 10, space))
+ current_reagent.add_reagent(reagent_name, min(amount, chem_storage.energy * 10, space))
chem_storage.energy = max(chem_storage.energy - min(amount, chem_storage.energy * 10, space) / 10, 0)
. = TRUE
@@ -170,32 +200,64 @@
replace_beaker(usr)
. = TRUE
-/obj/structure/machinery/chem_dispenser/attackby(obj/item/reagent_container/B, mob/user)
+/obj/structure/machinery/chem_dispenser/attackby(obj/item/reagent_container/attacking_object, mob/user)
if(isrobot(user))
return
- if(istype(B, /obj/item/reagent_container/glass) || istype(B, /obj/item/reagent_container/food))
- if(!accept_glass && istype(B,/obj/item/reagent_container/food))
+
+ if(istype(attacking_object, /obj/item/reagent_container/glass) || istype(attacking_object, /obj/item/reagent_container/food))
+ if(accept_beaker_only && istype(attacking_object,/obj/item/reagent_container/food))
to_chat(user, SPAN_NOTICE("This machine only accepts beakers"))
- if(user.drop_inv_item_to_loc(B, src))
+ if(user.drop_inv_item_to_loc(attacking_object, src))
var/obj/item/old_beaker = beaker
- beaker = B
+ beaker = attacking_object
if(old_beaker)
- to_chat(user, SPAN_NOTICE("You swap out \the [old_beaker] for \the [B]."))
+ to_chat(user, SPAN_NOTICE("You swap out [old_beaker] for [attacking_object]."))
user.put_in_hands(old_beaker)
else
- to_chat(user, SPAN_NOTICE("You set \the [B] on the machine."))
+ to_chat(user, SPAN_NOTICE("You set [attacking_object] on the machine."))
SStgui.update_uis(src)
update_icon()
return
+ if(HAS_TRAIT(attacking_object, TRAIT_TOOL_MULTITOOL))
+ switch(hacked_check)
+ if(DISPENSER_UNHACKABLE)
+ to_chat(user, SPAN_NOTICE("[src] cannot be hacked."))
+ if(DISPENSER_NOT_HACKED)
+ user.visible_message("[user] modifies [src] with [attacking_object], turning a light on.", "You enable a light in [src].")
+ dispensable_reagents += hacked_reagents
+ hacked_check = DISPENSER_HACKED
+ if(DISPENSER_HACKED)
+ user.visible_message("[user] modifies [src] with [attacking_object], turning a light off.", "You disable a light in [src].")
+ dispensable_reagents -= hacked_reagents
+ hacked_check = DISPENSER_NOT_HACKED
+
+ if(HAS_TRAIT(attacking_object, TRAIT_TOOL_WRENCH))
+ if(!wrenchable)
+ to_chat(user, "[src] cannot be unwrenched.")
+
+ if(!do_after(user, 2 SECONDS, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
+ return
+ if(!src)
+ return
+
+ playsound(loc, 'sound/items/Ratchet.ogg', 25, 1)
+ anchored = !anchored
+ if(anchored)
+ user.visible_message("[user] tightens the bolts securing [src] to the surface.", "You tighten the bolts securing [src] to the surface.")
+ return
+
+ user.visible_message("[user] unfastens the bolts securing [src] to the surface.", "You unfasten the bolts securing [src] to the surface.")
+
/obj/structure/machinery/chem_dispenser/attack_remote(mob/user as mob)
return src.attack_hand(user)
/obj/structure/machinery/chem_dispenser/attack_hand(mob/user as mob)
if(stat & BROKEN)
+ to_chat(user, SPAN_WARNING("[src] is inoperative."))
return
if(req_skill && !skillcheck(user, req_skill, req_skill_level))
- to_chat(user, SPAN_WARNING("You don't have the training to use this."))
+ to_chat(user, SPAN_WARNING("You don't have the training to use [src]."))
return
tgui_interact(user)
@@ -206,9 +268,10 @@
ui_title = "Soda Dispens-o-matic"
req_skill = null
req_skill_level = null
- accept_glass = 1
+ accept_beaker_only = FALSE
wrenchable = TRUE
network = "Misc"
+ hacked_check = DISPENSER_NOT_HACKED
dispensable_reagents = list(
"water",
"ice",
@@ -233,76 +296,43 @@
"lemonjuice",
"banana",
)
- var/hackedcheck = 0
-
-/obj/structure/machinery/chem_dispenser/soda/attackby(obj/item/B as obj, mob/user as mob)
- ..()
- if(HAS_TRAIT(B, TRAIT_TOOL_MULTITOOL))
- if(hackedcheck == 0)
- to_chat(user, "You change the mode from 'Soda Magic' to 'Milking Time'.")
- dispensable_reagents += list("milk","soymilk")
- hackedcheck = 1
- return
-
- else
- to_chat(user, "You change the mode from 'Milking Time' to 'Soda Magic'.")
- dispensable_reagents -= list("milk","soymilk")
- hackedcheck = 0
- return
- else if(HAS_TRAIT(B, TRAIT_TOOL_WRENCH))
- if(!wrenchable) return
-
- if(do_after(user, 20, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
- if(!src) return
- playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1)
- switch (anchored)
- if (FALSE)
- anchored = TRUE
- user.visible_message("[user] tightens the bolts securing \the [src] to the surface.", "You tighten the bolts securing \the [src] to the surface.")
- if (TRUE)
- user.visible_message("[user] unfastens the bolts securing \the [src] to the surface.", "You unfasten the bolts securing \the [src] to the surface.")
- anchored = FALSE
- return
+ hacked_reagents = list(
+ "milk",
+ "soymilk",
+ )
-/obj/structure/machinery/chem_dispenser/beer
+/obj/structure/machinery/chem_dispenser/soda/beer
icon_state = "booze_dispenser"
name = "booze dispenser"
ui_title = "Booze Portal 9001"
- req_skill = null
- req_skill_level = null
- accept_glass = 1
- wrenchable = TRUE
- network = "Misc"
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
- dispensable_reagents = list("water","ice","sodawater","sugar","tonic","beer","kahlua","whiskey","sake","wine","vodka","gin","rum","vermouth","cognac","ale","mead","thirteenloko","tequila")
- var/hackedcheck = 0
-
-/obj/structure/machinery/chem_dispenser/beer/attackby(obj/item/B as obj, mob/user as mob)
- ..()
-
- if(HAS_TRAIT(B, TRAIT_TOOL_MULTITOOL))
- if(hackedcheck == 0)
- to_chat(user, "You disable the 'Weyland-Yutani-are-cheap-bastards' lock, enabling hidden and very expensive boozes.")
- dispensable_reagents += list("goldschlager","patron","absinthe")
- hackedcheck = 1
- return
+ dispensable_reagents = list(
+ "water",
+ "ice",
+ "sodawater",
+ "sugar",
+ "tonic",
+ "beer",
+ "kahlua",
+ "whiskey",
+ "sake",
+ "wine",
+ "vodka",
+ "gin",
+ "rum",
+ "vermouth",
+ "cognac",
+ "ale",
+ "mead",
+ "thirteenloko",
+ "tequila",
+ )
+ hacked_reagents = list(
+ "goldschlager",
+ "patron",
+ "absinthe",
+ )
- else
- to_chat(user, "You re-enable the 'Weyland-Yutani-are-cheap-bastards' lock, disabling hidden and very expensive boozes.")
- dispensable_reagents -= list("goldschlager","patron","absinthe")
- hackedcheck = 0
- return
- else if(HAS_TRAIT(B, TRAIT_TOOL_WRENCH))
- if(!wrenchable) return
-
- if(do_after(user, 20, INTERRUPT_ALL|BEHAVIOR_IMMOBILE, BUSY_ICON_BUILD))
- if(!src) return
- playsound(src.loc, 'sound/items/Ratchet.ogg', 25, 1)
- switch (anchored)
- if (FALSE)
- anchored = TRUE
- user.visible_message("[user] tightens the bolts securing \the [src] to the surface.", "You tighten the bolts securing \the [src] to the surface.")
- if (TRUE)
- user.visible_message("[user] unfastens the bolts securing \the [src] to the surface.", "You unfasten the bolts securing \the [src] to the surface.")
- anchored = FALSE
- return
+#undef DISPENSER_UNHACKABLE
+#undef DISPENSER_NOT_HACKED
+#undef DISPENSER_HACKED
diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm
index ea4a7fdbc79d..50449b32fcb9 100644
--- a/code/modules/shuttle/computers/dropship_computer.dm
+++ b/code/modules/shuttle/computers/dropship_computer.dm
@@ -1,6 +1,6 @@
/obj/structure/machinery/computer/shuttle/dropship/flight
name = "dropship navigation computer"
- desc = "flight computer for dropship"
+ desc = "A flight computer that can be used for autopilot or long-range flights."
icon = 'icons/obj/structures/machinery/shuttle-parts.dmi'
icon_state = "console"
req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP)
diff --git a/code/modules/tgui/tgui-say/modal.dm b/code/modules/tgui/tgui-say/modal.dm
index b959019b894f..f1e87e001cef 100644
--- a/code/modules/tgui/tgui-say/modal.dm
+++ b/code/modules/tgui/tgui-say/modal.dm
@@ -83,7 +83,7 @@
if(!payload?["channel"])
CRASH("No channel provided to an open TGUI-Say")
window_open = TRUE
- if(payload["channel"] != OOC_CHANNEL && payload["channel"] != LOOC_CHANNEL && payload["channel"] != MOD_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != MENTOR_CHANNEL)
+ if(payload["channel"] != OOC_CHANNEL && payload["channel"] != LOOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != MENTOR_CHANNEL)
start_thinking()
return TRUE
diff --git a/code/modules/tgui/tgui-say/speech.dm b/code/modules/tgui/tgui-say/speech.dm
index f278361ac0d0..7bce349e1b7f 100644
--- a/code/modules/tgui/tgui-say/speech.dm
+++ b/code/modules/tgui/tgui-say/speech.dm
@@ -47,9 +47,6 @@
if(LOOC_CHANNEL)
client.looc(entry)
return TRUE
- if(MOD_CHANNEL)
- client.cmd_mod_say(entry)
- return TRUE
if(ADMIN_CHANNEL)
client.cmd_admin_say(entry)
return TRUE
@@ -94,7 +91,7 @@
return TRUE
if(type == "force")
var/target_channel = payload["channel"]
- if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL || target_channel == LOOC_CHANNEL || target_channel == MOD_CHANNEL)
+ if(target_channel == ME_CHANNEL || target_channel == OOC_CHANNEL || target_channel == LOOC_CHANNEL || target_channel == ADMIN_CHANNEL)
target_channel = SAY_CHANNEL // No ooc leaks
delegate_speech(alter_entry(payload), target_channel)
return TRUE
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index be92afffb898..010cba770ce2 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -85,6 +85,7 @@
#include "unit_test.dm"
#include "spawn_humans.dm"
#include "check_runtimes.dm"
+#include "wj_emotes.dm"
#undef TEST_ASSERT
#undef TEST_ASSERT_EQUAL
diff --git a/code/modules/unit_tests/wj_emotes.dm b/code/modules/unit_tests/wj_emotes.dm
new file mode 100644
index 000000000000..f89757665011
--- /dev/null
+++ b/code/modules/unit_tests/wj_emotes.dm
@@ -0,0 +1,7 @@
+/// Test that all working joe emotes have a category
+/datum/unit_test/wj_emotes
+
+/datum/unit_test/wj_emotes/Run()
+ for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe))
+ if(!initial(emote.category))
+ TEST_FAIL("Emote [emote] did not have a category!")
diff --git a/code/modules/vehicles/interior/interior.dm b/code/modules/vehicles/interior/interior.dm
index b56de4bfe16b..046b42495ac7 100644
--- a/code/modules/vehicles/interior/interior.dm
+++ b/code/modules/vehicles/interior/interior.dm
@@ -72,6 +72,7 @@
entrance_markers = null
QDEL_NULL(reservation)
+ SSinterior.interiors -= src
return ..()
diff --git a/colonialmarines.dme b/colonialmarines.dme
index dd22cc107b5f..663f05b2c9de 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -111,6 +111,7 @@
#include "code\__DEFINES\vv.dm"
#include "code\__DEFINES\weapon_stats.dm"
#include "code\__DEFINES\weather.dm"
+#include "code\__DEFINES\wj_emotes.dm"
#include "code\__DEFINES\xeno.dm"
#include "code\__DEFINES\dcs\flags.dm"
#include "code\__DEFINES\dcs\helpers.dm"
@@ -557,7 +558,6 @@
#include "code\datums\redis\redis_message.dm"
#include "code\datums\redis\callbacks\_redis_callback.dm"
#include "code\datums\redis\callbacks\asay.dm"
-#include "code\datums\redis\callbacks\msay.dm"
#include "code\datums\stamina\_stamina.dm"
#include "code\datums\stamina\none.dm"
#include "code\datums\statistics\cause_data.dm"
@@ -1781,7 +1781,6 @@
#include "code\modules\mob\living\carbon\human\powers\human_powers.dm"
#include "code\modules\mob\living\carbon\human\powers\issue_order.dm"
#include "code\modules\mob\living\carbon\human\species\emote-monkey.dm"
-#include "code\modules\mob\living\carbon\human\species\emote-synthetic.dm"
#include "code\modules\mob\living\carbon\human\species\emote-yautja.dm"
#include "code\modules\mob\living\carbon\human\species\human.dm"
#include "code\modules\mob\living\carbon\human\species\monkey.dm"
@@ -1789,6 +1788,16 @@
#include "code\modules\mob\living\carbon\human\species\synthetic.dm"
#include "code\modules\mob\living\carbon\human\species\yautja.dm"
#include "code\modules\mob\living\carbon\human\species\zombie.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\_emote.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\_species.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\farewell.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\greeting.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\notice.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\question.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\quip.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\restricted_area.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\task_update.dm"
+#include "code\modules\mob\living\carbon\human\species\working_joe\warning.dm"
#include "code\modules\mob\living\carbon\xenomorph\Abilities.dm"
#include "code\modules\mob\living\carbon\xenomorph\attack_alien.dm"
#include "code\modules\mob\living\carbon\xenomorph\damage_procs.dm"
diff --git a/html/changelogs/AutoChangeLog-pr-3644.yml b/html/changelogs/AutoChangeLog-pr-3644.yml
deleted file mode 100644
index 3561afb407cf..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3644.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Drathek Kugamo"
-delete-after: True
-changes:
- - rscadd: "Added the ability for weeds to merge with unrevivable corpses"
- - imageadd: "Added human shaped weeds by Kugamo"
- - code_imp: "Added a signal for weeds sent to the turf to indicate it is now weeded, and added a signal for afterbuckle."
- - bugfix: "Closets (including coffins) can no longer move anchored mobs."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3807.yml b/html/changelogs/AutoChangeLog-pr-3807.yml
deleted file mode 100644
index ad651a4d4e80..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3807.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Morrow"
-delete-after: True
-changes:
- - bugfix: "Fixed extraneous messages in regards to wall nests"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3808.yml b/html/changelogs/AutoChangeLog-pr-3808.yml
deleted file mode 100644
index d9494a1d7f8a..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3808.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SpartanBobby"
-delete-after: True
-changes:
- - balance: "changes M4A3 magazine size from 9 to 12"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3812.yml b/html/changelogs/AutoChangeLog-pr-3812.yml
deleted file mode 100644
index e8990a528ec7..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3812.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Morrow"
-delete-after: True
-changes:
- - qol: "Create humans tab length increase"
- - qol: "Create humans tab now defaults to 0 range to spawn"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3813.yml b/html/changelogs/AutoChangeLog-pr-3813.yml
deleted file mode 100644
index 5faa054ec221..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3813.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Zonespace27"
-delete-after: True
-changes:
- - bugfix: "The maintenance jack should work a little better at crowbarring things."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3826.yml b/html/changelogs/AutoChangeLog-pr-3826.yml
deleted file mode 100644
index 556e83acdbba..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3826.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Drathek"
-delete-after: True
-changes:
- - bugfix: "Fixed facehuggers incorrectly displaying thrown state when it has landed"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3827.yml b/html/changelogs/AutoChangeLog-pr-3827.yml
deleted file mode 100644
index 768cd30a9497..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3827.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Ben10083"
-delete-after: True
-changes:
- - bugfix: "Working Joes can no longer have a gradient on their rare hair spawn."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-3828.yml b/html/changelogs/AutoChangeLog-pr-3828.yml
deleted file mode 100644
index f3cc0b8c3ee1..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3828.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Ben10083"
-delete-after: True
-changes:
- - rscdel: "Working Joes can no longer be fed."
- - code_imp: "New trait: Cannot eat. Self-explanatory."
\ No newline at end of file
diff --git a/html/changelogs/archive/2023-07.yml b/html/changelogs/archive/2023-07.yml
index 204efe627173..db8b80db6820 100644
--- a/html/changelogs/archive/2023-07.yml
+++ b/html/changelogs/archive/2023-07.yml
@@ -91,3 +91,132 @@
- balance: Colony Synthetics have slightly better CQC and can carry people better.
realforest2001:
- bugfix: Fixes Queen making footstep sounds while dead and being dragged.
+2023-07-08:
+ Ben10083:
+ - bugfix: Working Joes can no longer have a gradient on their rare hair spawn.
+ - rscdel: Working Joes can no longer be fed.
+ - code_imp: 'New trait: Cannot eat. Self-explanatory.'
+ Cursor:
+ - spellcheck: Changed Chem Dispenser to Chemical Dispenser, added descriptions to
+ the cryo cell, rail computer and chemical dispenser. Updated the descriptions
+ for the Blood Dispenser and Dropship computer.
+ Drathek:
+ - bugfix: Fixed facehuggers incorrectly displaying thrown state when it has landed
+ Drathek Kugamo:
+ - rscadd: Added the ability for weeds to merge with unrevivable corpses
+ - imageadd: Added human shaped weeds by Kugamo
+ - code_imp: Added a signal for weeds sent to the turf to indicate it is now weeded,
+ and added a signal for afterbuckle.
+ - bugfix: Closets (including coffins) can no longer move anchored mobs.
+ Morrow:
+ - qol: Create humans tab length increase
+ - qol: Create humans tab now defaults to 0 range to spawn
+ - bugfix: Fixed extraneous messages in regards to wall nests
+ SpartanBobby:
+ - balance: changes M4A3 magazine size from 9 to 12
+ Zonespace27:
+ - bugfix: The maintenance jack should work a little better at crowbarring things.
+2023-07-09:
+ Khadd:
+ - rscadd: added a iv tube between the user and the bloodpack / iv drip
+ - imageadd: sprites for the iv tube
+ Zonespace27:
+ - rscadd: Working Joes now have an emote panel to use voice lines, accessible as
+ an action button.
+ theselfish:
+ - qol: Foxtrot's radio channel is now on if you have multi-squad in your headset.
+2023-07-10:
+ BeagleGaming1:
+ - rscadd: Acid runners don't get acid from slashing nested humans
+ - rscadd: Very late-stage marines do not give acid
+ - bugfix: Fixes one way of abusing resin fruit
+ Drathek:
+ - rscdel: Remove first life priority for larva queue
+ - bugfix: Fix ghosting as a facehugger counting as death for the larva queue
+ blackdragonTOW:
+ - spellcheck: Added "U1" designation to the UGL attachment.
+2023-07-11:
+ BeagleGaming1:
+ - bugfix: Fixes the Working Joe species
+2023-07-12:
+ Morrow:
+ - bugfix: Stops xenos from bypassing dead moving via roller beds
+ - balance: Telebaton now scales in stunforce effectiveness based on policing skill
+ - balance: Marines called with foxtrot nerfed from 15 to 10.
+ SpartanBobby:
+ - maptweak: 'LV522: Flips the layout of engineering making the T-comms unit on the
+ far side of the LZ'
+ - balance: reduces the M1911 magazine size from 14 to 7
+ Steelpoint:
+ - balance: Synthetic Armour slowdown has been decreased
+2023-07-13:
+ QuickLoad, Thwomper:
+ - imageadd: Synthetic Uniforms & Vest with United Americas flair and classic jumpsuits
+ which remind you of life on the Frontier. Sprited by THE THWOMPA himself!
+ - qol: Synthetic Vendor is more organized. Removes scrub cap, adds shoe.
+2023-07-14:
+ Drathek:
+ - bugfix: Fix ghosting preventing first dibs on the larva in a hugged marine
+ Unknownity:
+ - bugfix: Fixed burrowed mobs being able to be targeted by sentries, mines and SG
+ autofire.
+ - bugfix: Fixed burrowed mobs being able to grab mobs on the surface.
+ - bugfix: Fixed burrowed mobs being able to resist while burrowed.
+ - bugfix: Fixed burrowers taking damage from direct flame and shrapnel from explosions.
+ - bugfix: Fixed burrowers being able to get slashed from enemy Xenos on the surface.
+ - bugfix: Fixed burrowers unburrow stun to now properly target and stun enemy Xenos.
+ - soundadd: Added sounds for the Burrower when they are burrowing and unburrowing.
+2023-07-15:
+ BeagleGaming1:
+ - code_imp: Messed with chem and drink dispenser code
+ Ben10083:
+ - spellcheck: Fixed typos relating to M74 airburst packets.
+ - mapadd: Combat Information Center Reception now has a telephone
+ - maptweak: Medical Lower telephone shifted to the left
+ Drathek:
+ - bugfix: Fix morpher ejected items and dumped objectives not restoring their mouse_opacity
+ setting.
+ Morrow:
+ - admin: VV Jump To Fix
+ - balance: Lurkers now lose their invisibility when they run into a person
+ Steelpoint:
+ - ui: Predator Ship is now called 'Yautja Ship" for teleporting Predators
+ Zonespace27:
+ - admin: Removed msay. All staff now have access to asay
+ ondrej008:
+ - bugfix: The HE OB now deals the correct amount of damage to xenos, before it dealt
+ half damage caused by xenos being forced to rest before it hit.
+ realforest2001:
+ - soundadd: Added a drag sound for footstep component
+ - bugfix: Fixes the icon on the alien blade on LV.
+ - bugfix: Carbon copies can no longer infinitely breed.
+ - rscadd: Added a PMC Synth Survivor preset, and stopped PMC Synth Survivor using
+ the ERT set.
+ - bugfix: You can no longer weld non metal containers closed.
+ - bugfix: Fixes the toggle notification sound verb for Yautja bracers not working.
+2023-07-16:
+ Drathek:
+ - rscadd: Facehuggers now convert to their NPC version after 7 minutes of inactivity
+ and no client.
+ - code_imp: Cleanup join as xeno button code somewhat.
+ Drathek, Fira:
+ - bugfix: Fixed an issue with table flips that could make some tables incorrectly
+ unflippable, and cause infinite loops. It is no longer possible to flip tables
+ that t-shape or cross, or spans more than 5 tiles away from you.
+ Drathek, Steelpoint:
+ - bugfix: Fixed possible hardeletes for predator landmarks and vehicles. Predator
+ teleporation descriptions now do not change if the area is altered at runtime
+ so they can still be found correctly.
+ theselfish:
+ - rscadd: SOs may now get coats in their vendor.
+2023-07-17:
+ Puckaboo2:
+ - spellcheck: Some duplicate icon states have been differentiated to prevent future
+ missing icon state errors.
+ - imageadd: Added new icon states for chemical and virology dispensers.
+ - rscdel: Removed dozens of duplicate icon states from over 50 files to reduce bloat.
+ - rscdel: Removed duplicate empty icon states.
+ realforest2001:
+ - maptweak: Added Apollo Maintenance Controllers to the following locations.
+ - maptweak: Astronavigation, CIC Substation, Brig Substation, Req Aux Storage, Hangar
+ & OT & Engineering workshops, Reactor Core Room and Lifeboat Control Ring.
diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi
index 704c0ad1c02c..d6ee40cf7fe8 100644
Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ
diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi
index 8e31fea96135..fa46a2d6c094 100644
Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ
diff --git a/icons/mob/hud/actions.dmi b/icons/mob/hud/actions.dmi
index 1692879116dc..4d0697733207 100644
Binary files a/icons/mob/hud/actions.dmi and b/icons/mob/hud/actions.dmi differ
diff --git a/icons/mob/hud/alien_standard.dmi b/icons/mob/hud/alien_standard.dmi
index 7e339ec5e83d..8bad0b44acc9 100644
Binary files a/icons/mob/hud/alien_standard.dmi and b/icons/mob/hud/alien_standard.dmi differ
diff --git a/icons/mob/hud/hud.dmi b/icons/mob/hud/hud.dmi
index 91fd9e92b5fa..f8ea98d01e53 100644
Binary files a/icons/mob/hud/hud.dmi and b/icons/mob/hud/hud.dmi differ
diff --git a/icons/mob/hud/human_bronze.dmi b/icons/mob/hud/human_bronze.dmi
index 4f2ee88d1da5..11a724057245 100644
Binary files a/icons/mob/hud/human_bronze.dmi and b/icons/mob/hud/human_bronze.dmi differ
diff --git a/icons/mob/hud/human_old.dmi b/icons/mob/hud/human_old.dmi
index 2e29c09411b7..194206d4de16 100644
Binary files a/icons/mob/hud/human_old.dmi and b/icons/mob/hud/human_old.dmi differ
diff --git a/icons/mob/hud/human_orange.dmi b/icons/mob/hud/human_orange.dmi
index 420fb3e8ea3e..8a46dad89ed5 100644
Binary files a/icons/mob/hud/human_orange.dmi and b/icons/mob/hud/human_orange.dmi differ
diff --git a/icons/mob/hud/screen1.dmi b/icons/mob/hud/screen1.dmi
index df8475ef0ebd..fd4cf8188579 100644
Binary files a/icons/mob/hud/screen1.dmi and b/icons/mob/hud/screen1.dmi differ
diff --git a/icons/mob/hud/screen1_robot.dmi b/icons/mob/hud/screen1_robot.dmi
index a54b0a34b392..679a555c97a6 100644
Binary files a/icons/mob/hud/screen1_robot.dmi and b/icons/mob/hud/screen1_robot.dmi differ
diff --git a/icons/mob/hud/talk.dmi b/icons/mob/hud/talk.dmi
index 52255e1094f9..c6f043bfd781 100644
Binary files a/icons/mob/hud/talk.dmi and b/icons/mob/hud/talk.dmi differ
diff --git a/icons/mob/humans/green_armors.dmi b/icons/mob/humans/green_armors.dmi
index e1a5aaf8c13f..5022b6c4bbc7 100644
Binary files a/icons/mob/humans/green_armors.dmi and b/icons/mob/humans/green_armors.dmi differ
diff --git a/icons/mob/humans/human.dmi b/icons/mob/humans/human.dmi
index f98eb58f08ff..7bcd1e9796cc 100644
Binary files a/icons/mob/humans/human.dmi and b/icons/mob/humans/human.dmi differ
diff --git a/icons/mob/humans/onmob/belt.dmi b/icons/mob/humans/onmob/belt.dmi
index 1d5ed650b6f9..f95ba65ece52 100644
Binary files a/icons/mob/humans/onmob/belt.dmi and b/icons/mob/humans/onmob/belt.dmi differ
diff --git a/icons/mob/humans/onmob/suit_0.dmi b/icons/mob/humans/onmob/suit_0.dmi
index 5cccc4c2e0e0..0065384e2c6c 100644
Binary files a/icons/mob/humans/onmob/suit_0.dmi and b/icons/mob/humans/onmob/suit_0.dmi differ
diff --git a/icons/mob/humans/onmob/uniform_0.dmi b/icons/mob/humans/onmob/uniform_0.dmi
index cac9869c9034..a3e34fc2e16c 100644
Binary files a/icons/mob/humans/onmob/uniform_0.dmi and b/icons/mob/humans/onmob/uniform_0.dmi differ
diff --git a/icons/mob/humans/species/monkeys/onmob/suit_monkey_0.dmi b/icons/mob/humans/species/monkeys/onmob/suit_monkey_0.dmi
index 3083c943c761..6d05304ef8d9 100644
Binary files a/icons/mob/humans/species/monkeys/onmob/suit_monkey_0.dmi and b/icons/mob/humans/species/monkeys/onmob/suit_monkey_0.dmi differ
diff --git a/icons/mob/humans/species/monkeys/onmob/uniform_monkey_0.dmi b/icons/mob/humans/species/monkeys/onmob/uniform_monkey_0.dmi
index 730ee28ff467..cc6fb5d13b03 100644
Binary files a/icons/mob/humans/species/monkeys/onmob/uniform_monkey_0.dmi and b/icons/mob/humans/species/monkeys/onmob/uniform_monkey_0.dmi differ
diff --git a/icons/mob/xenonids/lurker.dmi b/icons/mob/xenonids/lurker.dmi
index bc2c3aa06837..45a04ac68446 100644
Binary files a/icons/mob/xenonids/lurker.dmi and b/icons/mob/xenonids/lurker.dmi differ
diff --git a/icons/obj/bodybag.dmi b/icons/obj/bodybag.dmi
index 9084afd56f63..157a7692b2a8 100644
Binary files a/icons/obj/bodybag.dmi and b/icons/obj/bodybag.dmi differ
diff --git a/icons/obj/items/black_goo_stuff.dmi b/icons/obj/items/black_goo_stuff.dmi
index 2d7b063bc4b8..b40461a40101 100644
Binary files a/icons/obj/items/black_goo_stuff.dmi and b/icons/obj/items/black_goo_stuff.dmi differ
diff --git a/icons/obj/items/clothing/halloween_clothes.dmi b/icons/obj/items/clothing/halloween_clothes.dmi
index 3de24560ec9d..530b7cf5a905 100644
Binary files a/icons/obj/items/clothing/halloween_clothes.dmi and b/icons/obj/items/clothing/halloween_clothes.dmi differ
diff --git a/icons/obj/items/clothing/suits.dmi b/icons/obj/items/clothing/suits.dmi
index cff4b5d48c17..668b9a86c62f 100644
Binary files a/icons/obj/items/clothing/suits.dmi and b/icons/obj/items/clothing/suits.dmi differ
diff --git a/icons/obj/items/clothing/uniforms.dmi b/icons/obj/items/clothing/uniforms.dmi
index 254c9e8b67c9..4d4d7df3224d 100644
Binary files a/icons/obj/items/clothing/uniforms.dmi and b/icons/obj/items/clothing/uniforms.dmi differ
diff --git a/icons/obj/items/food.dmi b/icons/obj/items/food.dmi
index ac802dc66a9a..6e2c86aa4999 100644
Binary files a/icons/obj/items/food.dmi and b/icons/obj/items/food.dmi differ
diff --git a/icons/obj/items/hunter/pred_gear.dmi b/icons/obj/items/hunter/pred_gear.dmi
index 5587cc685bec..ab034d7ec48a 100644
Binary files a/icons/obj/items/hunter/pred_gear.dmi and b/icons/obj/items/hunter/pred_gear.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/barrel.dmi b/icons/obj/items/weapons/guns/attachments/barrel.dmi
index 41231e81b975..d040aa85fd5d 100644
Binary files a/icons/obj/items/weapons/guns/attachments/barrel.dmi and b/icons/obj/items/weapons/guns/attachments/barrel.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/rail.dmi b/icons/obj/items/weapons/guns/attachments/rail.dmi
index 10e3cbe99a8c..315005696ba8 100644
Binary files a/icons/obj/items/weapons/guns/attachments/rail.dmi and b/icons/obj/items/weapons/guns/attachments/rail.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/stock.dmi b/icons/obj/items/weapons/guns/attachments/stock.dmi
index 481710383a14..8eb95d15770f 100644
Binary files a/icons/obj/items/weapons/guns/attachments/stock.dmi and b/icons/obj/items/weapons/guns/attachments/stock.dmi differ
diff --git a/icons/obj/items/weapons/guns/attachments/under.dmi b/icons/obj/items/weapons/guns/attachments/under.dmi
index 8cbf735ac96b..1a55ea7e215f 100644
Binary files a/icons/obj/items/weapons/guns/attachments/under.dmi and b/icons/obj/items/weapons/guns/attachments/under.dmi differ
diff --git a/icons/obj/items/weapons/guns/legacy/old_bayguns.dmi b/icons/obj/items/weapons/guns/legacy/old_bayguns.dmi
index d1bdb7d3b0c9..568bfd0ee456 100644
Binary files a/icons/obj/items/weapons/guns/legacy/old_bayguns.dmi and b/icons/obj/items/weapons/guns/legacy/old_bayguns.dmi differ
diff --git a/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi b/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi
index bf67ed68502c..24cade43454f 100644
Binary files a/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi and b/icons/obj/items/weapons/guns/legacy/old_cmguns.dmi differ
diff --git a/icons/obj/structures/doors/mineral_doors.dmi b/icons/obj/structures/doors/mineral_doors.dmi
index 1613f466d523..f9e025ccf0e9 100644
Binary files a/icons/obj/structures/doors/mineral_doors.dmi and b/icons/obj/structures/doors/mineral_doors.dmi differ
diff --git a/icons/obj/structures/doors/prison_FOP/prison_hatches.dmi b/icons/obj/structures/doors/prison_FOP/prison_hatches.dmi
index 489d2333f2a6..23864a1065d1 100644
Binary files a/icons/obj/structures/doors/prison_FOP/prison_hatches.dmi and b/icons/obj/structures/doors/prison_FOP/prison_hatches.dmi differ
diff --git a/icons/obj/structures/machinery/computer3.dmi b/icons/obj/structures/machinery/computer3.dmi
index 4735cfc5a1a4..047417f303f3 100644
Binary files a/icons/obj/structures/machinery/computer3.dmi and b/icons/obj/structures/machinery/computer3.dmi differ
diff --git a/icons/obj/structures/machinery/cryogenics.dmi b/icons/obj/structures/machinery/cryogenics.dmi
index b2c5d2e0c5ce..dc061195583f 100644
Binary files a/icons/obj/structures/machinery/cryogenics.dmi and b/icons/obj/structures/machinery/cryogenics.dmi differ
diff --git a/icons/obj/structures/machinery/shuttle-parts.dmi b/icons/obj/structures/machinery/shuttle-parts.dmi
index 1ec8a07e6b3f..7db27387e7c1 100644
Binary files a/icons/obj/structures/machinery/shuttle-parts.dmi and b/icons/obj/structures/machinery/shuttle-parts.dmi differ
diff --git a/icons/obj/structures/machinery/vending.dmi b/icons/obj/structures/machinery/vending.dmi
index ecc570680a74..3098aadca8be 100644
Binary files a/icons/obj/structures/machinery/vending.dmi and b/icons/obj/structures/machinery/vending.dmi differ
diff --git a/icons/obj/structures/props/dam.dmi b/icons/obj/structures/props/dam.dmi
index 3541b2412e13..76f67514c2ea 100644
Binary files a/icons/obj/structures/props/dam.dmi and b/icons/obj/structures/props/dam.dmi differ
diff --git a/icons/obj/structures/props/fence.dmi b/icons/obj/structures/props/fence.dmi
index 9ed9d1f7fc20..016aab562777 100644
Binary files a/icons/obj/structures/props/fence.dmi and b/icons/obj/structures/props/fence.dmi differ
diff --git a/icons/obj/structures/stairs/perspective_stairs_ice.dmi b/icons/obj/structures/stairs/perspective_stairs_ice.dmi
index 8f5bf6935d7b..3311adfc11dd 100644
Binary files a/icons/obj/structures/stairs/perspective_stairs_ice.dmi and b/icons/obj/structures/stairs/perspective_stairs_ice.dmi differ
diff --git a/icons/obj/structures/stairs/perspective_stairs_kutjevo.dmi b/icons/obj/structures/stairs/perspective_stairs_kutjevo.dmi
index 86a2cfde6339..f9c759a32d12 100644
Binary files a/icons/obj/structures/stairs/perspective_stairs_kutjevo.dmi and b/icons/obj/structures/stairs/perspective_stairs_kutjevo.dmi differ
diff --git a/icons/old_stuff/Seasonal/xmas.dmi b/icons/old_stuff/Seasonal/xmas.dmi
index 8dd25fd4b6d4..9669a6034b9c 100644
Binary files a/icons/old_stuff/Seasonal/xmas.dmi and b/icons/old_stuff/Seasonal/xmas.dmi differ
diff --git a/icons/rebase_icons.dmi b/icons/rebase_icons.dmi
index aaf92453b29a..2d394cef793d 100644
Binary files a/icons/rebase_icons.dmi and b/icons/rebase_icons.dmi differ
diff --git a/icons/turf/almayer.dmi b/icons/turf/almayer.dmi
index a90940470acf..07f771ec78c7 100644
Binary files a/icons/turf/almayer.dmi and b/icons/turf/almayer.dmi differ
diff --git a/icons/turf/area_strata.dmi b/icons/turf/area_strata.dmi
index 54b90d0a8f92..8c9791522989 100644
Binary files a/icons/turf/area_strata.dmi and b/icons/turf/area_strata.dmi differ
diff --git a/icons/turf/floors/asphalt.dmi b/icons/turf/floors/asphalt.dmi
index ef4f07d5f374..57b807b1c3f4 100644
Binary files a/icons/turf/floors/asphalt.dmi and b/icons/turf/floors/asphalt.dmi differ
diff --git a/icons/turf/floors/concrete.dmi b/icons/turf/floors/concrete.dmi
index d3aa3a1fa7ee..54d7dd3aaaef 100644
Binary files a/icons/turf/floors/concrete.dmi and b/icons/turf/floors/concrete.dmi differ
diff --git a/icons/turf/floors/floors.dmi b/icons/turf/floors/floors.dmi
index 681ffa537aa4..7b68cbb2b6b2 100644
Binary files a/icons/turf/floors/floors.dmi and b/icons/turf/floors/floors.dmi differ
diff --git a/icons/turf/walls/bunker.dmi b/icons/turf/walls/bunker.dmi
index 6f7537e20f7c..d9d4f8a080cb 100644
Binary files a/icons/turf/walls/bunker.dmi and b/icons/turf/walls/bunker.dmi differ
diff --git a/icons/turf/walls/dev/dev.dmi b/icons/turf/walls/dev/dev.dmi
index 0c6025876b2e..4a1eaf6f7b6a 100644
Binary files a/icons/turf/walls/dev/dev.dmi and b/icons/turf/walls/dev/dev.dmi differ
diff --git a/icons/turf/walls/floodgate.dmi b/icons/turf/walls/floodgate.dmi
index 5b3f00abb597..f67e5a7a3fcc 100644
Binary files a/icons/turf/walls/floodgate.dmi and b/icons/turf/walls/floodgate.dmi differ
diff --git a/icons/turf/walls/kutjevo/kutjevo.dmi b/icons/turf/walls/kutjevo/kutjevo.dmi
index 5c8c0053e1bf..3aba82409af6 100644
Binary files a/icons/turf/walls/kutjevo/kutjevo.dmi and b/icons/turf/walls/kutjevo/kutjevo.dmi differ
diff --git a/icons/turf/walls/solaris/solaris.dmi b/icons/turf/walls/solaris/solaris.dmi
index 85d5c118a901..96865710abd7 100644
Binary files a/icons/turf/walls/solaris/solaris.dmi and b/icons/turf/walls/solaris/solaris.dmi differ
diff --git a/icons/turf/walls/solaris/solaris_old.dmi b/icons/turf/walls/solaris/solaris_old.dmi
index 59846bf0ad1c..2aca7b187508 100644
Binary files a/icons/turf/walls/solaris/solaris_old.dmi and b/icons/turf/walls/solaris/solaris_old.dmi differ
diff --git a/icons/turf/walls/strata_outpost.dmi b/icons/turf/walls/strata_outpost.dmi
index 36e20bdd176a..6043f7c32d8d 100644
Binary files a/icons/turf/walls/strata_outpost.dmi and b/icons/turf/walls/strata_outpost.dmi differ
diff --git a/icons/turf/walls/windows.dmi b/icons/turf/walls/windows.dmi
index b1b7c7ebfbe9..85f822873e68 100644
Binary files a/icons/turf/walls/windows.dmi and b/icons/turf/walls/windows.dmi differ
diff --git a/maps/interiors/fancylocker.dmm b/maps/interiors/fancylocker.dmm
index b26879d705f8..a6ecb6155e72 100644
--- a/maps/interiors/fancylocker.dmm
+++ b/maps/interiors/fancylocker.dmm
@@ -88,7 +88,7 @@
/area/vehicle/apc)
"t" = (
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/turf/open/floor/wood,
/area/vehicle/apc)
"u" = (
diff --git a/maps/map_files/CORSAT/Corsat.dmm b/maps/map_files/CORSAT/Corsat.dmm
index bddc64a61ad2..3fefea9f08b0 100644
--- a/maps/map_files/CORSAT/Corsat.dmm
+++ b/maps/map_files/CORSAT/Corsat.dmm
@@ -22132,7 +22132,7 @@
/area/corsat/gamma/biodome/toxins)
"biR" = (
/obj/structure/surface/table/woodentable,
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
dir = 8;
pixel_x = 15
},
@@ -25197,7 +25197,7 @@
/area/corsat/sigma/south/offices)
"bsN" = (
/obj/structure/surface/table/woodentable,
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
dir = 8
},
/turf/open/floor/corsat{
diff --git a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm
index 7ce999271a29..76257b973b43 100644
--- a/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm
+++ b/maps/map_files/Ice_Colony_v2/Ice_Colony_v2.dmm
@@ -14261,7 +14261,7 @@
/area/ice_colony/surface/bar/bar)
"aPy" = (
/obj/structure/surface/table/woodentable,
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/obj/structure/machinery/alarm{
dir = 1;
pixel_y = -24
diff --git a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
index a431aa368702..d221090da880 100644
--- a/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
+++ b/maps/map_files/Ice_Colony_v3/Shivas_Snowball.dmm
@@ -6004,7 +6004,7 @@
/turf/open/floor/plating,
/area/shiva/interior/colony/s_admin)
"aRc" = (
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
pixel_y = 8
},
/obj/structure/surface/table/reinforced/prison,
diff --git a/maps/map_files/Kutjevo/Kutjevo.dmm b/maps/map_files/Kutjevo/Kutjevo.dmm
index 3d626437679a..e5a6a43cf617 100644
--- a/maps/map_files/Kutjevo/Kutjevo.dmm
+++ b/maps/map_files/Kutjevo/Kutjevo.dmm
@@ -381,7 +381,7 @@
/turf/open/floor/kutjevo/grey/plate,
/area/kutjevo/interior/complex/med/cells)
"azb" = (
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
icon_state = "dispenser"
},
/turf/open/floor/kutjevo/tan/multi_tiles,
diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
index 34eecc574c9c..cb5f023d59fa 100644
--- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
+++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm
@@ -2334,13 +2334,11 @@
},
/area/lv522/oob)
"bzL" = (
-/obj/structure/machinery/space_heater/radiator/red{
- dir = 4
- },
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/structure/machinery/camera/autoname,
+/obj/structure/machinery/light/small{
+ dir = 1
},
+/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"bAc" = (
/obj/structure/filingcabinet/seeds{
@@ -3443,10 +3441,11 @@
/turf/open/asphalt/cement,
/area/lv522/outdoors/colony_streets/east_central_street)
"cfd" = (
-/obj/structure/surface/table/almayer,
-/obj/structure/machinery/recharger,
-/obj/effect/spawner/random/powercell,
-/turf/open/floor/prison,
+/obj/structure/closet/wardrobe/engineering_yellow,
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"cfg" = (
/obj/item/clothing/head/hardhat/white,
@@ -3568,13 +3567,6 @@
},
/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_2)
-"cjf" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
- },
-/area/lv522/indoors/lone_buildings/engineering)
"cjv" = (
/obj/structure/bed/chair/comfy{
dir = 4
@@ -4784,6 +4776,12 @@
},
/turf/open/floor/corsat,
/area/lv522/atmos/east_reactor)
+"cNO" = (
+/obj/structure/machinery/colony_floodlight_switch{
+ pixel_y = 30
+ },
+/turf/open/floor/plating,
+/area/lv522/indoors/lone_buildings/engineering)
"cNQ" = (
/turf/open/floor/corsat{
dir = 8;
@@ -7762,7 +7760,8 @@
},
/area/lv522/oob)
"ebR" = (
-/obj/structure/closet/secure_closet/engineering_welding,
+/obj/structure/surface/table/almayer,
+/obj/effect/landmark/objective_landmark/close,
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -8354,7 +8353,7 @@
/turf/open/floor/corsat{
icon_state = "marked"
},
-/area/lv522/atmos/east_reactor/east)
+/area/lv522/oob)
"eow" = (
/obj/structure/tunnel{
pixel_x = 2;
@@ -9813,6 +9812,18 @@
},
/turf/open/auto_turf/shale/layer1,
/area/lv522/outdoors/nw_rockies)
+"eXU" = (
+/obj/structure/machinery/power/terminal,
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/turf/open/floor/plating,
+/area/lv522/indoors/lone_buildings/engineering)
"eXV" = (
/obj/structure/cargo_container/horizontal/blue/bottom{
pixel_x = 16
@@ -10351,6 +10362,17 @@
icon_state = "blue_plate"
},
/area/lv522/indoors/a_block/admin)
+"flC" = (
+/obj/structure/machinery/light/small,
+/obj/structure/machinery/camera/autoname{
+ dir = 1;
+ network = list("interrogation")
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"flI" = (
/obj/structure/surface/table/woodentable/fancy,
/obj/item/ashtray/bronze{
@@ -11092,9 +11114,9 @@
icon_state = "gib6"
},
/turf/open/asphalt/cement{
- icon_state = "cement12"
+ icon_state = "cement4"
},
-/area/lv522/outdoors/colony_streets/south_west_street)
+/area/lv522/outdoors/colony_streets/central_streets)
"fCW" = (
/turf/open/floor/prison{
icon_state = "darkbrownfull2"
@@ -11745,10 +11767,16 @@
},
/area/lv522/indoors/a_block/dorms)
"fSv" = (
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/structure/surface/table/almayer,
+/obj/item/clothing/head/beret/eng,
+/obj/item/ammo_box/magazine/nailgun/empty{
+ pixel_x = -6;
+ pixel_y = 12
+ },
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 9
},
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"fSR" = (
/obj/structure/surface/table/almayer,
@@ -12196,6 +12224,12 @@
},
/turf/open/floor/carpet,
/area/lv522/indoors/a_block/executive)
+"gcX" = (
+/obj/structure/window_frame/strata/reinforced,
+/turf/open/floor/corsat{
+ icon_state = "marked"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"gcY" = (
/obj/structure/cargo_container/ferret/left,
/turf/open/auto_turf/shale/layer0,
@@ -14028,7 +14062,7 @@
},
/area/lv522/atmos/east_reactor/east)
"gUA" = (
-/obj/structure/machinery/recharge_station,
+/obj/structure/closet/secure_closet/engineering_welding,
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -14267,10 +14301,7 @@
},
/area/lv522/atmos/command_centre)
"gZg" = (
-/obj/item/shard{
- icon_state = "medium"
- },
-/obj/effect/decal/cleanable/dirt,
+/obj/structure/closet/secure_closet/engineering_electrical,
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -16925,6 +16956,10 @@
icon_state = "brown"
},
/area/lv522/atmos/east_reactor)
+"icy" = (
+/obj/item/prop/alien/hugger,
+/turf/open/floor/prison,
+/area/lv522/indoors/lone_buildings/engineering)
"icE" = (
/obj/structure/pipes/standard/simple/hidden/green,
/obj/effect/decal/cleanable/dirt,
@@ -17940,11 +17975,17 @@
},
/area/lv522/indoors/a_block/corpo/glass)
"izp" = (
-/obj/structure/machinery/power/smes/buildable{
- capacity = 1e+006;
- dir = 1
+/obj/structure/surface/table/almayer,
+/obj/item/clothing/glasses/meson,
+/obj/item/shard{
+ icon_state = "medium"
+ },
+/obj/effect/landmark/objective_landmark/close,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
},
-/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"izr" = (
/obj/structure/platform/stair_cut,
@@ -19364,18 +19405,6 @@
icon_state = "browncorner"
},
/area/lv522/atmos/east_reactor/south)
-"jeo" = (
-/obj/structure/pipes/vents/pump,
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/machinery/cm_vending/sorted/tech/electronics_storage{
- density = 0;
- pixel_y = 16
- },
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
- },
-/area/lv522/indoors/lone_buildings/engineering)
"jey" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node,
/obj/effect/landmark/structure_spawner/setup/distress/xeno_nest,
@@ -19728,7 +19757,10 @@
/turf/open/floor/plating,
/area/lv522/indoors/c_block/cargo)
"jkL" = (
-/obj/structure/closet/secure_closet/engineering_electrical,
+/obj/structure/machinery/recharge_station,
+/obj/item/shard{
+ icon_state = "medium"
+ },
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -21213,13 +21245,6 @@
/obj/structure/reagent_dispensers/watertank,
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/outdoors/nw_rockies)
-"jPO" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/prison{
- dir = 10;
- icon_state = "floor_marked"
- },
-/area/lv522/indoors/lone_buildings/engineering)
"jQa" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/prop/dam/crane{
@@ -21281,13 +21306,6 @@
icon_state = "darkpurplefull2"
},
/area/lv522/indoors/a_block/dorms)
-"jSG" = (
-/obj/effect/decal/cleanable/cobweb,
-/turf/open/floor/prison{
- dir = 10;
- icon_state = "floor_marked"
- },
-/area/lv522/indoors/lone_buildings/engineering)
"jSR" = (
/obj/structure/machinery/conveyor,
/turf/open/floor/corsat{
@@ -21595,6 +21613,13 @@
icon_state = "brown"
},
/area/lv522/atmos/east_reactor/south)
+"jYy" = (
+/obj/structure/machinery/power/smes/buildable{
+ capacity = 1e+006;
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/lv522/indoors/lone_buildings/engineering)
"jYE" = (
/obj/structure/machinery/power/apc/weak{
dir = 1
@@ -21941,7 +21966,11 @@
},
/area/lv522/indoors/a_block/security)
"kfi" = (
-/obj/structure/closet/toolcloset,
+/obj/structure/surface/table/almayer,
+/obj/effect/landmark/objective_landmark/close,
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -22486,6 +22515,14 @@
icon_state = "brown"
},
/area/lv522/atmos/east_reactor/south)
+"knT" = (
+/obj/structure/machinery/cm_vending/sorted/tech/tool_storage{
+ density = 0;
+ pixel_x = -6;
+ pixel_y = 11
+ },
+/turf/open/floor/prison,
+/area/lv522/indoors/lone_buildings/engineering)
"knW" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/machinery/camera/autoname{
@@ -23477,6 +23514,14 @@
icon_state = "floor_marked"
},
/area/lv522/outdoors/colony_streets/north_west_street)
+"kIs" = (
+/obj/effect/decal/warning_stripes{
+ icon_state = "NE-out";
+ pixel_x = 1;
+ pixel_y = 1
+ },
+/turf/open/floor/plating,
+/area/lv522/indoors/lone_buildings/engineering)
"kIM" = (
/obj/item/ammo_magazine/rifle/m4ra/ap{
current_rounds = 0
@@ -25813,10 +25858,17 @@
},
/area/lv522/indoors/a_block/kitchen)
"lHu" = (
-/obj/structure/machinery/power/terminal{
- dir = 1
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/machinery/disposal{
+ density = 0;
+ layer = 3.1;
+ pixel_x = -6;
+ pixel_y = 16
},
-/turf/open/floor/plating,
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 6
+ },
+/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/lone_buildings/engineering)
"lHH" = (
/obj/effect/decal/cleanable/dirt,
@@ -25864,9 +25916,6 @@
icon_state = "greenfull"
},
/area/lv522/indoors/b_block/bridge)
-"lIC" = (
-/turf/open/floor/prison,
-/area/lv522/indoors/lone_buildings/engineering)
"lIM" = (
/obj/structure/machinery/door/poddoor/almayer/closed{
id = "Corpo Vault";
@@ -25928,17 +25977,15 @@
},
/area/lv522/atmos/east_reactor/south)
"lKu" = (
-/obj/structure/surface/table/almayer,
-/obj/item/clothing/glasses/meson,
-/obj/item/shard{
- icon_state = "medium"
+/obj/structure/machinery/power/smes/buildable{
+ capacity = 1e+006;
+ dir = 1
},
-/obj/effect/landmark/objective_landmark/close,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
},
+/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"lKC" = (
/obj/effect/landmark/structure_spawner/setup/distress/xeno_weed_node,
@@ -26701,6 +26748,11 @@
icon_state = "cement14"
},
/area/lv522/outdoors/colony_streets/south_street)
+"mdp" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/item/tool/weldingtool,
+/turf/open/floor/plating,
+/area/lv522/indoors/lone_buildings/engineering)
"mdr" = (
/obj/structure/bed/chair{
dir = 4
@@ -27497,6 +27549,14 @@
/obj/effect/landmark/lv624/fog_blocker/short,
/turf/closed/wall/strata_outpost/reinforced,
/area/lv522/oob/w_y_vault)
+"mwC" = (
+/obj/item/clothing/head/welding,
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
+ },
+/turf/open/floor/plating,
+/area/lv522/indoors/lone_buildings/engineering)
"mwT" = (
/obj/structure/prop/dam/truck,
/obj/structure/prop/holidays/wreath{
@@ -29078,9 +29138,6 @@
icon_state = "18"
},
/area/lv522/landing_zone_forecon/UD6_Typhoon)
-"nfx" = (
-/turf/open/floor/plating,
-/area/lv522/indoors/lone_buildings/engineering)
"nfP" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -29284,6 +29341,13 @@
icon_state = "cement12"
},
/area/lv522/outdoors/nw_rockies)
+"nky" = (
+/obj/structure/machinery/power/apc/weak,
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"nkX" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -29710,8 +29774,11 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/security)
"nsd" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/plating_catwalk/prison,
+/obj/effect/decal/cleanable/generic,
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"nsr" = (
/obj/structure/surface/table/almayer,
@@ -30140,6 +30207,11 @@
},
/turf/open/floor/prison,
/area/lv522/indoors/a_block/dorms/glass)
+"nEY" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/pipes/standard/simple/hidden/green,
+/turf/open/floor/plating/plating_catwalk/prison,
+/area/lv522/indoors/lone_buildings/engineering)
"nFj" = (
/turf/open/floor/plating,
/area/lv522/landing_zone_1)
@@ -30431,8 +30503,7 @@
/turf/open/auto_turf/shale/layer1,
/area/lv522/landing_zone_1)
"nMd" = (
-/obj/structure/surface/table/almayer,
-/obj/effect/landmark/objective_landmark/close,
+/obj/structure/closet/toolcloset,
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -31935,13 +32006,13 @@
/turf/closed/wall/strata_ice/dirty,
/area/lv522/oob)
"ooh" = (
-/obj/structure/surface/table/almayer,
-/obj/item/clothing/head/beret/eng,
-/obj/item/ammo_box/magazine/nailgun/empty{
- pixel_x = -6;
- pixel_y = 12
+/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
+ name = "\improper Generator Room";
+ welded = 1
+ },
+/turf/open/floor/corsat{
+ icon_state = "marked"
},
-/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"oot" = (
/turf/open/floor/prison{
@@ -32217,6 +32288,15 @@
icon_state = "blue_plate"
},
/area/lv522/indoors/a_block/admin)
+"otM" = (
+/obj/structure/machinery/space_heater/radiator/red{
+ dir = 4
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"otQ" = (
/turf/open/floor/corsat{
icon_state = "marked"
@@ -33072,12 +33152,8 @@
/turf/open/asphalt/cement,
/area/lv522/outdoors/colony_streets/north_west_street)
"oPc" = (
-/obj/item/clothing/gloves/yellow,
-/obj/structure/machinery/space_heater/radiator/red,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
- },
+/obj/structure/pipes/standard/simple/hidden/green,
+/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/lone_buildings/engineering)
"oPs" = (
/obj/effect/decal/cleanable/dirt,
@@ -33266,8 +33342,14 @@
},
/area/lv522/indoors/a_block/dorms)
"oTp" = (
-/obj/structure/machinery/light,
-/turf/open/floor/plating,
+/obj/structure/surface/table/almayer,
+/obj/item/ammo_box/magazine/nailgun/empty{
+ pixel_y = 5
+ },
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 4
+ },
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"oTD" = (
/obj/item/lightstick/red/spoke/planted{
@@ -33402,13 +33484,6 @@
icon_state = "marked"
},
/area/lv522/indoors/c_block/mining)
-"oWb" = (
-/obj/effect/landmark/static_comms/net_one,
-/turf/open/floor/prison{
- dir = 10;
- icon_state = "floor_marked"
- },
-/area/lv522/indoors/lone_buildings/engineering)
"oWq" = (
/obj/structure/pipes/standard/simple/hidden/green,
/turf/open/floor/corsat{
@@ -34570,6 +34645,11 @@
icon_state = "cell_stripe"
},
/area/lv522/indoors/lone_buildings/storage_blocks)
+"pwT" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/pipes/standard/simple/hidden/green,
+/turf/open/floor/prison,
+/area/lv522/indoors/lone_buildings/engineering)
"pwW" = (
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
@@ -34876,13 +34956,21 @@
/turf/open/floor/prison,
/area/lv522/indoors/b_block/hydro)
"pCT" = (
-/obj/structure/machinery/disposal,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/prison,
+/obj/structure/machinery/power/terminal,
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"pCU" = (
-/obj/item/prop/alien/hugger,
-/turf/open/floor/prison,
+/obj/item/ammo_magazine/smg/nailgun{
+ current_rounds = 0
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"pCW" = (
/obj/structure/pipes/standard/simple/hidden/green{
@@ -35887,10 +35975,6 @@
/obj/structure/pipes/standard/simple/hidden/green{
dir = 4
},
-/obj/structure/machinery/camera/autoname,
-/obj/structure/machinery/light/small{
- dir = 1
- },
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -35904,10 +35988,9 @@
},
/area/lv522/indoors/a_block/admin)
"pXk" = (
-/obj/structure/surface/table/almayer,
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/spawner/random/powercell,
-/obj/structure/machinery/cell_charger,
+/obj/structure/machinery/power/monitor{
+ name = "Main Power Grid Monitoring"
+ },
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -36549,11 +36632,7 @@
},
/area/lv522/indoors/a_block/admin)
"qmA" = (
-/obj/effect/decal/cleanable/generic,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
- },
+/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"qmD" = (
/obj/structure/fence,
@@ -38018,12 +38097,10 @@
},
/area/lv522/indoors/b_block/bar)
"qOa" = (
-/obj/structure/machinery/cm_vending/sorted/tech/comp_storage{
- density = 0;
- pixel_x = -4;
- pixel_y = 12
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
},
-/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"qOi" = (
/obj/structure/prop/invuln/fire{
@@ -38538,13 +38615,11 @@
/turf/open/floor/plating,
/area/lv522/landing_zone_1/tunnel)
"qWf" = (
-/obj/structure/machinery/light{
- dir = 8
- },
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 4
},
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"qWt" = (
/obj/structure/window/framed/strata/reinforced,
@@ -38704,12 +38779,17 @@
},
/area/lv522/indoors/a_block/hallway)
"qZJ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/machinery/camera/autoname{
- dir = 1
+/obj/structure/machinery/light{
+ dir = 8
+ },
+/obj/effect/decal/warning_stripes{
+ icon_state = "N";
+ pixel_y = 1
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
},
-/obj/structure/machinery/light/small,
-/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"qZT" = (
/obj/item/prop/colony/usedbandage{
@@ -38832,11 +38912,9 @@
/turf/open/floor/wood,
/area/lv522/indoors/a_block/fitness/glass)
"rbc" = (
-/obj/item/shard{
- icon_state = "medium"
- },
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating/plating_catwalk/prison,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"rbj" = (
/obj/item/weapon/twohanded/folded_metal_chair,
@@ -39902,6 +39980,11 @@
/obj/structure/machinery/light/double,
/turf/open/floor/wood,
/area/lv522/indoors/a_block/fitness/glass)
+"rwM" = (
+/turf/open/floor/corsat{
+ icon_state = "marked"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"rwR" = (
/obj/structure/desertdam/decals/road_edge{
icon_state = "road_edge_decal3";
@@ -40378,14 +40461,10 @@
},
/area/lv522/outdoors/colony_streets/south_west_street)
"rIn" = (
-/obj/item/ammo_magazine/smg/nailgun{
- current_rounds = 0
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 10
},
+/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/lone_buildings/engineering)
"rIr" = (
/obj/structure/stairs/perspective{
@@ -41188,12 +41267,11 @@
/turf/open/auto_turf/shale/layer0,
/area/lv522/outdoors/colony_streets/north_street)
"rZg" = (
-/obj/structure/machinery/cm_vending/sorted/tech/tool_storage{
- density = 0;
- pixel_x = 5;
- pixel_y = 11
+/obj/effect/decal/warning_stripes{
+ icon_state = "E";
+ pixel_x = 1
},
-/turf/open/floor/prison,
+/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"rZi" = (
/obj/structure/pipes/standard/simple/hidden/green,
@@ -42558,13 +42636,10 @@
},
/area/lv522/indoors/a_block/security/glass)
"sEa" = (
-/obj/structure/extinguisher_cabinet{
- pixel_y = 30
- },
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 4
},
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"sEc" = (
/obj/structure/bed/bedroll{
@@ -42794,16 +42869,6 @@
},
/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/storage_blocks)
-"sJl" = (
-/obj/structure/machinery/power/apc/weak{
- dir = 1
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
- },
-/area/lv522/indoors/lone_buildings/engineering)
"sJI" = (
/obj/structure/surface/table/almayer,
/obj/item/key/cargo_train,
@@ -43249,15 +43314,10 @@
},
/area/lv522/outdoors/n_rockies)
"sQD" = (
-/obj/structure/machinery/colony_floodlight_switch{
- pixel_y = 30
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/decal/cleanable/generic,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 5
},
+/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/lone_buildings/engineering)
"sQI" = (
/obj/effect/decal/cleanable/generic,
@@ -43555,9 +43615,10 @@
},
/area/lv522/outdoors/colony_streets/north_west_street)
"sXM" = (
-/obj/structure/machinery/power/monitor{
- name = "Main Power Grid Monitoring"
- },
+/obj/structure/surface/table/almayer,
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/spawner/random/powercell,
+/obj/structure/machinery/cell_charger,
/turf/open/floor/prison{
dir = 4;
icon_state = "darkyellowfull2"
@@ -46281,6 +46342,17 @@
icon_state = "floor_plate"
},
/area/lv522/indoors/lone_buildings/storage_blocks)
+"udM" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/decal/warning_stripes{
+ icon_state = "NW-out";
+ pixel_y = 1
+ },
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 6
+ },
+/turf/open/floor/plating/plating_catwalk/prison,
+/area/lv522/indoors/lone_buildings/engineering)
"udR" = (
/turf/open/floor/corsat{
dir = 4;
@@ -46721,8 +46793,10 @@
/area/lv522/outdoors/colony_streets/north_east_street)
"ukp" = (
/obj/structure/surface/table/almayer,
-/obj/item/ammo_box/magazine/nailgun/empty{
- pixel_y = 5
+/obj/structure/machinery/recharger,
+/obj/effect/spawner/random/powercell,
+/obj/structure/pipes/standard/simple/hidden/green{
+ dir = 10
},
/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
@@ -47043,12 +47117,10 @@
},
/area/lv522/outdoors/colony_streets/north_street)
"usn" = (
-/obj/structure/machinery/light{
- dir = 4
- },
+/obj/effect/landmark/static_comms/net_one,
/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+ dir = 10;
+ icon_state = "floor_marked"
},
/area/lv522/indoors/lone_buildings/engineering)
"usy" = (
@@ -49144,10 +49216,14 @@
},
/area/lv522/indoors/a_block/security)
"vir" = (
-/obj/structure/machinery/power/geothermal{
- fail_rate = 5
+/obj/structure/closet/wardrobe/engineering_yellow,
+/obj/effect/decal/warning_stripes{
+ icon_state = "SW-out"
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
},
-/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"viA" = (
/obj/item/lightstick/red/spoke/planted{
@@ -49937,11 +50013,10 @@
},
/area/lv522/indoors/a_block/medical)
"vzc" = (
-/obj/structure/closet/wardrobe/engineering_yellow,
-/turf/open/floor/prison{
- dir = 4;
- icon_state = "darkyellowfull2"
+/obj/structure/machinery/power/geothermal{
+ fail_rate = 5
},
+/turf/open/floor/plating,
/area/lv522/indoors/lone_buildings/engineering)
"vzg" = (
/obj/item/stack/rods{
@@ -50339,13 +50414,20 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/dorms)
"vGP" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
+/turf/open/floor/prison{
+ dir = 10;
+ icon_state = "floor_marked"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"vHo" = (
-/obj/item/clothing/head/welding,
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
+/obj/effect/decal/warning_stripes{
+ icon_state = "W"
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"vHw" = (
/obj/structure/barricade/wooden{
@@ -51408,12 +51490,17 @@
},
/area/lv522/indoors/lone_buildings/storage_blocks)
"wbj" = (
-/obj/structure/machinery/door/airlock/multi_tile/almayer/generic{
- name = "\improper Generator Room"
+/obj/structure/machinery/cm_vending/sorted/tech/comp_storage{
+ density = 0;
+ pixel_x = 13;
+ pixel_y = 11
},
-/turf/open/floor/corsat{
- icon_state = "marked"
+/obj/structure/machinery/cm_vending/sorted/tech/electronics_storage{
+ density = 0;
+ pixel_x = -13;
+ pixel_y = 11
},
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"wbt" = (
/obj/structure/pipes/standard/simple/hidden/green,
@@ -51547,9 +51634,7 @@
},
/area/lv522/indoors/a_block/security/glass)
"wdj" = (
-/turf/open/floor/corsat{
- icon_state = "marked"
- },
+/turf/open/floor/prison,
/area/lv522/indoors/lone_buildings/engineering)
"wdy" = (
/turf/open/asphalt/cement{
@@ -53140,7 +53225,11 @@
/turf/open/floor/prison,
/area/lv522/indoors/c_block/mining)
"wOo" = (
-/turf/open/floor/plating/plating_catwalk/prison,
+/obj/structure/pipes/vents/pump,
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"wOu" = (
/obj/structure/desertdam/decals/road_edge{
@@ -53779,10 +53868,11 @@
/turf/open/auto_turf/shale/layer0,
/area/lv522/outdoors/colony_streets/south_east_street)
"xdD" = (
-/obj/structure/window_frame/strata/reinforced,
-/turf/open/floor/corsat{
- icon_state = "marked"
+/obj/structure/pipes/standard/simple/hidden/green,
+/obj/item/shard{
+ icon_state = "medium"
},
+/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/lone_buildings/engineering)
"xdF" = (
/obj/structure/pipes/standard/simple/hidden/green{
@@ -54679,6 +54769,16 @@
icon_state = "cement1"
},
/area/lv522/outdoors/colony_streets/central_streets)
+"xzj" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"xzn" = (
/turf/open/floor/prison,
/area/lv522/atmos/outdoor)
@@ -55117,10 +55217,14 @@
/turf/open/floor/plating/plating_catwalk/prison,
/area/lv522/indoors/a_block/admin)
"xJX" = (
-/obj/item/tool/weldingtool,
-/obj/effect/decal/cleanable/blood/oil,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
+/obj/effect/decal/cleanable/generic,
+/obj/effect/decal/warning_stripes{
+ icon_state = "W"
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
/area/lv522/indoors/lone_buildings/engineering)
"xKc" = (
/obj/structure/barricade/handrail{
@@ -55928,6 +56032,16 @@
},
/turf/open/asphalt/cement,
/area/lv522/outdoors/colony_streets/north_east_street)
+"xZS" = (
+/obj/item/clothing/gloves/yellow,
+/obj/structure/machinery/space_heater/radiator/red{
+ pixel_y = 26
+ },
+/turf/open/floor/prison{
+ dir = 4;
+ icon_state = "darkyellowfull2"
+ },
+/area/lv522/indoors/lone_buildings/engineering)
"yae" = (
/obj/structure/surface/table/almayer,
/obj/item/paper_bin{
@@ -61714,16 +61828,16 @@ ruU
fXx
nJv
xVd
-vir
-vir
-vir
+vGP
+usn
+nJv
nJv
rCa
rCa
nJv
-nJv
-jSG
-oWb
+vzc
+vzc
+vzc
xVd
nJv
hpq
@@ -61940,18 +62054,18 @@ umf
ruU
fXx
nJv
-vir
+nJv
+vGP
vGP
-nfx
qZJ
+otM
+wdj
+qOa
nJv
-sJl
-lIC
-qWf
bzL
-jPO
-jPO
-nJv
+qmA
+qmA
+vzc
nJv
hpq
ofi
@@ -62169,15 +62283,15 @@ fAA
nJv
vir
xJX
-vGP
-nfx
-nJv
+vHo
+udM
+nEY
sQD
nsd
-nsd
-nsd
+nJv
+cNO
qmA
-cjf
+mdp
vzc
nJv
gpB
@@ -62394,17 +62508,17 @@ ruU
ruU
taj
nJv
-vir
-nfx
-vHo
+cfd
+vIy
+vIy
oTp
-nJv
+knT
sEa
-vIy
-ukp
+nky
+nJv
rZg
-vIy
-vIy
+mwC
+kIs
vzc
nJv
gpB
@@ -62620,20 +62734,20 @@ ruU
ruU
ruU
fXx
-xvQ
-izp
+nJv
+nJv
lHu
-vIy
+pwT
fSv
wbj
rIn
wOo
ooh
qOa
-nsd
+vIy
pCT
-nJv
-nJv
+jYy
+xvQ
hpq
ofi
tZh
@@ -62846,22 +62960,22 @@ ruU
ruU
ruU
ruU
-fXx
-xvQ
+fCU
+kvq
izp
-lHu
-vIy
-fSv
+qWf
+icy
+wdj
+wdj
wdj
-cjf
pCU
-lIC
-lIC
+rwM
+qOa
vIy
-lIC
+eXU
lKu
-kvq
-fCU
+xvQ
+hpq
ofi
max
max
@@ -63076,16 +63190,16 @@ ruU
fXx
xvQ
sXM
-vIy
-vIy
+ukp
+xdD
oPc
+nEY
+sQD
+flC
nJv
-jeo
-nsd
-wOo
-nsd
+xZS
rbc
-cfd
+vIy
pXk
xvQ
hpq
@@ -63306,10 +63420,10 @@ xVd
kfi
ebR
jkL
-nJv
+xzj
pWW
qLa
-usn
+nJv
gZg
gUA
nMd
@@ -63531,14 +63645,14 @@ fXx
gbB
nJv
xvQ
-xvQ
-xvQ
+gcX
+kvq
ivK
wng
hpO
ivK
-kvq
-xdD
+xvQ
+xvQ
xvQ
nJv
kmq
diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm
index cec27c56b079..b84ed33ef0e4 100644
--- a/maps/map_files/LV624/LV624.dmm
+++ b/maps/map_files/LV624/LV624.dmm
@@ -12062,7 +12062,7 @@
/area/lv624/lazarus/comms)
"aZi" = (
/obj/structure/surface/table/woodentable/fancy,
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
pixel_y = 26
},
/obj/effect/landmark/item_pool_spawner/survivor_ammo/buckshot,
@@ -14106,10 +14106,9 @@
/turf/open/gm/grass/grass1,
/area/lv624/ground/colony/west_nexus_road)
"fja" = (
-/obj/item/attachable/bayonet{
+/obj/item/weapon/unathiknife{
desc = "A curved blade made of a strange material. It looks both old and very sharp.";
force = 30;
- icon_state = "unathiknife";
name = "\improper alien blade";
throwforce = 26
},
@@ -17272,10 +17271,9 @@
/turf/open/gm/dirt,
/area/lv624/ground/caves/sand_temple)
"nED" = (
-/obj/item/attachable/bayonet{
+/obj/item/weapon/unathiknife{
desc = "A curved blade made of a strange material. It looks both old and very sharp.";
force = 30;
- icon_state = "unathiknife";
name = "\improper alien blade";
throwforce = 26
},
diff --git a/maps/map_files/LV624/standalone/sandtemple-jungle.dmm b/maps/map_files/LV624/standalone/sandtemple-jungle.dmm
index 3b5a0176fb01..770d6a93473e 100644
--- a/maps/map_files/LV624/standalone/sandtemple-jungle.dmm
+++ b/maps/map_files/LV624/standalone/sandtemple-jungle.dmm
@@ -55,10 +55,9 @@
/turf/closed/wall/strata_ice/jungle,
/area/lv624/ground/jungle/south_west_jungle)
"lR" = (
-/obj/item/attachable/bayonet{
+/obj/item/weapon/unathiknife{
desc = "A curved blade made of a strange material. It looks both old and very sharp.";
force = 30;
- icon_state = "unathiknife";
name = "\improper alien blade";
throwforce = 26
},
diff --git a/maps/map_files/New_Varadero/New_Varadero.dmm b/maps/map_files/New_Varadero/New_Varadero.dmm
index 7969b1a120a0..139b956c9622 100644
--- a/maps/map_files/New_Varadero/New_Varadero.dmm
+++ b/maps/map_files/New_Varadero/New_Varadero.dmm
@@ -6101,7 +6101,7 @@
/area/varadero/interior/hall_SE)
"fvw" = (
/obj/structure/surface/table/reinforced/prison,
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
pixel_y = 8
},
/turf/open/floor/shiva{
diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm
index 2da1f3f4295d..17f2e577a120 100644
--- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm
+++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm
@@ -9733,7 +9733,7 @@
},
/area/strata/ag/interior/outpost/canteen)
"aDr" = (
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/turf/open/floor/interior/plastic,
/area/strata/ag/interior/outpost/canteen)
"aDs" = (
@@ -10184,7 +10184,7 @@
},
/area/strata/ag/interior/dorms)
"aEK" = (
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/obj/structure/surface/table/reinforced/prison,
/turf/open/floor/strata{
icon_state = "orange_tile"
@@ -12088,7 +12088,7 @@
},
/area/strata/ag/interior/outpost/admin)
"aKQ" = (
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/obj/structure/surface/table/reinforced/prison,
/turf/open/floor/strata{
dir = 4;
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index b15ee29dd20a..15f92fe53502 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -837,8 +837,8 @@
/area/almayer/living/basketball)
"acJ" = (
/mob/living/silicon/decoy/ship_ai{
- pixel_y = -16;
- layer = 2.98
+ layer = 2.98;
+ pixel_y = -16
},
/obj/structure/blocker/invisible_wall,
/obj/effect/decal/warning_stripes{
@@ -2464,22 +2464,22 @@
/obj/structure/machinery/door_control{
id = "ARES StairsLock";
name = "ARES Exterior Lockdown Override";
- req_one_access_txt = "90;91;92";
+ pixel_x = 8;
pixel_y = -24;
- pixel_x = 8
+ req_one_access_txt = "90;91;92"
},
/obj/structure/machinery/door_control{
id = "ARES Emergency";
name = "ARES Emergency Lockdown Override";
- req_one_access_txt = "91;92";
- pixel_y = -24
+ pixel_y = -24;
+ req_one_access_txt = "91;92"
},
/obj/structure/machinery/door_control{
id = "Brig Lockdown Shutters";
name = "Brig Lockdown Override";
- req_access_txt = "1;3";
pixel_x = -8;
- pixel_y = -24
+ pixel_y = -24;
+ req_access_txt = "1;3"
},
/turf/open/floor/wood/ship,
/area/almayer/living/commandbunks)
@@ -2839,6 +2839,10 @@
pixel_y = 7
},
/obj/effect/decal/cleanable/blood/oil,
+/obj/structure/machinery/computer/working_joe{
+ dir = 4;
+ pixel_x = -17
+ },
/turf/open/floor/almayer{
dir = 8;
icon_state = "silver"
@@ -5322,7 +5326,13 @@
"are" = (
/obj/structure/machinery/computer/demo_sim{
dir = 4;
- pixel_x = -16
+ pixel_x = -17;
+ pixel_y = 8
+ },
+/obj/structure/machinery/computer/working_joe{
+ dir = 4;
+ pixel_x = -17;
+ pixel_y = -8
},
/turf/open/floor/almayer,
/area/almayer/engineering/engineering_workshop/hangar)
@@ -5816,9 +5826,9 @@
/obj/structure/machinery/door_control{
id = "ARES StairsUpper";
name = "ARES Core Access";
- req_one_access_txt = "1;200;90;91;92";
+ pixel_x = -24;
pixel_y = 24;
- pixel_x = -24
+ req_one_access_txt = "1;200;90;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -5840,9 +5850,9 @@
"asG" = (
/obj/structure/surface/table/reinforced/almayer_B{
climbable = 0;
+ indestructible = 1;
unacidable = 1;
- unslashable = 1;
- indestructible = 1
+ unslashable = 1
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -7084,34 +7094,34 @@
/obj/structure/machinery/door_control{
id = "ARES StairsUpper";
name = "ARES Core Access";
- req_one_access_txt = "91;92";
+ pixel_x = -10;
pixel_y = -24;
- pixel_x = -10
+ req_one_access_txt = "91;92"
},
/obj/structure/machinery/door_control{
id = "ARES StairsLock";
name = "ARES Exterior Lockdown";
- req_one_access_txt = "91;92";
- pixel_y = -24
+ pixel_y = -24;
+ req_one_access_txt = "91;92"
},
/obj/structure/surface/table/reinforced/almayer_B{
climbable = 0;
+ indestructible = 1;
unacidable = 1;
- unslashable = 1;
- indestructible = 1
+ unslashable = 1
},
/obj/structure/transmitter/rotary{
- phone_color = "blue";
- phone_id = "AI Reception";
+ name = "AI Reception Telephone";
phone_category = "ARES";
- name = "AI Reception Telephone"
+ phone_color = "blue";
+ phone_id = "AI Reception"
},
/obj/structure/machinery/door_control{
id = "ARES Emergency";
name = "ARES Emergency Lockdown";
- req_one_access_txt = "91;92";
+ pixel_x = 10;
pixel_y = -24;
- pixel_x = 10
+ req_one_access_txt = "91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -7125,9 +7135,9 @@
},
/obj/structure/surface/table/reinforced/almayer_B{
climbable = 0;
+ indestructible = 1;
unacidable = 1;
- unslashable = 1;
- indestructible = 1
+ unslashable = 1
},
/obj/item/paper_bin/uscm{
pixel_y = 6
@@ -9677,6 +9687,9 @@
/area/almayer/shipboard/brig/main_office)
"aEm" = (
/obj/structure/surface/table/almayer,
+/obj/structure/machinery/computer/working_joe{
+ dir = 4
+ },
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -10322,6 +10335,10 @@
},
/area/almayer/living/numbertwobunks)
"aHo" = (
+/obj/structure/machinery/computer/working_joe{
+ dir = 4;
+ pixel_x = -17
+ },
/turf/open/floor/almayer{
dir = 8;
icon_state = "orange"
@@ -10992,31 +11009,31 @@
},
/obj/structure/machinery/door_control{
id = "ARES Interior";
+ indestructible = 1;
name = "ARES Chamber Lockdown";
- req_one_access_txt = "1;200;90;91;92";
pixel_x = 24;
pixel_y = -8;
- indestructible = 1
+ req_one_access_txt = "1;200;90;91;92"
},
/obj/structure/machinery/door_control{
id = "ARES Railing";
+ indestructible = 1;
name = "ARES Chamber Railings";
- req_one_access_txt = "91;92";
- pixel_x = 24;
needs_power = 0;
- indestructible = 1
+ pixel_x = 24;
+ req_one_access_txt = "91;92"
},
/obj/structure/machinery/door/poddoor/railing{
+ closed_layer = 4.1;
+ density = 0;
dir = 2;
id = "ARES Railing";
- unslashable = 0;
- unacidable = 0;
- pixel_y = -1;
- pixel_x = -1;
+ layer = 2.1;
open_layer = 2.1;
- closed_layer = 4.1;
- density = 0;
- layer = 2.1
+ pixel_x = -1;
+ pixel_y = -1;
+ unacidable = 0;
+ unslashable = 0
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -11990,7 +12007,9 @@
/obj/structure/pipes/vents/pump{
dir = 4
},
-/turf/open/floor/almayer,
+/turf/open/floor/almayer{
+ icon_state = "red"
+ },
/area/almayer/squads/alpha)
"aPk" = (
/obj/structure/pipes/standard/simple/hidden/supply{
@@ -12002,10 +12021,14 @@
},
/area/almayer/command/lifeboat)
"aPl" = (
-/obj/structure/pipes/standard/simple/hidden/supply{
- dir = 4
+/obj/structure/machinery/cm_vending/clothing/marine/alpha{
+ density = 0;
+ layer = 4.1;
+ pixel_y = -29
+ },
+/turf/open/floor/almayer{
+ icon_state = "plate"
},
-/turf/open/floor/almayer,
/area/almayer/squads/alpha)
"aPm" = (
/obj/structure/closet/firecloset,
@@ -12014,13 +12037,14 @@
},
/area/almayer/hallways/aft_hallway)
"aPn" = (
-/obj/structure/pipes/standard/simple/hidden/supply{
- dir = 4
+/obj/structure/machinery/cm_vending/clothing/marine/bravo{
+ density = 0;
+ pixel_y = 16
},
/turf/open/floor/almayer{
- icon_state = "redcorner"
+ icon_state = "plate"
},
-/area/almayer/squads/alpha)
+/area/almayer/squads/bravo)
"aPo" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -12110,19 +12134,6 @@
/obj/structure/sign/nosmoking_1,
/turf/closed/wall/almayer,
/area/almayer/squads/alpha)
-"aPM" = (
-/obj/structure/machinery/cm_vending/clothing/marine/alpha,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/alpha)
-"aPN" = (
-/obj/structure/machinery/light,
-/obj/structure/machinery/cm_vending/clothing/marine/alpha,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/alpha)
"aPX" = (
/obj/structure/largecrate/random/case/double,
/turf/open/floor/plating/plating_catwalk,
@@ -12292,69 +12303,16 @@
/obj/structure/sign/nosmoking_1,
/turf/closed/wall/almayer,
/area/almayer/squads/bravo)
-"aQP" = (
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/bravo)
-"aQQ" = (
-/obj/structure/machinery/firealarm{
- pixel_y = 28
- },
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/bravo)
-"aQR" = (
-/obj/item/device/radio/intercom{
- freerange = 1;
- name = "General Listening Channel";
- pixel_y = 28
- },
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/bravo)
-"aQS" = (
-/obj/structure/machinery/light{
- dir = 1
- },
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/bravo)
"aQT" = (
-/obj/structure/machinery/cm_vending/clothing/marine/alpha,
-/obj/structure/machinery/camera/autoname/almayer{
- dir = 1;
- name = "ship-grade camera"
+/obj/structure/machinery/cm_vending/clothing/marine/alpha{
+ density = 0;
+ layer = 4.1;
+ pixel_y = -29
},
/turf/open/floor/almayer{
- icon_state = "plate"
+ icon_state = "cargo_arrow"
},
/area/almayer/squads/alpha)
-"aQU" = (
-/obj/structure/machinery/alarm/almayer{
- dir = 1
- },
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/bravo)
-"aQV" = (
-/obj/structure/machinery/status_display{
- pixel_y = 30
- },
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/bravo)
"aQW" = (
/obj/structure/machinery/vending/cola{
pixel_x = -6;
@@ -12596,7 +12554,10 @@
/area/almayer/squads/bravo)
"aRU" = (
/obj/structure/pipes/vents/pump/on,
-/turf/open/floor/almayer,
+/turf/open/floor/almayer{
+ dir = 1;
+ icon_state = "orange"
+ },
/area/almayer/squads/bravo)
"aRV" = (
/obj/structure/platform{
@@ -12610,7 +12571,10 @@
/obj/structure/pipes/vents/scrubber{
dir = 4
},
-/turf/open/floor/almayer,
+/turf/open/floor/almayer{
+ dir = 1;
+ icon_state = "orange"
+ },
/area/almayer/squads/bravo)
"aRZ" = (
/turf/open/floor/almayer{
@@ -12716,7 +12680,7 @@
/area/almayer/hallways/starboard_hallway)
"aSt" = (
/obj/structure/surface/table/reinforced/almayer_B,
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/turf/open/floor/prison{
icon_state = "kitchen"
},
@@ -12927,12 +12891,13 @@
},
/area/almayer/living/offices)
"aTv" = (
-/obj/structure/machinery/camera/autoname/almayer{
- name = "ship-grade camera"
+/obj/structure/machinery/cm_vending/clothing/marine/bravo{
+ density = 0;
+ pixel_y = 16
},
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
/turf/open/floor/almayer{
- icon_state = "plate"
+ dir = 1;
+ icon_state = "cargo_arrow"
},
/area/almayer/squads/bravo)
"aTw" = (
@@ -12942,12 +12907,7 @@
},
/area/almayer/squads/bravo)
"aTx" = (
-/obj/structure/machinery/light{
- dir = 4
- },
-/obj/structure/machinery/power/apc/almayer{
- dir = 4
- },
+/obj/structure/machinery/power/apc/almayer,
/obj/structure/surface/table/almayer,
/obj/item/tool/hand_labeler,
/turf/open/floor/almayer{
@@ -14290,9 +14250,9 @@
/obj/structure/machinery/door_control{
id = "ARES Mainframe Right";
name = "ARES Mainframe Lockdown";
- req_one_access_txt = "200;91;92";
pixel_x = -24;
- pixel_y = -24
+ pixel_y = -24;
+ req_one_access_txt = "200;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -15367,14 +15327,14 @@
},
/area/almayer/squads/alpha)
"bfw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/obj/item/device/radio/intercom{
freerange = 1;
name = "General Listening Channel";
pixel_y = 28
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
/turf/open/floor/almayer{
dir = 1;
icon_state = "red"
@@ -15431,12 +15391,12 @@
},
/area/almayer/squads/alpha)
"bfD" = (
-/obj/structure/machinery/status_display{
- pixel_y = 30
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/machinery/light{
+ dir = 1
+ },
/turf/open/floor/almayer{
dir = 1;
icon_state = "red"
@@ -15713,19 +15673,16 @@
icon_state = "red"
},
/area/almayer/squads/alpha)
-"bgV" = (
-/turf/open/floor/almayer{
- icon_state = "cargo_arrow"
- },
-/area/almayer/squads/alpha)
"bgW" = (
-/obj/structure/pipes/standard/simple/hidden/supply{
- dir = 4
+/obj/structure/machinery/cm_vending/clothing/marine/charlie{
+ density = 0;
+ layer = 4.1;
+ pixel_y = -29
},
/turf/open/floor/almayer{
- icon_state = "cargo_arrow"
+ icon_state = "plate"
},
-/area/almayer/squads/alpha)
+/area/almayer/squads/charlie)
"bgY" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -16418,7 +16375,7 @@
"blB" = (
/turf/open/floor/almayer{
dir = 1;
- icon_state = "cargo_arrow"
+ icon_state = "orange"
},
/area/almayer/squads/bravo)
"blZ" = (
@@ -17216,6 +17173,9 @@
/obj/structure/sign/poster{
pixel_y = 32
},
+/obj/structure/machinery/light{
+ dir = 8
+ },
/turf/open/floor/almayer{
dir = 8;
icon_state = "red"
@@ -18183,7 +18143,7 @@
/area/almayer/squads/bravo)
"buQ" = (
/obj/structure/surface/table/almayer,
-/obj/structure/machinery/computer/station_alert{
+/obj/structure/machinery/computer/working_joe{
dir = 8
},
/turf/open/floor/almayer{
@@ -20411,19 +20371,6 @@
icon_state = "orange"
},
/area/almayer/engineering/lower_engineering)
-"bFh" = (
-/obj/structure/machinery/cm_vending/clothing/marine/charlie,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/charlie)
-"bFi" = (
-/obj/structure/machinery/light,
-/obj/structure/machinery/cm_vending/clothing/marine/charlie,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/charlie)
"bFj" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
@@ -21071,12 +21018,12 @@
plane = -7
},
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/turf/open/floor/almayer/no_build{
@@ -21103,11 +21050,11 @@
},
/area/almayer/squads/req)
"bIw" = (
-/obj/structure/machinery/prop/almayer/computer,
/obj/structure/surface/table/almayer,
/obj/structure/machinery/light{
dir = 1
},
+/obj/structure/machinery/computer/working_joe,
/turf/open/floor/almayer{
dir = 1;
icon_state = "red"
@@ -21868,17 +21815,17 @@
/obj/structure/machinery/door_control{
id = "ARES StairsLower";
name = "ARES Core Lockdown";
- req_one_access_txt = "19;200;90;91;92";
pixel_x = 24;
- pixel_y = -8
+ pixel_y = -8;
+ req_one_access_txt = "19;200;90;91;92"
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
dir = 8;
pixel_y = 2
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"bLw" = (
@@ -23072,20 +23019,8 @@
/obj/structure/pipes/vents/pump{
dir = 4
},
-/turf/open/floor/almayer,
-/area/almayer/squads/charlie)
-"bQB" = (
-/obj/structure/pipes/standard/simple/hidden/supply{
- dir = 4
- },
-/turf/open/floor/almayer,
-/area/almayer/squads/charlie)
-"bQC" = (
-/obj/structure/pipes/standard/simple/hidden/supply{
- dir = 4
- },
/turf/open/floor/almayer{
- icon_state = "emeraldcorner"
+ icon_state = "emerald"
},
/area/almayer/squads/charlie)
"bQD" = (
@@ -23265,22 +23200,22 @@
plane = -7
},
/obj/effect/step_trigger/ares_alert/public{
+ alert_id = "AresStairs";
alert_message = "Caution: Movement detected in ARES Core.";
- cooldown_duration = 1200;
- alert_id = "AresStairs"
+ cooldown_duration = 1200
},
/obj/effect/step_trigger/ares_alert/public{
+ alert_id = "AresStairs";
alert_message = "Caution: Movement detected in ARES Core.";
- cooldown_duration = 1200;
- alert_id = "AresStairs"
+ cooldown_duration = 1200
},
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/turf/open/floor/almayer/no_build{
@@ -23736,7 +23671,10 @@
/obj/structure/pipes/vents/scrubber{
dir = 4
},
-/turf/open/floor/almayer,
+/turf/open/floor/almayer{
+ dir = 1;
+ icon_state = "blue"
+ },
/area/almayer/squads/delta)
"bTE" = (
/turf/open/floor/almayer{
@@ -26151,13 +26089,13 @@
/turf/open/floor/almayer,
/area/almayer/living/grunt_rnr)
"cdP" = (
-/obj/structure/machinery/cm_vending/clothing/marine/charlie,
-/obj/structure/machinery/camera/autoname/almayer{
- dir = 1;
- name = "ship-grade camera"
+/obj/structure/machinery/cm_vending/clothing/marine/charlie{
+ density = 0;
+ layer = 4.1;
+ pixel_y = -29
},
/turf/open/floor/almayer{
- icon_state = "plate"
+ icon_state = "cargo_arrow"
},
/area/almayer/squads/charlie)
"cdT" = (
@@ -26664,6 +26602,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/machinery/camera/autoname/almayer,
/turf/open/floor/almayer{
dir = 1;
icon_state = "emerald"
@@ -26896,17 +26835,12 @@
icon_state = "emerald"
},
/area/almayer/squads/charlie)
-"cje" = (
-/turf/open/floor/almayer{
- icon_state = "cargo_arrow"
- },
-/area/almayer/squads/charlie)
"cjf" = (
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
},
/turf/open/floor/almayer{
- icon_state = "cargo_arrow"
+ icon_state = "emerald"
},
/area/almayer/squads/charlie)
"cjg" = (
@@ -27017,15 +26951,6 @@
icon_state = "emerald"
},
/area/almayer/squads/charlie)
-"cjF" = (
-/obj/structure/machinery/camera/autoname/almayer{
- name = "ship-grade camera"
- },
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/delta)
"cjK" = (
/obj/structure/machinery/door/airlock/almayer/maint,
/obj/structure/disposalpipe/segment{
@@ -27137,50 +27062,6 @@
icon_state = "plate"
},
/area/almayer/squads/delta)
-"cks" = (
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/delta)
-"cku" = (
-/obj/item/device/radio/intercom{
- freerange = 1;
- name = "General Listening Channel";
- pixel_y = 28
- },
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/delta)
-"ckv" = (
-/obj/structure/machinery/light{
- dir = 1
- },
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/delta)
-"ckx" = (
-/obj/structure/machinery/alarm/almayer{
- dir = 1
- },
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/delta)
-"cky" = (
-/obj/structure/machinery/status_display{
- pixel_y = 30
- },
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/turf/open/floor/almayer{
- icon_state = "plate"
- },
-/area/almayer/squads/delta)
"ckB" = (
/obj/structure/machinery/door/airlock/almayer/maint{
dir = 1;
@@ -27234,9 +27115,12 @@
},
/area/almayer/squads/delta)
"ckR" = (
+/obj/structure/machinery/cm_vending/clothing/marine/delta{
+ density = 0;
+ pixel_y = 16
+ },
/turf/open/floor/almayer{
- dir = 1;
- icon_state = "cargo_arrow"
+ icon_state = "plate"
},
/area/almayer/squads/delta)
"ckS" = (
@@ -27323,6 +27207,11 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/item/device/radio/intercom{
+ freerange = 1;
+ name = "General Listening Channel";
+ pixel_y = -29
+ },
/turf/open/floor/almayer{
dir = 8;
icon_state = "bluecorner"
@@ -27355,6 +27244,10 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/machinery/alarm/almayer{
+ dir = 1;
+ pixel_y = -29
+ },
/turf/open/floor/almayer{
icon_state = "blue"
},
@@ -27404,9 +27297,9 @@
"clw" = (
/obj/structure/machinery/light{
dir = 8;
+ invisibility = 101;
unacidable = 1;
- unslashable = 1;
- invisibility = 101
+ unslashable = 1
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -28012,9 +27905,7 @@
},
/area/almayer/squads/charlie)
"coj" = (
-/obj/structure/machinery/power/apc/almayer{
- dir = 4
- },
+/obj/structure/machinery/power/apc/almayer,
/obj/structure/surface/table/almayer,
/obj/item/tool/hand_labeler,
/turf/open/floor/almayer{
@@ -28152,8 +28043,8 @@
pixel_y = 6
},
/obj/item/folder/white{
- pixel_y = 6;
- pixel_x = 5
+ pixel_x = 5;
+ pixel_y = 6
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -28644,8 +28535,8 @@
icon_state = "ramptop"
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"cBs" = (
@@ -30460,12 +30351,13 @@
},
/area/almayer/hull/lower_hull/l_f_s)
"dpO" = (
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
-/obj/structure/sign/banners/maximumeffort{
- pixel_y = 30
+/obj/structure/machinery/cm_vending/clothing/marine/delta{
+ density = 0;
+ pixel_y = 16
},
/turf/open/floor/almayer{
- icon_state = "plate"
+ dir = 1;
+ icon_state = "cargo_arrow"
},
/area/almayer/squads/delta)
"dpV" = (
@@ -31267,8 +31159,8 @@
dir = 1
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"dGr" = (
@@ -31619,8 +31511,8 @@
dir = 1
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"dQv" = (
@@ -33167,9 +33059,9 @@
/obj/structure/machinery/door_control{
id = "ARES Mainframe Left";
name = "ARES Mainframe Lockdown";
- req_one_access_txt = "200;91;92";
pixel_x = 24;
- pixel_y = 24
+ pixel_y = 24;
+ req_one_access_txt = "200;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "tcomms"
@@ -33866,9 +33758,9 @@
},
/obj/structure/machinery/light{
dir = 4;
+ invisibility = 101;
unacidable = 1;
- unslashable = 1;
- invisibility = 101
+ unslashable = 1
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -34697,8 +34589,8 @@
dir = 1
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"fdj" = (
@@ -35097,6 +34989,18 @@
},
/turf/open/floor/almayer,
/area/almayer/command/lifeboat)
+"foL" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/almayer{
+ dir = 4;
+ icon_state = "emeraldcorner"
+ },
+/area/almayer/squads/charlie)
"fpd" = (
/obj/structure/sign/safety/hvac_old{
pixel_x = 8;
@@ -36195,13 +36099,13 @@
/obj/structure/machinery/door_control{
id = "ARES Operations Right";
name = "ARES Operations Shutter";
- req_one_access_txt = "1;200;91;92";
pixel_x = 24;
- pixel_y = -8
+ pixel_y = -8;
+ req_one_access_txt = "1;200;91;92"
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"fMt" = (
@@ -36212,12 +36116,12 @@
},
/obj/effect/step_trigger/ares_alert/core,
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/obj/structure/sign/safety/laser{
@@ -36225,8 +36129,8 @@
pixel_y = -8
},
/obj/structure/sign/safety/rewire{
- pixel_y = 6;
- pixel_x = 32
+ pixel_x = 32;
+ pixel_y = 6
},
/turf/open/floor/almayer/no_build{
icon_state = "test_floor4"
@@ -36749,12 +36653,12 @@
pixel_y = 8
},
/obj/structure/transmitter/rotary{
- pixel_x = 8;
- pixel_y = -8;
+ name = "AI Core Telephone";
+ phone_category = "ARES";
phone_color = "blue";
phone_id = "AI Core";
- phone_category = "ARES";
- name = "AI Core Telephone"
+ pixel_x = 8;
+ pixel_y = -8
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -36762,8 +36666,8 @@
/area/almayer/command/airoom)
"gbg" = (
/obj/structure/sign/safety/terminal{
- pixel_y = 24;
- pixel_x = 14
+ pixel_x = 14;
+ pixel_y = 24
},
/obj/structure/sign/safety/laser{
pixel_y = 24
@@ -36778,9 +36682,9 @@
/obj/structure/machinery/door_control{
id = "ARES Operations Right";
name = "ARES Operations Shutter";
- req_one_access_txt = "1;200;91;92";
pixel_x = -24;
- pixel_y = -8
+ pixel_y = -8;
+ req_one_access_txt = "1;200;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -37167,13 +37071,13 @@
/area/almayer/hull/lower_hull/l_f_s)
"gjw" = (
/obj/structure/machinery/faxmachine/uscm/command{
+ density = 0;
department = "AI Core";
- pixel_y = 32;
- density = 0
+ pixel_y = 32
},
/obj/structure/surface/rack{
- pixel_y = 16;
- density = 0
+ density = 0;
+ pixel_y = 16
},
/obj/structure/machinery/computer/working_joe{
dir = 8;
@@ -37520,7 +37424,7 @@
name = "Medical Telephone";
phone_category = "Almayer";
phone_id = "Medical Lower";
- pixel_x = 23
+ pixel_x = 16
},
/turf/open/floor/almayer{
icon_state = "sterile_green"
@@ -37830,9 +37734,9 @@
/area/almayer/hallways/starboard_hallway)
"gyN" = (
/obj/structure/machinery/prop{
+ desc = "It's a server box...";
icon_state = "comm_server";
- name = "server box";
- desc = "It's a server box..."
+ name = "server box"
},
/turf/open/floor/almayer/no_build{
icon_state = "test_floor4"
@@ -38475,23 +38379,23 @@
},
/obj/structure/machinery/door_control{
id = "ARES Interior";
+ indestructible = 1;
name = "ARES Chamber Lockdown";
- req_one_access_txt = "1;200;90;91;92";
pixel_x = -24;
pixel_y = -8;
- indestructible = 1
+ req_one_access_txt = "1;200;90;91;92"
},
/obj/structure/machinery/door/poddoor/railing{
+ closed_layer = 4.1;
+ density = 0;
dir = 2;
id = "ARES Railing";
- unslashable = 0;
- unacidable = 0;
- pixel_y = -1;
- pixel_x = -1;
+ layer = 2.1;
open_layer = 2.1;
- density = 0;
- closed_layer = 4.1;
- layer = 2.1
+ pixel_x = -1;
+ pixel_y = -1;
+ unacidable = 0;
+ unslashable = 0
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -38538,24 +38442,24 @@
},
/obj/structure/machinery/door_control{
id = "ARES Interior";
+ indestructible = 1;
name = "ARES Chamber Lockdown";
- req_one_access_txt = "1;200;90;91;92";
pixel_x = 24;
pixel_y = 8;
- indestructible = 1
+ req_one_access_txt = "1;200;90;91;92"
},
/obj/structure/machinery/door/poddoor/railing{
- id = "ARES Railing";
- unslashable = 0;
- unacidable = 0;
- open_layer = 2.1;
+ closed_layer = 4;
density = 0;
+ id = "ARES Railing";
layer = 2.1;
- closed_layer = 4
+ open_layer = 2.1;
+ unacidable = 0;
+ unslashable = 0
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"gPc" = (
@@ -38858,9 +38762,9 @@
"gXs" = (
/obj/effect/step_trigger/ares_alert/terminals,
/obj/structure/machinery/door/poddoor/shutters/almayer{
+ dir = 4;
id = "ARES Operations Right";
- name = "\improper ARES Operations Shutters";
- dir = 4
+ name = "\improper ARES Operations Shutters"
},
/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
dir = 4
@@ -39046,12 +38950,12 @@
/area/almayer/medical/upper_medical)
"hbZ" = (
/obj/structure/surface/table/almayer,
-/obj/structure/machinery/computer/station_alert{
- dir = 4
- },
/obj/structure/sign/safety/terminal{
pixel_x = -17
},
+/obj/structure/machinery/computer/working_joe{
+ dir = 4
+ },
/turf/open/floor/almayer{
dir = 8;
icon_state = "orange"
@@ -39833,13 +39737,27 @@
/area/almayer/hallways/port_hallway)
"hvv" = (
/obj/structure/disposalpipe/segment,
-/obj/item/clipboard,
-/obj/item/paper,
-/obj/item/tool/pen/blue,
/obj/structure/pipes/standard/manifold/hidden/supply{
dir = 8
},
+/obj/item/clipboard{
+ base_pixel_x = 20;
+ pixel_x = 5
+ },
+/obj/item/paper{
+ pixel_x = 5
+ },
+/obj/item/tool/pen/blue{
+ pixel_x = 5
+ },
/obj/structure/surface/table/reinforced/black,
+/obj/structure/transmitter/rotary{
+ name = "CIC Reception Telephone";
+ phone_category = "Command";
+ phone_id = "CIC Reception";
+ pixel_x = -7;
+ pixel_y = 4
+ },
/turf/open/floor/almayer,
/area/almayer/command/cic)
"hvw" = (
@@ -40132,6 +40050,18 @@
icon_state = "sterile_green_side"
},
/area/almayer/medical/lower_medical_medbay)
+"hAZ" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/machinery/light,
+/turf/open/floor/almayer{
+ icon_state = "blue"
+ },
+/area/almayer/squads/delta)
"hBc" = (
/obj/structure/pipes/vents/scrubber{
dir = 4
@@ -40790,12 +40720,12 @@
pixel_y = 24
},
/obj/structure/machinery/computer/crew/alt{
- pixel_x = -17;
- dir = 4
+ dir = 4;
+ pixel_x = -17
},
/obj/structure/sign/safety/terminal{
- pixel_y = 24;
- pixel_x = 14
+ pixel_x = 14;
+ pixel_y = 24
},
/obj/structure/sign/safety/fibre_optics{
pixel_x = 14;
@@ -40868,10 +40798,10 @@
/area/almayer/hull/lower_hull/l_a_p)
"hTl" = (
/obj/structure/prop/server_equipment/yutani_server{
- pixel_y = 16;
- name = "server tower";
+ density = 0;
desc = "A powerful server tower housing various AI functions.";
- density = 0
+ name = "server tower";
+ pixel_y = 16
},
/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
/turf/open/floor/almayer/no_build{
@@ -41454,7 +41384,10 @@
},
/area/almayer/medical/lower_medical_medbay)
"ihM" = (
-/obj/structure/machinery/cm_vending/clothing/marine/delta,
+/obj/structure/machinery/cm_vending/clothing/marine/delta{
+ density = 0;
+ pixel_y = 16
+ },
/obj/structure/sign/safety/cryo{
pixel_x = 32
},
@@ -41958,24 +41891,24 @@
},
/obj/structure/machinery/door_control{
id = "ARES Interior";
+ indestructible = 1;
name = "ARES Chamber Lockdown";
- req_one_access_txt = "1;200;90;91;92";
pixel_x = -24;
pixel_y = 8;
- indestructible = 1
+ req_one_access_txt = "1;200;90;91;92"
},
/obj/structure/machinery/door/poddoor/railing{
- id = "ARES Railing";
- unslashable = 0;
- unacidable = 0;
- open_layer = 2.1;
+ closed_layer = 4;
density = 0;
+ id = "ARES Railing";
layer = 2.1;
- closed_layer = 4
+ open_layer = 2.1;
+ unacidable = 0;
+ unslashable = 0
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"itR" = (
@@ -42210,10 +42143,10 @@
"iyH" = (
/obj/structure/surface/table/reinforced/almayer_B{
climbable = 0;
- unacidable = 1;
- unslashable = 1;
+ desc = "A square metal surface resting on its fat metal bottom. You can't flip something that doesn't have legs. This one has a metal rail running above it, preventing something large passing over. Like you.";
indestructible = 1;
- desc = "A square metal surface resting on its fat metal bottom. You can't flip something that doesn't have legs. This one has a metal rail running above it, preventing something large passing over. Like you."
+ unacidable = 1;
+ unslashable = 1
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -43288,8 +43221,8 @@
dir = 1
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"iZG" = (
@@ -44152,12 +44085,12 @@
},
/obj/effect/step_trigger/ares_alert/core,
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/turf/open/floor/almayer/no_build{
@@ -44521,8 +44454,8 @@
/obj/structure/machinery/door_control{
id = "ARES StairsUpper";
name = "ARES Core Access";
- req_one_access_txt = "19;200;90;91;92";
- pixel_x = 24
+ pixel_x = 24;
+ req_one_access_txt = "19;200;90;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -45231,7 +45164,11 @@
/turf/open/floor/almayer,
/area/almayer/shipboard/brig/cells)
"jVr" = (
-/obj/structure/machinery/cm_vending/clothing/marine/alpha,
+/obj/structure/machinery/cm_vending/clothing/marine/alpha{
+ density = 0;
+ layer = 4.1;
+ pixel_y = -29
+ },
/obj/structure/sign/safety/cryo{
pixel_x = 32
},
@@ -45815,6 +45752,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/structure/machinery/light,
/turf/open/floor/almayer{
icon_state = "orange"
},
@@ -46574,13 +46512,13 @@
/obj/structure/machinery/door_control{
id = "ARES StairsLower";
name = "ARES Core Lockdown";
- req_one_access_txt = "19;200;90;91;92";
pixel_x = -24;
- pixel_y = -8
+ pixel_y = -8;
+ req_one_access_txt = "19;200;90;91;92"
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"kAh" = (
@@ -46983,8 +46921,8 @@
icon_state = "ramptop"
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"kKG" = (
@@ -47339,9 +47277,9 @@
/obj/structure/machinery/door_control{
id = "ARES Mainframe Right";
name = "ARES Mainframe Lockdown";
- req_one_access_txt = "200;91;92";
pixel_x = -24;
- pixel_y = 24
+ pixel_y = 24;
+ req_one_access_txt = "200;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "tcomms"
@@ -47537,7 +47475,10 @@
/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/lower_hull/l_f_p)
"kXa" = (
-/obj/structure/machinery/cm_vending/clothing/marine/bravo,
+/obj/structure/machinery/cm_vending/clothing/marine/bravo{
+ density = 0;
+ pixel_y = 16
+ },
/obj/structure/sign/safety/cryo{
pixel_x = 32
},
@@ -47557,8 +47498,8 @@
/area/almayer/command/computerlab)
"kXj" = (
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"kXu" = (
@@ -48229,22 +48170,26 @@
pixel_y = 24
},
/obj/structure/sign/safety/terminal{
- pixel_y = 24;
- pixel_x = 14
+ pixel_x = 14;
+ pixel_y = 24
},
/obj/structure/machinery/door_control{
id = "ARES Operations Left";
name = "ARES Operations Shutter";
- req_one_access_txt = "1;200;91;92";
pixel_x = 24;
- pixel_y = -8
+ pixel_y = -8;
+ req_one_access_txt = "1;200;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
},
/area/almayer/command/airoom)
"lok" = (
-/obj/structure/machinery/cm_vending/clothing/marine/charlie,
+/obj/structure/machinery/cm_vending/clothing/marine/charlie{
+ density = 0;
+ layer = 4.1;
+ pixel_y = -29
+ },
/obj/structure/sign/safety/cryo{
pixel_x = 32
},
@@ -48266,6 +48211,23 @@
"loP" = (
/turf/closed/wall/almayer,
/area/almayer/engineering/laundry)
+"loS" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/item/device/radio/intercom{
+ freerange = 1;
+ name = "General Listening Channel";
+ pixel_y = -29
+ },
+/obj/structure/machinery/light,
+/turf/open/floor/almayer{
+ icon_state = "bluecorner"
+ },
+/area/almayer/squads/delta)
"loV" = (
/obj/structure/desertdam/decals/road_edge{
icon_state = "road_edge_decal3";
@@ -49790,6 +49752,9 @@
"lXg" = (
/obj/structure/surface/table/almayer,
/obj/structure/machinery/recharger,
+/obj/structure/machinery/computer/working_joe{
+ pixel_y = 16
+ },
/turf/open/floor/almayer{
icon_state = "plate"
},
@@ -50606,6 +50571,20 @@
},
/turf/open/floor/almayer,
/area/almayer/lifeboat_pumps/north1)
+"mtr" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/machinery/status_display{
+ pixel_y = -29
+ },
+/turf/open/floor/almayer{
+ icon_state = "orange"
+ },
+/area/almayer/squads/bravo)
"mtD" = (
/obj/structure/machinery/status_display{
pixel_x = 16;
@@ -50678,6 +50657,10 @@
dir = 4
},
/obj/structure/pipes/standard/manifold/hidden/supply,
+/obj/structure/machinery/camera/autoname/almayer{
+ dir = 1;
+ name = "ship-grade camera"
+ },
/turf/open/floor/almayer{
icon_state = "bluecorner"
},
@@ -50807,9 +50790,6 @@
},
/area/almayer/hull/lower_hull/l_f_s)
"mzg" = (
-/obj/structure/sign/poster{
- pixel_y = -32
- },
/turf/open/floor/almayer{
icon_state = "emerald"
},
@@ -51042,12 +51022,12 @@
plane = -7
},
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/turf/open/floor/almayer/no_build{
@@ -51131,8 +51111,8 @@
/area/almayer/medical/medical_science)
"mHE" = (
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"mHO" = (
@@ -51631,17 +51611,17 @@
},
/obj/effect/step_trigger/ares_alert/core,
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/obj/structure/sign/safety/terminal{
- pixel_y = -8;
- pixel_x = -18
+ pixel_x = -18;
+ pixel_y = -8
},
/obj/structure/sign/safety/fibre_optics{
pixel_x = -18;
@@ -51791,9 +51771,9 @@
"mUC" = (
/obj/structure/machinery/light{
dir = 4;
+ invisibility = 101;
unacidable = 1;
- unslashable = 1;
- invisibility = 101
+ unslashable = 1
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -51887,6 +51867,9 @@
name = "synthetic potted plant";
pixel_y = 8
},
+/obj/structure/sign/banners/maximumeffort{
+ pixel_y = 30
+ },
/turf/open/floor/almayer{
dir = 9;
icon_state = "blue"
@@ -52424,7 +52407,7 @@
"njd" = (
/obj/structure/pipes/standard/manifold/hidden/supply,
/turf/open/floor/almayer{
- icon_state = "cargo_arrow"
+ icon_state = "red"
},
/area/almayer/squads/alpha)
"njD" = (
@@ -53222,6 +53205,22 @@
/obj/effect/landmark/late_join/charlie,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/squads/charlie)
+"nCp" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/item/device/radio/intercom{
+ freerange = 1;
+ name = "General Listening Channel";
+ pixel_y = -29
+ },
+/turf/open/floor/almayer{
+ icon_state = "orange"
+ },
+/area/almayer/squads/bravo)
"nDd" = (
/obj/structure/closet/secure_closet/guncabinet/red,
/obj/item/ammo_magazine/smg/m39,
@@ -54286,8 +54285,8 @@
layer = 3.3
},
/obj/structure/sign/safety/terminal{
- pixel_y = 24;
- pixel_x = 14
+ pixel_x = 14;
+ pixel_y = 24
},
/obj/structure/sign/safety/fibre_optics{
pixel_x = 14;
@@ -55013,8 +55012,8 @@
},
/obj/structure/platform_decoration,
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"osz" = (
@@ -55709,8 +55708,8 @@
/obj/structure/machinery/door_control{
id = "ARES StairsUpper";
name = "ARES Core Access";
- req_one_access_txt = "19;200;90;91;92";
- pixel_x = -24
+ pixel_x = -24;
+ req_one_access_txt = "19;200;90;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -55767,9 +55766,9 @@
/obj/structure/machinery/door_control{
id = "ARES StairsLower";
name = "ARES Core Lockdown";
- req_one_access_txt = "19;200;90;91;92";
pixel_x = -24;
- pixel_y = 8
+ pixel_y = 8;
+ req_one_access_txt = "19;200;90;91;92"
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
dir = 4;
@@ -55777,8 +55776,8 @@
},
/obj/effect/step_trigger/clone_cleaner,
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"oLv" = (
@@ -56167,6 +56166,10 @@
},
/obj/effect/decal/cleanable/cobweb2/dynamic,
/obj/item/packageWrap,
+/obj/structure/machinery/computer/working_joe{
+ dir = 8;
+ pixel_x = 17
+ },
/turf/open/floor/almayer{
icon_state = "test_floor5"
},
@@ -56807,10 +56810,10 @@
/area/almayer/living/briefing)
"pmV" = (
/obj/structure/prop/server_equipment/yutani_server/broken{
- pixel_y = 16;
- name = "server tower";
+ density = 0;
desc = "A powerful server tower housing various AI functions.";
- density = 0
+ name = "server tower";
+ pixel_y = 16
},
/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
/turf/open/floor/almayer/no_build{
@@ -58434,8 +58437,8 @@
dir = 8
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"pYo" = (
@@ -59432,13 +59435,13 @@
/obj/structure/machinery/door_control{
id = "ARES Operations Left";
name = "ARES Operations Shutter";
- req_one_access_txt = "1;200;91;92";
pixel_x = -24;
- pixel_y = -8
+ pixel_y = -8;
+ req_one_access_txt = "1;200;91;92"
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"qxA" = (
@@ -60700,9 +60703,9 @@
/obj/structure/machinery/door_control{
id = "ARES Mainframe Left";
name = "ARES Mainframe Lockdown";
- req_one_access_txt = "200;91;92";
pixel_x = 24;
- pixel_y = -24
+ pixel_y = -24;
+ req_one_access_txt = "200;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -61227,8 +61230,8 @@
pixel_y = 1
},
/obj/structure/machinery/computer/crew/alt{
- pixel_x = 17;
- dir = 8
+ dir = 8;
+ pixel_x = 17
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -61276,9 +61279,9 @@
"roH" = (
/obj/effect/step_trigger/ares_alert/terminals,
/obj/structure/machinery/door/poddoor/shutters/almayer{
+ dir = 4;
id = "ARES Operations Left";
- name = "\improper ARES Operations Shutters";
- dir = 4
+ name = "\improper ARES Operations Shutters"
},
/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
dir = 4
@@ -61393,11 +61396,17 @@
/turf/open/floor/plating,
/area/almayer/living/offices/flight)
"rrq" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/machinery/status_display{
+ pixel_y = 30
+ },
/turf/open/floor/almayer{
- dir = 8;
- icon_state = "blue"
+ dir = 1;
+ icon_state = "red"
},
-/area/almayer/squads/delta)
+/area/almayer/squads/alpha)
"rrB" = (
/obj/structure/machinery/door/airlock/multi_tile/almayer/comdoor/reinforced{
name = "\improper Cryogenics Bay"
@@ -61594,7 +61603,7 @@
"rvT" = (
/obj/structure/pipes/standard/manifold/hidden/supply,
/turf/open/floor/almayer{
- icon_state = "cargo_arrow"
+ icon_state = "emerald"
},
/area/almayer/squads/charlie)
"rwv" = (
@@ -62989,9 +62998,9 @@
},
/obj/structure/machinery/light{
dir = 8;
+ invisibility = 101;
unacidable = 1;
- unslashable = 1;
- invisibility = 101
+ unslashable = 1
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -62999,8 +63008,8 @@
/area/almayer/command/airoom)
"sdl" = (
/obj/structure/surface/rack{
- pixel_y = 16;
- density = 0
+ density = 0;
+ pixel_y = 16
},
/obj/item/tool/wet_sign,
/obj/item/tool/wet_sign,
@@ -64440,8 +64449,14 @@
/turf/open/floor/plating/plating_catwalk,
/area/almayer/lifeboat_pumps/south1)
"sNb" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/machinery/light,
/turf/open/floor/almayer{
- dir = 8;
icon_state = "orange"
},
/area/almayer/squads/bravo)
@@ -65555,8 +65570,8 @@
"tmK" = (
/obj/structure/machinery/door/airlock/almayer/maint{
dir = 1;
- req_one_access_txt = "91;92";
- req_one_access = null
+ req_one_access = null;
+ req_one_access_txt = "91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "test_floor4"
@@ -69661,6 +69676,9 @@
name = "synthetic potted plant";
pixel_y = 8
},
+/obj/structure/machinery/alarm/almayer{
+ dir = 1
+ },
/turf/open/floor/almayer{
dir = 9;
icon_state = "orange"
@@ -70002,10 +70020,10 @@
/area/almayer/hull/lower_hull/l_m_p)
"vhe" = (
/obj/structure/prop/server_equipment/yutani_server{
- pixel_y = 16;
- name = "server tower";
+ density = 0;
desc = "A powerful server tower housing various AI functions.";
- density = 0
+ name = "server tower";
+ pixel_y = 16
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -70902,8 +70920,8 @@
dir = 4
},
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 8
+ dir = 8;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"vBm" = (
@@ -71238,6 +71256,9 @@
/obj/structure/pipes/standard/simple/hidden/supply{
dir = 4
},
+/obj/structure/machinery/firealarm{
+ pixel_y = -29
+ },
/turf/open/floor/almayer{
icon_state = "orange"
},
@@ -72549,17 +72570,17 @@
plane = -7
},
/obj/effect/step_trigger/ares_alert/public{
+ alert_id = "AresStairs";
alert_message = "Caution: Movement detected in ARES Core.";
- cooldown_duration = 1200;
- alert_id = "AresStairs"
+ cooldown_duration = 1200
},
/obj/structure/machinery/door/poddoor/almayer/blended/white/open{
- open_layer = 1.9;
+ closed_layer = 3.2;
id = "ARES Emergency";
- needs_power = 0;
- name = "ARES Emergency Lockdown";
layer = 3.2;
- closed_layer = 3.2;
+ name = "ARES Emergency Lockdown";
+ needs_power = 0;
+ open_layer = 1.9;
plane = -7
},
/turf/open/floor/almayer/no_build{
@@ -73204,9 +73225,9 @@
/obj/structure/surface/table/reinforced/almayer_B,
/obj/structure/machinery/door_control{
id = "ARES Emergency";
+ indestructible = 1;
name = "ARES Emergency Lockdown";
- req_one_access_txt = "91;92";
- indestructible = 1
+ req_one_access_txt = "91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "plating"
@@ -74530,8 +74551,8 @@
/area/almayer/living/gym)
"xbN" = (
/obj/structure/surface/rack{
- pixel_y = 16;
- density = 0
+ density = 0;
+ pixel_y = 16
},
/obj/structure/janitorialcart,
/obj/item/tool/mop,
@@ -75016,6 +75037,21 @@
/obj/structure/largecrate/random/barrel/yellow,
/turf/open/floor/plating/plating_catwalk,
/area/almayer/hull/lower_hull/l_m_s)
+"xoe" = (
+/obj/structure/pipes/standard/simple/hidden/supply{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/machinery/status_display{
+ pixel_y = -29
+ },
+/turf/open/floor/almayer{
+ dir = 8;
+ icon_state = "bluecorner"
+ },
+/area/almayer/squads/delta)
"xoh" = (
/obj/structure/disposalpipe/segment{
dir = 2;
@@ -75340,14 +75376,14 @@
/obj/structure/machinery/door_control{
id = "ARES StairsLower";
name = "ARES Core Lockdown";
- req_one_access_txt = "19;200;90;91;92";
pixel_x = 24;
- pixel_y = 8
+ pixel_y = 8;
+ req_one_access_txt = "19;200;90;91;92"
},
/obj/effect/step_trigger/clone_cleaner,
/turf/open/floor/almayer/no_build{
- icon_state = "silver";
- dir = 4
+ dir = 4;
+ icon_state = "silver"
},
/area/almayer/command/airoom)
"xvX" = (
@@ -76583,9 +76619,9 @@
/obj/structure/machinery/door_control{
id = "ARES StairsUpper";
name = "ARES Core Access";
- req_one_access_txt = "1;200;90;91;92";
+ pixel_x = 24;
pixel_y = 24;
- pixel_x = 24
+ req_one_access_txt = "1;200;90;91;92"
},
/turf/open/floor/almayer/no_build{
icon_state = "ai_floors"
@@ -76719,6 +76755,11 @@
},
/obj/structure/surface/rack,
/obj/effect/spawner/random/toolbox,
+/obj/structure/machinery/computer/working_joe{
+ dir = 4;
+ pixel_y = 14;
+ pixel_x = -17
+ },
/turf/open/floor/almayer{
dir = 10;
icon_state = "orange"
@@ -117827,10 +117868,10 @@ aMC
aLT
avv
bfu
-bgV
-aPM
+rGj
+aQT
aLT
-aQP
+aTv
blB
bnp
aTx
@@ -117871,11 +117912,11 @@ bMy
bJC
cog
chN
-cje
-bFh
+mzg
+cdP
bJC
dpO
-ckR
+ckX
cli
coj
bSJ
@@ -118029,11 +118070,11 @@ aLT
aLT
aLT
aLT
-bfw
-bgV
-aPM
+bfx
+rGj
+aQT
aLT
-aQQ
+aTv
blB
kiU
aQL
@@ -118074,11 +118115,11 @@ bJC
bJC
bJC
chO
-cje
-bFh
+mzg
+cdP
bJC
-cks
-ckR
+dpO
+ckX
clj
bSJ
bSJ
@@ -118233,10 +118274,10 @@ aMB
bdA
aLT
ial
-aMz
-aPM
+rGj
+aPl
aLT
-aQP
+aPn
aRU
bnr
aQL
@@ -118277,11 +118318,11 @@ bMx
cgr
bJC
raK
-cje
-bFh
+mzg
+bgW
bJC
-cks
ckR
+ckX
iyS
bSJ
clJ
@@ -118435,11 +118476,11 @@ bco
bdr
bdA
aLT
-bfx
-bgV
-aPM
+bfw
+rGj
+aQT
aLT
-aQP
+aTv
blB
vJV
aQL
@@ -118480,11 +118521,11 @@ cfo
cgr
bJC
chQ
-cje
-bFh
+mzg
+cdP
bJC
-cks
-ckR
+dpO
+ckX
clk
bSJ
clJ
@@ -118639,10 +118680,10 @@ bdr
bdC
beR
bfy
-bgV
-aPM
+rGj
+aQT
aLT
-aQR
+aTv
blB
bnt
bpG
@@ -118683,11 +118724,11 @@ cfo
cgs
chk
chR
-cje
-bFh
+mzg
+cdP
bJC
-cku
-ckR
+dpO
+ckX
cll
clE
clK
@@ -118841,13 +118882,13 @@ bco
bdr
bdA
aLT
-bfx
+bfD
aPj
-aPN
+aPl
aLT
-aQS
-aRT
-bnu
+aPn
+blB
+sNb
aQL
brr
aRT
@@ -118885,13 +118926,13 @@ cdV
cfo
cgr
bJC
-chN
-bJD
-bFi
+foL
+mzg
+bgW
bJC
-ckv
-bTA
-clm
+ckR
+ckX
+loS
bSJ
clJ
clg
@@ -119045,12 +119086,12 @@ aMC
bdA
aLT
bfx
-bgW
-aPM
+bgY
+aQT
aLT
-aQP
+aTv
blB
-bnu
+nCp
aQL
brr
aUY
@@ -119089,11 +119130,11 @@ bMy
cgr
bJC
chP
-cje
-bFh
+mzg
+cdP
bJC
-cks
-ckR
+dpO
+ckX
cln
bSJ
clJ
@@ -119248,10 +119289,10 @@ aLT
aLT
aLT
hQW
-bgW
-aPM
+bgY
+aQT
aLT
-aQP
+aTv
blB
qhU
aQL
@@ -119292,11 +119333,11 @@ bJC
bJC
bJC
uUo
-cje
+mzg
cdP
bJC
-cjF
-ckR
+dpO
+ckX
sUO
bSJ
bSJ
@@ -119451,11 +119492,11 @@ aMB
bdD
aLT
bfz
+bgY
aPl
-aQT
aLT
-aTv
-aRT
+aPn
+blB
bnu
aQL
brt
@@ -119496,10 +119537,10 @@ cgt
bJC
chS
bQA
-bFh
+bgW
bJC
-cks
-bTA
+ckR
+ckX
meu
bSJ
clL
@@ -119653,13 +119694,13 @@ bcE
bdr
bdD
aLT
-bfx
-bgW
-aPM
+rrq
+bgY
+aQT
aLT
-aQP
+aTv
blB
-bnu
+mtr
aQL
brt
bpC
@@ -119699,11 +119740,11 @@ cgt
bJC
chQ
cjf
-bFh
+cdP
bJC
-cks
-ckR
-clo
+dpO
+ckX
+xoe
bSJ
clL
clg
@@ -119857,10 +119898,10 @@ bdr
bdC
beS
bfy
-bgW
-aPM
+bgY
+aQT
aLT
-aQP
+aTv
blB
bnt
bpH
@@ -119902,10 +119943,10 @@ cgs
chl
chR
cjf
-bFh
+cdP
bJC
-cks
-ckR
+dpO
+ckX
cll
clF
clK
@@ -120060,10 +120101,10 @@ aMC
bdD
aLT
bfC
+bgY
aPl
-aPM
aLT
-aQU
+aPn
aRX
cSQ
aQL
@@ -120104,10 +120145,10 @@ bMy
cgt
bJC
chV
-bQB
-bFh
+cjf
+bgW
bJC
-ckx
+ckR
bTC
mvl
bSJ
@@ -120262,13 +120303,13 @@ aLT
aLT
aLT
aLT
-bfD
-bgW
-aPM
+bfx
+bgY
+aQT
aLT
-aQV
+aTv
blB
-bnu
+sNb
aQL
aQL
aQL
@@ -120308,11 +120349,11 @@ bJC
bJC
chW
rvT
-bFh
+cdP
bJC
-cky
-ckR
-cln
+dpO
+ckX
+hAZ
bSJ
bSJ
bSJ
@@ -120467,12 +120508,12 @@ aLT
bpL
bfE
njd
-aPN
+aQT
aLT
-aQS
+aTv
blB
uvu
-sNb
+aUZ
aQL
bsS
mqK
@@ -120508,15 +120549,15 @@ bJC
cfp
cgu
bJC
-fcB
+bMx
chQ
cjf
-bFh
+cdP
bJC
-cks
-ckR
+dpO
+ckX
clo
-rrq
+bVn
bSJ
clM
clS
@@ -120669,11 +120710,11 @@ bdr
bkg
aMz
bfy
+bgY
aPl
-aPM
aLT
-aQP
-aRT
+aPn
+blB
bnt
aRT
ihY
@@ -120713,11 +120754,11 @@ cfo
chm
bJD
chR
-bQB
-bFi
+cjf
+bgW
bJC
-ckv
-bTA
+ckR
+ckX
cll
bTA
clG
@@ -120872,10 +120913,10 @@ aLT
aLT
brv
nuA
-bgW
-aPM
+bgY
+aQT
aLT
-aQP
+aTv
blB
oiQ
lml
@@ -120917,10 +120958,10 @@ bJC
cdf
jxx
cjf
-bFh
+cdP
bJC
-cks
-ckR
+dpO
+ckX
rXj
gfo
bSJ
@@ -121075,10 +121116,10 @@ bdr
bpK
aMz
bfy
-bgW
-aPM
+bgY
+aQT
aLT
-aQP
+aTv
blB
bnt
aRT
@@ -121120,10 +121161,10 @@ chn
bJD
chR
cjf
-bFh
+cdP
bJC
-cks
-ckR
+dpO
+ckX
cll
bTA
clH
@@ -121278,11 +121319,11 @@ bdv
aLT
bry
bfu
-aPn
+bgY
jVr
aLT
kXa
-aRZ
+blB
chL
lAl
aQL
@@ -121322,11 +121363,11 @@ cgv
bJC
wqc
chN
-bQC
+cjf
lok
bJC
ihM
-bTE
+ckX
clm
hXY
bSJ
diff --git a/maps/map_files/generic/Admin_level.dmm b/maps/map_files/generic/Admin_level.dmm
index 727ae18b926a..8dd8e17e6507 100644
--- a/maps/map_files/generic/Admin_level.dmm
+++ b/maps/map_files/generic/Admin_level.dmm
@@ -1040,7 +1040,7 @@
},
/area/adminlevel/ert_station)
"zk" = (
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
density = 0;
pixel_y = 10
},
diff --git a/maps/templates/Chinook.dmm b/maps/templates/Chinook.dmm
index 0d9e64628b24..f2acbe320aeb 100644
--- a/maps/templates/Chinook.dmm
+++ b/maps/templates/Chinook.dmm
@@ -1875,7 +1875,7 @@
/area/adminlevel/chinook/engineering)
"gv" = (
/obj/structure/surface/table/reinforced/almayer_B,
-/obj/structure/machinery/chem_dispenser/beer,
+/obj/structure/machinery/chem_dispenser/soda/beer,
/turf/open/floor/almayer{
icon_state = "plate"
},
diff --git a/maps/templates/clf_ert_station.dmm b/maps/templates/clf_ert_station.dmm
index ec2a81bf6218..cf8bc8d46bf6 100644
--- a/maps/templates/clf_ert_station.dmm
+++ b/maps/templates/clf_ert_station.dmm
@@ -1828,7 +1828,7 @@
/turf/open/gm/river,
/area/adminlevel/ert_station/clf_station)
"RR" = (
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
density = 0;
pixel_y = 10
},
diff --git a/maps/templates/weyland_ert_station.dmm b/maps/templates/weyland_ert_station.dmm
index 171bd8d9ac6e..854299a4efda 100644
--- a/maps/templates/weyland_ert_station.dmm
+++ b/maps/templates/weyland_ert_station.dmm
@@ -2509,7 +2509,7 @@
/area/adminlevel/ert_station/weyland_station)
"EW" = (
/obj/structure/surface/table/reinforced,
-/obj/structure/machinery/chem_dispenser/beer{
+/obj/structure/machinery/chem_dispenser/soda/beer{
density = 0;
pixel_y = 23
},
diff --git a/sound/effects/alien_dragsound_large.ogg b/sound/effects/alien_dragsound_large.ogg
new file mode 100644
index 000000000000..bacd14b0eb07
Binary files /dev/null and b/sound/effects/alien_dragsound_large.ogg differ
diff --git a/sound/effects/burrowing_b.ogg b/sound/effects/burrowing_b.ogg
new file mode 100644
index 000000000000..cc44a8e19282
Binary files /dev/null and b/sound/effects/burrowing_b.ogg differ
diff --git a/sound/effects/burrowoff.ogg b/sound/effects/burrowoff.ogg
new file mode 100644
index 000000000000..66f10b253612
Binary files /dev/null and b/sound/effects/burrowoff.ogg differ
diff --git a/tgui/packages/tgui-panel/chat/constants.js b/tgui/packages/tgui-panel/chat/constants.js
index a73003e13267..ac9346d8d5f0 100644
--- a/tgui/packages/tgui-panel/chat/constants.js
+++ b/tgui/packages/tgui-panel/chat/constants.js
@@ -125,14 +125,8 @@ export const MESSAGE_TYPES = [
type: MESSAGE_TYPE_ADMINCHAT,
name: 'Admin Chat',
description: 'ASAY messages',
- selector: '.admin_channel, .adminsay, .headminsay',
- admin: true,
- },
- {
- type: MESSAGE_TYPE_MODCHAT,
- name: 'Mod Chat',
- description: 'MSAY messages',
- selector: '.mod_channel, .mod, .adminmod, .staffsay',
+ selector:
+ '.admin_channel, .adminsay, .headminsay, .mod_channel, .mod, .adminmod, .staffsay',
admin: true,
},
{
diff --git a/tgui/packages/tgui-say/helpers/index.tsx b/tgui/packages/tgui-say/helpers/index.tsx
index 44225cb876d3..c359c79a940f 100644
--- a/tgui/packages/tgui-say/helpers/index.tsx
+++ b/tgui/packages/tgui-say/helpers/index.tsx
@@ -166,13 +166,10 @@ export const getAvailableChannels = (
return availableChannels;
}
- if (roles.includes('Mod')) {
- availableChannels.push('MSAY');
- }
if (roles.includes('Mentor')) {
availableChannels.push('Mentor');
}
- if (roles.includes('Admin')) {
+ if (roles.includes('Mod')) {
availableChannels.push('ASAY');
}
diff --git a/tgui/packages/tgui-say/styles/colors.scss b/tgui/packages/tgui-say/styles/colors.scss
index 509b3e17f5ef..e0abb717edf3 100644
--- a/tgui/packages/tgui-say/styles/colors.scss
+++ b/tgui/packages/tgui-say/styles/colors.scss
@@ -14,7 +14,6 @@ $comms: #b4b4b4;
$me: #5975da;
$ooc: #1c52f5;
$looc: #e362b4;
-$msay: #74471b;
$mentor: #b5850d;
$asay: #9611d4;
@@ -49,7 +48,6 @@ $_channel_map: (
'ooc': $ooc,
'looc': $looc,
'whisper': $say,
- 'msay': $msay,
'mentor': $mentor,
'asay': $asay,
'department': $comms,
diff --git a/tgui/packages/tgui/interfaces/JoeEmotes.tsx b/tgui/packages/tgui/interfaces/JoeEmotes.tsx
new file mode 100644
index 000000000000..acd37de34978
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/JoeEmotes.tsx
@@ -0,0 +1,110 @@
+import { useBackend, useLocalState } from '../backend';
+import { Box, Button, Divider, Section, Stack, Tabs } from '../components';
+import { Window } from '../layouts';
+import { BooleanLike } from '../../common/react';
+
+type Emote = {
+ id: string;
+ text: string;
+ category: string;
+ path: string;
+};
+
+type BackendContext = {
+ categories: string[];
+ emotes: Emote[];
+ on_cooldown: BooleanLike;
+};
+
+const EmoteTab = (props, context) => {
+ const { data, act } = useBackend(context);
+ const { categories, emotes, on_cooldown } = data;
+ const [categoryIndex, setCategoryIndex] = useLocalState(
+ context,
+ 'category_index',
+ 'Farewell'
+ );
+ const mapped_emote = emotes.filter(
+ (emote) => emote && emote.category === categoryIndex
+ );
+ return (
+
+
+
+
+ {categories.map((item, key) => (
+ {
+ setCategoryIndex(item);
+ }}>
+ {item}
+
+ ))}
+
+
+
+
+
+
+
+ {mapped_emote.map((item) => (
+
+
+ {' '}
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+ );
+};
+
+export const JoeEmotes = (props, context) => {
+ return (
+
+
+
+
+
+ );
+};