diff --git a/code/__DEFINES/colours.dm b/code/__DEFINES/colours.dm
index e9a03a6382da..93d1e082c66a 100644
--- a/code/__DEFINES/colours.dm
+++ b/code/__DEFINES/colours.dm
@@ -150,3 +150,8 @@
#define COLOR_G_ICE "#C7EDDE" //faded cyan
#define COLOR_G_DES "#FF7C1C" //bright orange
#define COLOR_G_JUNG "#64AA6E" //faded green
+
+/// Gun muzzle colors
+#define COLOR_LASER_RED "#FF8D8D"
+#define COLOR_MUZZLE_BLUE "#2CB2E8"
+
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index cf6d6c64d9a9..2ab36d51d297 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -105,6 +105,7 @@
#define INTERRUPT_ALL_OUT_OF_RANGE (INTERRUPT_ALL & (~INTERRUPT_DIFF_TURF)|INTERRUPT_OUT_OF_RANGE)
#define INTERRUPT_MOVED (INTERRUPT_DIFF_LOC|INTERRUPT_DIFF_TURF|INTERRUPT_RESIST)
#define INTERRUPT_NO_NEEDHAND (INTERRUPT_ALL & (~INTERRUPT_NEEDHAND))
+#define INTERRUPT_NO_FLOORED (INTERRUPT_ALL & (~INTERRUPT_KNOCKED_DOWN))
#define INTERRUPT_INCAPACITATED (INTERRUPT_UNCONSCIOUS|INTERRUPT_KNOCKED_DOWN|INTERRUPT_STUNNED|INTERRUPT_RESIST)
#define INTERRUPT_CLICK (INTERRUPT_LCLICK|INTERRUPT_RCLICK|INTERRUPT_SHIFTCLICK|INTERRUPT_ALTCLICK|INTERRUPT_CTRLCLICK|INTERRUPT_MIDDLECLICK|INTERRUPT_RESIST)
diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm
index 17464b44dae8..4766b3dfe661 100644
--- a/code/__DEFINES/tgs.dm
+++ b/code/__DEFINES/tgs.dm
@@ -1,18 +1,19 @@
// tgstation-server DMAPI
+// The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in IETF RFC 2119.
-#define TGS_DMAPI_VERSION "7.1.3"
+#define TGS_DMAPI_VERSION "7.2.1"
// All functions and datums outside this document are subject to change with any version and should not be relied on.
// CONFIGURATION
-/// Create this define if you want to do TGS configuration outside of this file.
+/// Consumers SHOULD create this define if you want to do TGS configuration outside of this file.
#ifndef TGS_EXTERNAL_CONFIGURATION
-// Comment this out once you've filled in the below.
+// Consumers MUST comment this out once you've filled in the below and are not using [TGS_EXTERNAL_CONFIGURATION].
#error TGS API unconfigured
-// Uncomment this if you wish to allow the game to interact with TGS 3..
+// Consumers MUST uncomment this if you wish to allow the game to interact with TGS version 3.
// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()().
//#define TGS_V3_API
@@ -52,7 +53,7 @@
#ifndef TGS_FILE2TEXT_NATIVE
#ifdef file2text
-#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You can fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses
+#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You SHOULD fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses
#endif
#define TGS_FILE2TEXT_NATIVE file2text
#endif
@@ -152,16 +153,17 @@
//REQUIRED HOOKS
/**
- * Call this somewhere in [/world/proc/New] that is always run. This function may sleep!
+ * Consumers MUST call this somewhere in [/world/proc/New] that is always run. This function may sleep!
*
* * event_handler - Optional user defined [/datum/tgs_event_handler].
* * minimum_required_security_level: The minimum required security level to run the game in which the DMAPI is integrated. Can be one of [TGS_SECURITY_ULTRASAFE], [TGS_SECURITY_SAFE], or [TGS_SECURITY_TRUSTED].
+ * * http_handler - Optional user defined [/datum/tgs_http_handler].
*/
-/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
+/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler)
return
/**
- * Call this when your initializations are complete and your game is ready to play before any player interactions happen.
+ * Consumers MUST call this when world initializations are complete and the game is ready to play before any player interactions happen.
*
* This may use [/world/var/sleep_offline] to make this happen so ensure no changes are made to it while this call is running.
* Afterwards, consider explicitly setting it to what you want to avoid this BYOND bug: http://www.byond.com/forum/post/2575184
@@ -170,12 +172,10 @@
/world/proc/TgsInitializationComplete()
return
-/// Put this at the start of [/world/proc/Topic].
+/// Consumers MUST run this macro at the start of [/world/proc/Topic].
#define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return
-/**
- * Call this as late as possible in [world/proc/Reboot] (BEFORE ..()).
- */
+/// Consumers MUST call this as late as possible in [world/proc/Reboot] (BEFORE ..()).
/world/proc/TgsReboot()
return
@@ -269,7 +269,7 @@
/// The [/datum/tgs_chat_channel] the user was from.
var/datum/tgs_chat_channel/channel
-/// User definable handler for TGS events.
+/// User definable handler for TGS events This abstract version SHOULD be overridden to be used.
/datum/tgs_event_handler
/// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events.
var/receive_health_checks = FALSE
@@ -283,7 +283,41 @@
set waitfor = FALSE
return
-/// User definable chat command.
+/// User definable handler for HTTP calls. This abstract version MUST be overridden to be used.
+/datum/tgs_http_handler
+
+/**
+ * User definable callback for executing HTTP GET requests.
+ * MUST perform BYOND sleeps while the request is in flight.
+ * MUST return a [/datum/tgs_http_result].
+ * SHOULD log its own errors
+ *
+ * url - The full URL to execute the GET request for including query parameters.
+ */
+/datum/tgs_http_handler/proc/PerformGet(url)
+ CRASH("[type]/PerformGet not implemented!")
+
+/// Result of a [/datum/tgs_http_handler] call. MUST NOT be overridden.
+/datum/tgs_http_result
+ /// HTTP response as text
+ var/response_text
+ /// Boolean request success flag. Set for any 2XX response code.
+ var/success
+
+/**
+ * Create a [/datum/tgs_http_result].
+ *
+ * * response_text - HTTP response as text. Must be provided in New().
+ * * success - Boolean request success flag. Set for any 2XX response code. Must be provided in New().
+ */
+/datum/tgs_http_result/New(response_text, success)
+ if(response_text && !istext(response_text))
+ CRASH("response_text was not text!")
+
+ src.response_text = response_text
+ src.success = success
+
+/// User definable chat command. This abstract version MUST be overridden to be used.
/datum/tgs_chat_command
/// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`.
var/name = ""
@@ -296,21 +330,27 @@
/**
* Process command activation. Should return a [/datum/tgs_message_content] to respond to the issuer with.
+ * MUST be implemented
*
- * sender - The [/datum/tgs_chat_user] who issued the command.
- * params - The trimmed string following the command `/datum/tgs_chat_command/var/name].
+ * * sender - The [/datum/tgs_chat_user] who issued the command.
+ * * params - The trimmed string following the command `/datum/tgs_chat_command/var/name].
*/
/datum/tgs_chat_command/proc/Run(datum/tgs_chat_user/sender, params)
CRASH("[type] has no implementation for Run()")
-/// User definable chat message.
+/// User definable chat message. MUST NOT be overridden.
/datum/tgs_message_content
- /// The tring content of the message. Must be provided in New().
+ /// The string content of the message. Must be provided in New().
var/text
/// The [/datum/tgs_chat_embed] to embed in the message. Not supported on all chat providers.
var/datum/tgs_chat_embed/structure/embed
+/**
+ * Create a [/datum/tgs_message_content].
+ *
+ * * text - The string content of the message.
+ */
/datum/tgs_message_content/New(text)
..()
if(!istext(text))
@@ -319,7 +359,7 @@
src.text = text
-/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/channel#embed-object-embed-structure for details.
+/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/message#embed-object for details.
/datum/tgs_chat_embed/structure
var/title
var/description
@@ -331,13 +371,13 @@
/// Colour must be #AARRGGBB or #RRGGBB hex string.
var/colour
- /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details.
+ /// See https://discord.com/developers/docs/resources/message#embed-object-embed-image-structure for details.
var/datum/tgs_chat_embed/media/image
- /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure for details.
+ /// See https://discord.com/developers/docs/resources/message#embed-object-embed-thumbnail-structure for details.
var/datum/tgs_chat_embed/media/thumbnail
- /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details.
+ /// See https://discord.com/developers/docs/resources/message#embed-object-embed-video-structure for details.
var/datum/tgs_chat_embed/media/video
var/datum/tgs_chat_embed/footer/footer
@@ -346,7 +386,7 @@
var/list/datum/tgs_chat_embed/field/fields
-/// Common datum for similar discord embed medias.
+/// Common datum for similar Discord embed medias.
/datum/tgs_chat_embed/media
/// Must be set in New().
var/url
@@ -354,6 +394,7 @@
var/height
var/proxy_url
+/// Create a [/datum/tgs_chat_embed].
/datum/tgs_chat_embed/media/New(url)
..()
if(!istext(url))
@@ -361,13 +402,14 @@
src.url = url
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure for details.
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-footer-structure for details.
/datum/tgs_chat_embed/footer
/// Must be set in New().
var/text
var/icon_url
var/proxy_icon_url
+/// Create a [/datum/tgs_chat_embed/footer].
/datum/tgs_chat_embed/footer/New(text)
..()
if(!istext(text))
@@ -375,16 +417,17 @@
src.text = text
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure for details.
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-provider-structure for details.
/datum/tgs_chat_embed/provider
var/name
var/url
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure for details. Must have name set in New().
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-author-structure for details. Must have name set in New().
/datum/tgs_chat_embed/provider/author
var/icon_url
var/proxy_icon_url
+/// Create a [/datum/tgs_chat_embed/footer].
/datum/tgs_chat_embed/provider/author/New(name)
..()
if(!istext(name))
@@ -392,12 +435,15 @@
src.name = name
-/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure for details. Must have name and value set in New().
+/// See https://discord.com/developers/docs/resources/message#embed-object-embed-field-structure for details.
/datum/tgs_chat_embed/field
+ /// Must be set in New().
var/name
+ /// Must be set in New().
var/value
var/is_inline
+/// Create a [/datum/tgs_chat_embed/field].
/datum/tgs_chat_embed/field/New(name, value)
..()
if(!istext(name))
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index e6b9c4c4b9ee..4d5fac9ba17b 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -232,9 +232,15 @@
/// If the mob is able to use the vulture rifle or spotting scope
#define TRAIT_VULTURE_USER "t_vulture_user"
/// If the mob is currently loading a tutorial
-#define TRAIT_IN_TUTORIAL "t_IN_TUTORIAL"
+#define TRAIT_IN_TUTORIAL "t_in_tutorial"
/// If the mob is cloaked in any form
#define TRAIT_CLOAKED "t_cloaked"
+/// If the mob claimed a specialist set from a vendor
+#define TRAIT_SPEC_VENDOR "t_spec_vendor"
+/// If the mob claimed a specialist set from a kit
+#define TRAIT_SPEC_KIT "t_spec_kit"
+/// What spec set the mob has claimed, if any
+#define TRAIT_SPEC(spec_type) "t_spec_[spec_type]"
/// If the mob won't drop items held in face slot when downed
#define TRAIT_IRON_TEETH "t_iron_teeth"
@@ -315,6 +321,8 @@ GLOBAL_LIST_INIT(mob_traits, list(
TRAIT_ABILITY_BURROWED,
TRAIT_VULTURE_USER,
TRAIT_IN_TUTORIAL,
+ TRAIT_SPEC_KIT,
+ TRAIT_SPEC_VENDOR,
))
/*
@@ -354,9 +362,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_CANNOT_EAT" = TRAIT_CANNOT_EAT,
"TRAIT_VULTURE_USER" = TRAIT_VULTURE_USER,
"TRAIT_CLOAKED" = TRAIT_CLOAKED,
+ "TRAIT_SPEC_KIT" = TRAIT_SPEC_KIT,
+ "TRAIT_SPEC_VENDOR" = TRAIT_SPEC_VENDOR,
),
-// /mob/living/carbon/human = list(
-// ),
/mob/living/carbon/xenomorph = list(
"TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER,
"TRAIT_ABILITY_OVIPOSITOR" = TRAIT_ABILITY_OVIPOSITOR,
diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm
index d2165fecc9b1..dadf5d597255 100644
--- a/code/_globalvars/global_lists.dm
+++ b/code/_globalvars/global_lists.dm
@@ -544,26 +544,8 @@ GLOBAL_REFERENCE_LIST_INDEXED(all_skills, /datum/skill, skill_name)
// Timelock
GLOBAL_LIST_EMPTY(timelocks)
-
-//the global list of specialist kits that haven't been claimed yet.
-GLOBAL_LIST_INIT(available_specialist_sets, list(
- "Scout Set",
- "Sniper Set",
- "Anti-materiel Sniper Set",
- "Demolitionist Set",
- "Heavy Grenadier Set",
- "Pyro Set"
- ))
-
-//Similar thing, but used in /obj/item/spec_kit
-GLOBAL_LIST_INIT(available_specialist_kit_boxes, list(
- "Pyro" = 2,
- "Grenadier" = 2,
- "Sniper" = 2,
- "Scout" = 2,
- "Demo" = 2,
- "Anti-materiel Sniper" = 2,
- ))
+GLOBAL_LIST_EMPTY_TYPED(specialist_set_name_dict, /datum/specialist_set)
+GLOBAL_LIST_INIT_TYPED(specialist_set_datums, /datum/specialist_set, setup_specialist_sets())
/proc/init_global_referenced_datums()
init_keybindings()
diff --git a/code/datums/custom_hud.dm b/code/datums/custom_hud.dm
index c9894398477a..9a009532ef35 100644
--- a/code/datums/custom_hud.dm
+++ b/code/datums/custom_hud.dm
@@ -115,10 +115,11 @@
/datum/custom_hud/dark
ui_style_icon = 'icons/mob/hud/human_dark.dmi'
- UI_OXYGEN_LOC = "EAST-2:16,14:15"
- UI_NUTRITION_LOC = "EAST-2:33,14:15"
- UI_TEMP_LOC = "EAST-1:26,15:-7"
- UI_HEALTH_LOC = "EAST-1:27,15:-8"
+ UI_FRAME_LOC = "EAST-3:0,NORTH-1:15"
+ UI_OXYGEN_LOC = "EAST-2:16,NORTH-1:15"
+ UI_NUTRITION_LOC = "EAST-2:33,NORTH-1:15"
+ UI_TEMP_LOC = "EAST-1:26,NORTH-0:-7"
+ UI_HEALTH_LOC = "EAST-1:27,NORTH-0:-8"
UI_SL_LOCATOR_LOC = "EAST-1:27,12:22"
/datum/custom_hud/dark/get_status_loc(placement)
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 640866db8ca2..0323d2a02733 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -318,3 +318,7 @@
if(user.client.check_whitelist_status(flags_whitelist))
return TRUE
+
+/// Called when the job owner enters deep cryogenic storage
+/datum/job/proc/on_cryo(mob/living/carbon/human/cryoing)
+ return
diff --git a/code/game/jobs/job/marine/squad/specialist.dm b/code/game/jobs/job/marine/squad/specialist.dm
index e69241cdc70b..38f7a38cbedc 100644
--- a/code/game/jobs/job/marine/squad/specialist.dm
+++ b/code/game/jobs/job/marine/squad/specialist.dm
@@ -23,6 +23,11 @@
total_positions_so_far = positions
return positions
+/datum/job/marine/specialist/on_cryo(mob/living/carbon/human/cryoing)
+ var/specialist_set = get_specialist_set(cryoing)
+ if(isnull(specialist_set))
+ return
+ GLOB.specialist_set_datums[specialist_set].refund_set(cryoing)
/datum/job/marine/specialist/whiskey
title = JOB_WO_SQUAD_SPECIALIST
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
deleted file mode 100644
index 44bd9907c15d..000000000000
--- a/code/game/machinery/Beacon.dm
+++ /dev/null
@@ -1,54 +0,0 @@
-/obj/structure/machinery/bluespace_beacon
-
- icon = 'icons/obj/objects.dmi'
- icon_state = "floor_beaconf"
- name = "Bluespace Gigabeacon"
- desc = "A device that draws power from bluespace and creates a permanent tracking beacon."
- level = 1 // underfloor
- layer = UNDERFLOOR_OBJ_LAYER
- anchored = TRUE
- use_power = USE_POWER_IDLE
- idle_power_usage = 0
- var/obj/item/device/radio/beacon/Beacon
-
-/obj/structure/machinery/bluespace_beacon/Initialize(mapload, ...)
- . = ..()
- var/turf/T = loc
- Beacon = new /obj/item/device/radio/beacon
- Beacon.invisibility = INVISIBILITY_MAXIMUM
- Beacon.forceMove(T)
-
- hide(T.intact_tile)
-
-/obj/structure/machinery/bluespace_beacon/Destroy()
- QDEL_NULL(Beacon)
- return ..()
-
-/obj/structure/machinery/bluespace_beacon/hide(intact)
- // update the invisibility and icon
- invisibility = intact ? 101 : 0
- updateicon()
-
- // update the icon_state
-/obj/structure/machinery/bluespace_beacon/proc/updateicon()
- var/state="floor_beacon"
-
- if(invisibility)
- icon_state = "[state]f"
-
- else
- icon_state = "[state]"
-
-/obj/structure/machinery/bluespace_beacon/process()
- if(!Beacon)
- var/turf/T = loc
- Beacon = new /obj/item/device/radio/beacon
- Beacon.invisibility = INVISIBILITY_MAXIMUM
- Beacon.forceMove(T)
- if(Beacon)
- if(Beacon.loc != loc)
- Beacon.forceMove(loc)
-
- updateicon()
-
-
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 658e2aa150f3..45a57eb96392 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -324,28 +324,10 @@ GLOBAL_LIST_INIT(frozen_items, list(SQUAD_MARINE_1 = list(), SQUAD_MARINE_2 = li
var/datum/job/job = GET_MAPPED_ROLE(occupant.job)
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
+ job.on_cryo(H)
if(H.assigned_squad)
var/datum/squad/S = H.assigned_squad
S.forget_marine_in_squad(H)
- if(istype(job, /datum/job/marine/specialist))
- //we make the set this specialist took if any available again
- if(H.skills)
- var/set_name
- switch(H.skills.get_skill_level(SKILL_SPEC_WEAPONS))
- if(SKILL_SPEC_ROCKET)
- set_name = "Demolitionist Set"
- if(SKILL_SPEC_GRENADIER)
- set_name = "Heavy Grenadier Set"
- if(SKILL_SPEC_PYRO)
- set_name = "Pyro Set"
- if(SKILL_SPEC_SCOUT)
- set_name = "Scout Set"
- if(SKILL_SPEC_SNIPER)
- set_name = "Sniper Set"
- GLOB.available_specialist_sets += "Anti-materiel Sniper Set"
-
- if(set_name && !GLOB.available_specialist_sets.Find(set_name))
- GLOB.available_specialist_sets += set_name
//Cryoing someone out removes someone from the Marines, blocking further larva spawns until accounted for
SSticker.mode.latejoin_update(job, -1)
diff --git a/code/game/machinery/vending/cm_vending.dm b/code/game/machinery/vending/cm_vending.dm
index 2d15d4c37da8..5746a29aa1ae 100644
--- a/code/game/machinery/vending/cm_vending.dm
+++ b/code/game/machinery/vending/cm_vending.dm
@@ -565,48 +565,28 @@ GLOBAL_LIST_EMPTY(vending_products)
to_chat(user, SPAN_WARNING("Only specialists can take specialist sets."))
vend_fail()
return FALSE
+
else if(!user.skills || user.skills.get_skill_level(SKILL_SPEC_WEAPONS) != SKILL_SPEC_TRAINED)
to_chat(user, SPAN_WARNING("You already have a specialization."))
vend_fail()
return FALSE
+
var/p_name = itemspec[1]
- if(!GLOB.available_specialist_sets.Find(p_name))
+ if(!(p_name in GLOB.specialist_set_name_dict))
+ return
+
+ if(GLOB.specialist_set_name_dict[p_name].get_available_vendor_num() <= 0)
to_chat(user, SPAN_WARNING("That set is already taken."))
vend_fail()
return FALSE
+
var/obj/item/card/id/card = human_user.get_idcard()
- if(!card?.check_biometrics(user))
+ if(!istype(card) || !card.check_biometrics(user))
to_chat(user, SPAN_WARNING("You must be wearing your [SPAN_INFO("dog tags")] to select a specialization!"))
return FALSE
- var/specialist_assignment
- switch(p_name)
- if("Scout Set")
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_SCOUT)
- specialist_assignment = "Scout"
- if("Sniper Set")
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_SNIPER)
- specialist_assignment = "Sniper"
- GLOB.available_specialist_sets -= "Anti-materiel Sniper Set"
- if("Anti-materiel Sniper Set")
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_SNIPER)
- specialist_assignment = "Heavy Sniper"
- GLOB.available_specialist_sets -= "Sniper Set"
- if("Demolitionist Set")
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_ROCKET)
- specialist_assignment = "Demo"
- if("Heavy Grenadier Set")
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_GRENADIER)
- specialist_assignment = "Grenadier"
- if("Pyro Set")
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_PYRO)
- specialist_assignment = "Pyro"
- else
- to_chat(user, SPAN_WARNING("Something bad occurred with [src], tell a Dev."))
- vend_fail()
- return FALSE
- card.set_assignment((human_user.assigned_squad ? (human_user.assigned_squad.name + " ") : "") + JOB_SQUAD_SPECIALIST + " ([specialist_assignment])")
- GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), card.assignment)
- GLOB.available_specialist_sets -= p_name
+
+ GLOB.specialist_set_name_dict[p_name].redeem_set(human_user)
+
else if(vendor_role.Find(JOB_SYNTH))
if(user.job != JOB_SYNTH)
to_chat(user, SPAN_WARNING("Only USCM Synthetics may vend experimental tool tokens."))
diff --git a/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm b/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm
new file mode 100644
index 000000000000..69261115ecaa
--- /dev/null
+++ b/code/game/machinery/vending/vendor_types/crew/corporate_liaison.dm
@@ -0,0 +1,84 @@
+//------------ CL CLOTHING VENDOR---------------
+
+GLOBAL_LIST_INIT(cm_vending_clothing_dress_corporate_liaison, list(
+ list("SUITS AND UNDERSHIRTS", 0, null, null, null),
+ list("Black Suit Pants", 0, /obj/item/clothing/under/liaison_suit/black, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_RECOMMENDED),
+ list("Blue Suit Pants", 0, /obj/item/clothing/under/liaison_suit/blue, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Brown Suit Pants", 0, /obj/item/clothing/under/liaison_suit/brown, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("White Suit Pants", 0, /obj/item/clothing/under/liaison_suit/corporate_formal, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Liaison's Tan Suit", 0, /obj/item/clothing/under/liaison_suit, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Liaison's Charcoal Suit", 0, /obj/item/clothing/under/liaison_suit/charcoal, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Liaison's White Suit", 0, /obj/item/clothing/under/liaison_suit/formal, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Liaison's Blue Blazer", 0, /obj/item/clothing/under/liaison_suit/blazer, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Liaison's Suspenders", 0, /obj/item/clothing/under/liaison_suit/suspenders, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Liaison's Skirt", 0, /obj/item/clothing/under/blackskirt, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Trainee's Uniform", 0, /obj/item/clothing/under/suit_jacket/trainee, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Country Club Outfit", 0, /obj/item/clothing/under/liaison_suit/ivy, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Orange Outfit", 0, /obj/item/clothing/under/liaison_suit/orange, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Corporate Casual", 0, /obj/item/clothing/under/liaison_suit/field, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Grey Workwear", 0, /obj/item/clothing/under/colonist/workwear, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Khaki Workwear", 0, /obj/item/clothing/under/colonist/workwear/khaki, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Pink Workwear", 0, /obj/item/clothing/under/colonist/workwear/pink, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+ list("Green Workwear", 0, /obj/item/clothing/under/colonist/workwear/green, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR),
+
+ list("SUIT", 0, null, null, null),
+ list("Black Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/black, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_RECOMMENDED),
+ list("Khaki Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Brown Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/brown, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Blue Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/blue, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Formal Suit Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/corporate/formal, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Grey Bomber Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/bomber/grey, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Red Bomber Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/bomber/red, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Khaki Bomber Jacket", 0, /obj/item/clothing/suit/storage/jacket/marine/bomber, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Brown Bomber Jacket", 0, /obj/item/clothing/suit/storage/bomber, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Black Bomber Jacket", 0, /obj/item/clothing/suit/storage/bomber/alt, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Liaison's Winter Coat", 0, /obj/item/clothing/suit/storage/snow_suit/liaison, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Labcoat", 0, /obj/item/clothing/suit/storage/labcoat, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Grey Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/vest/grey, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Brown Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/vest, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+ list("Tan Vest", 0, /obj/item/clothing/suit/storage/jacket/marine/vest/tan, MARINE_CAN_BUY_ARMOR, VENDOR_ITEM_REGULAR),
+
+ list("TIES", 0, null, null, null),
+ list("Black Tie", 0, /obj/item/clothing/accessory/black, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_RECOMMENDED),
+ list("Red Tie", 0, /obj/item/clothing/accessory/red, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Purple Tie", 0, /obj/item/clothing/accessory/purple, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Blue Tie", 0, /obj/item/clothing/accessory/blue, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Green Tie", 0, /obj/item/clothing/accessory/green, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Gold Tie", 0, /obj/item/clothing/accessory/gold, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+ list("Special Tie", 0, /obj/item/clothing/accessory/horrible, MARINE_CAN_BUY_ACCESSORY, VENDOR_ITEM_REGULAR),
+
+ list("GLASSES", 0, null, null, null),
+ list("BiMex Shades", 0, /obj/item/clothing/glasses/sunglasses/big, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_RECOMMENDED),
+ list("Aviator Shades", 0, /obj/item/clothing/glasses/sunglasses/aviator, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR),
+ list("Sunglasses", 0, /obj/item/clothing/glasses/sunglasses, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR),
+ list("Prescription Sunglasses", 0, /obj/item/clothing/glasses/sunglasses/prescription, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR),
+ list("Prescription Glasses", 0, /obj/item/clothing/glasses/regular/hipster, MARINE_CAN_BUY_GLASSES, VENDOR_ITEM_REGULAR),
+
+ list("GLOVES", 0, null, null, null),
+ list("Black Gloves", 0, /obj/item/clothing/gloves/black, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_RECOMMENDED),
+ list("Dress Gloves", 0, /obj/item/clothing/gloves/marine/dress, MARINE_CAN_BUY_GLOVES, VENDOR_ITEM_REGULAR),
+
+ list("SHOES", 0, null, null, null),
+ list("Laceup Shoes, Black", 0, /obj/item/clothing/shoes/laceup, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_RECOMMENDED),
+ list("Laceup Shoes, Brown", 0, /obj/item/clothing/shoes/laceup/brown, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR),
+ list("Sneakers, Black", 0, /obj/item/clothing/shoes/black, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR),
+ list("Corporate Boots", 0, /obj/item/clothing/shoes/marine/corporate, MARINE_CAN_BUY_SHOES, VENDOR_ITEM_REGULAR),
+
+ list("HATS", 0, null, null, null),
+ list("Black Beret", 0, /obj/item/clothing/head/beret/cm/black/civilian, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("White Beret", 0, /obj/item/clothing/head/beret/cm/white/civilian, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+ list("Fedora", 0, /obj/item/clothing/head/fedora, MARINE_CAN_BUY_HELMET, VENDOR_ITEM_REGULAR),
+
+))
+
+/obj/structure/machinery/cm_vending/clothing/dress/corporate_liaison
+ name = "\improper Corporate Liaison's Personal Wardrobe"
+ desc = "A wardrobe containing all the clothes an executive would ever need."
+ icon_state = "wardrobe_vendor"
+ vendor_theme = VENDOR_THEME_USCM
+ show_points = FALSE
+ req_access = list()
+ vendor_role = list(JOB_CORPORATE_LIAISON, JOB_SURVIVOR, JOB_TRAINEE, JOB_JUNIOR_EXECUTIVE, JOB_EXECUTIVE, JOB_SENIOR_EXECUTIVE, JOB_EXECUTIVE_SPECIALIST, JOB_EXECUTIVE_SUPERVISOR, JOB_ASSISTANT_MANAGER, JOB_DIVISION_MANAGER, JOB_CHIEF_EXECUTIVE, JOB_DIRECTOR, JOB_WY_GOON_RESEARCHER)
+
+/obj/structure/machinery/cm_vending/clothing/dress/corporate_liaison/get_listed_products(mob/user)
+ return GLOB.cm_vending_clothing_dress_corporate_liaison
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
index a21207a6645c..527bb89b6af2 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_specialist.dm
@@ -7,7 +7,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_spec, list(
list("Pyro Set", 0, /obj/item/storage/box/spec/pyro, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("Scout Set", 0, /obj/item/storage/box/spec/scout, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_REGULAR),
list("Sniper Set", 0, /obj/item/storage/box/spec/sniper, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED),
- list("Anti-materiel Sniper Set", 0, /obj/item/storage/box/spec/sniper/anti_materiel, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED),
+ list("Anti-Materiel Sniper Set", 0, /obj/item/storage/box/spec/sniper/anti_materiel, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_RECOMMENDED),
list("EXTRA SCOUT AMMUNITION", 0, null, null, null),
list("A19 High Velocity Impact Magazine (10x24mm)", 40, /obj/item/ammo_magazine/rifle/m4ra/custom/impact, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/objects/items/devices/cictablet.dm b/code/game/objects/items/devices/cictablet.dm
index c53301295fe3..8c07c71a2112 100644
--- a/code/game/objects/items/devices/cictablet.dm
+++ b/code/game/objects/items/devices/cictablet.dm
@@ -177,3 +177,15 @@
announcement_faction = FACTION_PMC
minimap_type = MINIMAP_FLAG_PMC
+
+/obj/item/device/cotablet/upp
+
+ desc = "A special device used by field UPP commanders."
+
+ tablet_name = "UPP Field Commander's Tablet"
+
+ announcement_title = UPP_COMMAND_ANNOUNCE
+ announcement_faction = FACTION_UPP
+ req_access = list(ACCESS_UPP_LEADERSHIP)
+
+ minimap_type = MINIMAP_FLAG_UPP
diff --git a/code/game/objects/items/stacks/flags.dm b/code/game/objects/items/stacks/flags.dm
index 14833812b06c..4dc2e6dbebf3 100644
--- a/code/game/objects/items/stacks/flags.dm
+++ b/code/game/objects/items/stacks/flags.dm
@@ -281,3 +281,23 @@
desc = "The flag of the United Americas. Semper fi."
icon_state = "flag_ua_planted"
flag_type = /obj/item/flag/plantable/ua
+
+// UNION OF PROGRESSIVE PEOPLES FLAG //
+//////////////////////////
+
+/obj/item/flag/plantable/upp
+ name = "\improper Union of Progressive Peoples flag"
+ desc = "The flag of the Union of Progressive Peoples. This one looks ready to be planted into the ground."
+ icon = 'icons/obj/structures/plantable_flag.dmi'
+ icon_state = "flag_upp"
+ flag_type = /obj/structure/flag/plantable/upp
+ faction = FACTION_UPP
+ play_warcry = TRUE
+ warcry_sound = 'sound/effects/flag_upp_warcry.ogg'
+ warcry_extra_sound = 'sound/effects/flag_upp_warcry_extra.ogg'
+
+/obj/structure/flag/plantable/upp
+ name = "\improper Union of Progressive Peoples flag"
+ desc = "The flag of the Union of Progressive Peoples. Unity through Strength, Freedom through Unity."
+ icon_state = "flag_upp_planted"
+ flag_type = /obj/item/flag/plantable/upp
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index f579917fed49..e4022c3e4ca0 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -96,7 +96,8 @@ GLOBAL_LIST_INIT_TYPED(metal_recipes, /datum/stack_recipe, list ( \
* Plasteel
*/
GLOBAL_LIST_INIT_TYPED(plasteel_recipes, /datum/stack_recipe, list ( \
- new/datum/stack_recipe("plasteel barricade", /obj/structure/barricade/plasteel, 8, time = 4 SECONDS, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_ENGI, min_time = 2 SECONDS),
+ new/datum/stack_recipe("folding plasteel barricade", /obj/structure/barricade/plasteel, 8, time = 4 SECONDS, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_ENGI, min_time = 2 SECONDS),
+ new/datum/stack_recipe("plasteel barricade", /obj/structure/barricade/metal/plasteel, 6, time = 8 SECONDS, one_per_turf = ONE_TYPE_PER_BORDER, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_ENGI, min_time = 2 SECONDS),
null, \
new/datum/stack_recipe("reinforced window frame", /obj/structure/window_frame/colony/reinforced, 5, time = 40, one_per_turf = ONE_TYPE_PER_TURF, on_floor = 1, skill_req = SKILL_CONSTRUCTION, skill_lvl = SKILL_CONSTRUCTION_ENGI),
null, \
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index e385d4b5c17d..a33d51bf618c 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -34,6 +34,23 @@
w_class = SIZE_LARGE //Changed becuase of in-game abuse
storage_flags = STORAGE_FLAGS_BOX
+/obj/item/storage/box/pride
+ name = "box of prideful crayons"
+ desc = "A box of every flavor of pride."
+ storage_slots = 8
+ w_class = SIZE_SMALL
+ can_hold = list(/obj/item/toy/crayon/pride)
+
+/obj/item/storage/box/pride/fill_preset_inventory()
+ new /obj/item/toy/crayon/pride/gay(src)
+ new /obj/item/toy/crayon/pride/lesbian(src)
+ new /obj/item/toy/crayon/pride/bi(src)
+ new /obj/item/toy/crayon/pride/ace(src)
+ new /obj/item/toy/crayon/pride/pan(src)
+ new /obj/item/toy/crayon/pride/trans(src)
+ new /obj/item/toy/crayon/pride/enby(src)
+ new /obj/item/toy/crayon/pride/fluid(src)
+
/obj/item/storage/box/survival
w_class = SIZE_MEDIUM
diff --git a/code/game/objects/items/toys/cards.dm b/code/game/objects/items/toys/cards.dm
index f63efd61a615..89aea51bb8c0 100644
--- a/code/game/objects/items/toys/cards.dm
+++ b/code/game/objects/items/toys/cards.dm
@@ -266,6 +266,7 @@
icon = 'icons/obj/items/playing_cards.dmi'
icon_state = "empty"
w_class = SIZE_TINY
+ flags_obj = parent_type::flags_obj|OBJ_IS_HELMET_GARB
var/concealed = FALSE
var/pile_state = FALSE
diff --git a/code/game/objects/items/toys/crayons.dm b/code/game/objects/items/toys/crayons.dm
index 1d9e2e1a4d54..636f1a50fc52 100644
--- a/code/game/objects/items/toys/crayons.dm
+++ b/code/game/objects/items/toys/crayons.dm
@@ -61,6 +61,62 @@
colorName = "rainbow"
uses = 0
+/obj/item/toy/crayon/pride/lesbian
+ icon_state = "crayonlesbian"
+ crayon_color = "#bd1471"
+ shade_color = "#d46b15"
+ colorName = "lesbian"
+ uses = 0
+
+/obj/item/toy/crayon/pride/gay
+ icon_state = "crayongay"
+ crayon_color = "#33cc9e"
+ shade_color = "#7f1fa5"
+ colorName = "gay"
+ uses = 0
+
+/obj/item/toy/crayon/pride/bi
+ icon_state = "crayonbi"
+ crayon_color = "#c01b6e"
+ shade_color = "#281dc5"
+ colorName = "bisexual"
+ uses = 0
+
+/obj/item/toy/crayon/pride/pan
+ icon_state = "crayonpan"
+ crayon_color = "#da1778"
+ shade_color = "#229bff"
+ colorName = "pansexual"
+ uses = 0
+
+/obj/item/toy/crayon/pride/ace
+ icon_state = "crayonace"
+ crayon_color = "#272727"
+ shade_color = "#570c3e"
+ colorName = "asexual"
+ uses = 0
+
+/obj/item/toy/crayon/pride/trans
+ icon_state = "crayontrans"
+ crayon_color = "#f57ecd"
+ shade_color = "#4bbdeb"
+ colorName = "transgender"
+ uses = 0
+
+/obj/item/toy/crayon/pride/enby
+ icon_state = "crayonenby"
+ crayon_color = "#272727"
+ shade_color = "#e9cf3a"
+ colorName = "nonbinary"
+ uses = 0
+
+/obj/item/toy/crayon/pride/fluid
+ icon_state = "crayonfluid"
+ crayon_color = "#b64791"
+ shade_color = "#000FFF"
+ colorName = "genderfluid"
+ uses = 0
+
/obj/item/toy/crayon/rainbow/attack_self(mob/living/user)
..()
crayon_color = input(user, "Please select the main color.", "Crayon color") as color
diff --git a/code/game/objects/structures/barricade/plasteel.dm b/code/game/objects/structures/barricade/folding.dm
similarity index 99%
rename from code/game/objects/structures/barricade/plasteel.dm
rename to code/game/objects/structures/barricade/folding.dm
index fb5a08954a5d..8fe00d04a708 100644
--- a/code/game/objects/structures/barricade/plasteel.dm
+++ b/code/game/objects/structures/barricade/folding.dm
@@ -1,5 +1,5 @@
/obj/structure/barricade/plasteel
- name = "plasteel barricade"
+ name = "folding plasteel barricade"
desc = "A very sturdy barricade made out of plasteel panels, the pinnacle of strongpoints. Use a blowtorch to repair. Can be flipped down to create a path."
icon_state = "plasteel_closed_0"
health = 800
diff --git a/code/game/objects/structures/barricade/metal.dm b/code/game/objects/structures/barricade/non_folding.dm
similarity index 95%
rename from code/game/objects/structures/barricade/metal.dm
rename to code/game/objects/structures/barricade/non_folding.dm
index f16e6851341b..575f1da738bf 100644
--- a/code/game/objects/structures/barricade/metal.dm
+++ b/code/game/objects/structures/barricade/non_folding.dm
@@ -279,3 +279,18 @@
..()
flags_can_pass_front_temp &= ~PASS_OVER_THROW_MOB
flags_can_pass_behind_temp &= ~PASS_OVER_THROW_MOB
+
+/obj/structure/barricade/metal/plasteel
+ name = "plasteel barricade"
+ desc = "A sturdy and easily assembled barricade made of reinforced plasteel plates, the pinnacle of strongpoints. Use a blowtorch to repair."
+ icon_state = "new_plasteel_0"
+ health = 900
+ maxhealth = 900
+ crusher_resistant = TRUE
+ force_level_absorption = 20
+ stack_type = /obj/item/stack/sheet/plasteel
+ debris = list(/obj/item/stack/sheet/plasteel)
+ destroyed_stack_amount = 3
+ barricade_type = "new_plasteel"
+ repair_materials = list("plasteel" = 0.45)
+
diff --git a/code/modules/admin/player_panel/actions/physical.dm b/code/modules/admin/player_panel/actions/physical.dm
index 21e6fed4f825..21f5504455d2 100644
--- a/code/modules/admin/player_panel/actions/physical.dm
+++ b/code/modules/admin/player_panel/actions/physical.dm
@@ -73,26 +73,9 @@
var/datum/job/job = GET_MAPPED_ROLE(target.job)
if(ishuman(target))
var/mob/living/carbon/human/H = target
+ job.on_cryo(H)
if(H.assigned_squad)
var/datum/squad/S = H.assigned_squad
- if(H.job == JOB_SQUAD_SPECIALIST)
- //we make the set this specialist took if any available again
- if(H.skills)
- var/set_name
- switch(H.skills.get_skill_level(SKILL_SPEC_WEAPONS))
- if(SKILL_SPEC_ROCKET)
- set_name = "Demolitionist Set"
- if(SKILL_SPEC_GRENADIER)
- set_name = "Heavy Grenadier Set"
- if(SKILL_SPEC_PYRO)
- set_name = "Pyro Set"
- if(SKILL_SPEC_SCOUT)
- set_name = "Scout Set"
- if(SKILL_SPEC_SNIPER)
- set_name = "Sniper Set"
-
- if(set_name && !GLOB.available_specialist_sets.Find(set_name))
- GLOB.available_specialist_sets += set_name
S.forget_marine_in_squad(H)
message_admins("[key_name_admin(user)] sent [key_name_admin(target)] ([H.job]) to cryogenics.")
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 13a31b59fa97..79fd34b2660c 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -547,6 +547,10 @@ GLOBAL_LIST_EMPTY(gear_datums_by_name)
display_name = "Crayon"
path = /obj/item/toy/crayon/rainbow
+/datum/gear/toy/pride
+ display_name = "Box of Prideful Crayons"
+ path = /obj/item/storage/box/pride
+
/datum/gear/plush
category = "Plushies"
cost = 4
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 88605cb3b792..44d1e0a8bd0b 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -221,8 +221,8 @@
flags_equip_slot = SLOT_EYES|SLOT_FACE
/obj/item/clothing/glasses/regular/hipster
- name = "Sunglasses"
- desc = "They cut the sun and keep things fun. Why would you ever wear these indoors, or on a night operation. Are you trying to get yourself hurt?"
+ name = "Prescription Glasses"
+ desc = "Boring glasses, makes you look smart and potentially reputable."
icon_state = "hipster_glasses"
item_state = "hipster_glasses"
flags_equip_slot = SLOT_EYES|SLOT_FACE
diff --git a/code/modules/clothing/head/head.dm b/code/modules/clothing/head/head.dm
index 86527457bfce..7e1c1d8d08d2 100644
--- a/code/modules/clothing/head/head.dm
+++ b/code/modules/clothing/head/head.dm
@@ -88,6 +88,16 @@
name = "USCM Squad Beret"
desc = "For those who want to show pride and have nothing to lose (in their head, at least)."
+/obj/item/clothing/head/beret/cm/white/civilian
+ name = "White Beret"
+ desc = "A nice fashionable beret, popular with executives."
+ icon_state = "s_beret"
+
+/obj/item/clothing/head/beret/cm/black/civilian
+ name = "Black Beret"
+ desc = "A nice fashionable beret, popular with executives."
+ icon_state = "beret_black"
+
/obj/item/clothing/head/beret/cm/squadberet/equipped(mob/user, slot)
. = ..()
self_set()
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 845ce2a6eb6e..140d73fd05a0 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -326,6 +326,15 @@ GLOBAL_LIST_INIT(allowed_helmet_items, list(
/obj/item/toy/crayon/blue = "crayonblue",
/obj/item/toy/crayon/purple = "crayonpurple",
/obj/item/toy/crayon/rainbow = "crayonrainbow",
+ /obj/item/toy/crayon/pride/trans = "crayontrans",
+ /obj/item/toy/crayon/pride/gay = "crayongay",
+ /obj/item/toy/crayon/pride/lesbian = "crayonlesbian",
+ /obj/item/toy/crayon/pride/bi = "crayonbi",
+ /obj/item/toy/crayon/pride/pan = "crayonpan",
+ /obj/item/toy/crayon/pride/ace = "crayonace",
+ /obj/item/toy/crayon/pride/trans = "crayontrans",
+ /obj/item/toy/crayon/pride/enby = "crayonenby",
+ /obj/item/toy/crayon/pride/fluid = "crayonfluid",
/obj/item/paper = "paper",
/obj/item/device/flashlight/flare = "flare",
/obj/item/clothing/head/headset = "headset",
diff --git a/code/modules/clothing/shoes/marine_shoes.dm b/code/modules/clothing/shoes/marine_shoes.dm
index 7855075c2fb4..937416943958 100644
--- a/code/modules/clothing/shoes/marine_shoes.dm
+++ b/code/modules/clothing/shoes/marine_shoes.dm
@@ -163,6 +163,8 @@
/obj/item/clothing/shoes/marine/corporate
name = "rugged boots"
desc = "These synth-leather boots seem high quality when first worn, but quickly detoriate, especially in the environments the corporate security members these are issued to operate in. Still, better than nothing."
+
+/obj/item/clothing/shoes/marine/corporate/knife
spawn_item_type = /obj/item/attachable/bayonet
/obj/item/clothing/shoes/marine/ress
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 1a49dc7fe10f..91ae13958e46 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -141,6 +141,7 @@
icon_state = "laceups"
/obj/item/clothing/shoes/laceup/brown
+ name = "brown laceup shoes"
icon_state = "laceups_brown"
/obj/item/clothing/shoes/swimmingfins
diff --git a/code/modules/clothing/under/marine_uniform.dm b/code/modules/clothing/under/marine_uniform.dm
index 74cb5ea552ee..52635c63600a 100644
--- a/code/modules/clothing/under/marine_uniform.dm
+++ b/code/modules/clothing/under/marine_uniform.dm
@@ -840,7 +840,7 @@
worn_state = "liaison_formal"
/obj/item/clothing/under/liaison_suit/suspenders
- name = "liaison's attire"
+ name = "liaison's suspenders"
desc = "A collared shirt, complimented by a pair of suspenders. Worn by Weyland-Yutani employees who ask the tough questions. Smells faintly of cigars and bad acting."
icon_state = "liaison_suspenders"
worn_state = "liaison_suspenders"
@@ -863,6 +863,12 @@
icon_state = "corporate_ivy"
worn_state = "corporate_ivy"
+/obj/item/clothing/under/liaison_suit/orange
+ name = "orange outfit"
+ desc = "A pair of black pants paired with a very Wey-Yu orange shirt. A popular look with those in the corporate world that conduct the majority of their business from Weyland Yutani offices."
+ icon_state = "corporate_orange"
+ worn_state = "corporate_orange"
+
/obj/item/clothing/under/liaison_suit/corporate_formal
name = "white suit pants"
desc = "A pair of ivory slacks paired with a white shirt. A popular pairing for formal corporate events."
diff --git a/code/modules/cm_marines/equipment/kit_boxes.dm b/code/modules/cm_marines/equipment/kit_boxes.dm
index 83b20636fc5e..d61fc6e8a4c0 100644
--- a/code/modules/cm_marines/equipment/kit_boxes.dm
+++ b/code/modules/cm_marines/equipment/kit_boxes.dm
@@ -249,57 +249,26 @@
return TRUE
/obj/item/spec_kit/proc/select_and_spawn(mob/living/carbon/human/user)
- var/selection = tgui_input_list(user, "Pick your specialist equipment type.", "Specialist Kit Selection", GLOB.available_specialist_kit_boxes, 10 SECONDS)
+ var/list/available_specialist_kits = list()
+ for(var/path in GLOB.specialist_set_datums)
+ var/datum/specialist_set/specset = GLOB.specialist_set_datums[path]
+ if(specset.get_available_kit_num() >= 1)
+ available_specialist_kits += specset.get_name()
+
+ var/selection = tgui_input_list(user, "Pick your specialist equipment type.", "Specialist Kit Selection", available_specialist_kits, 10 SECONDS)
if(!selection || QDELETED(src))
return FALSE
- if(!GLOB.available_specialist_kit_boxes[selection] || GLOB.available_specialist_kit_boxes[selection] <= 0)
+ if(!skillcheckexplicit(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_TRAINED) && !skillcheckexplicit(user, SKILL_SPEC_WEAPONS, SKILL_SPEC_ALL))
+ to_chat(user, SPAN_WARNING("You already unwrapped your [name], give this one to someone else!"))
+ return FALSE
+ if(!GLOB.specialist_set_name_dict[selection] || (GLOB.specialist_set_name_dict[selection].get_available_kit_num() <= 0))
to_chat(user, SPAN_WARNING("No more kits of this type may be chosen!"))
return FALSE
var/obj/item/card/id/card = user.get_idcard()
if(!card || card.registered_ref != WEAKREF(user))
to_chat(user, SPAN_WARNING("You must be wearing your [SPAN_INFO("ID card")] or [SPAN_INFO("dog tags")] to select a specialization!"))
- return
- var/turf/T = get_turf(loc)
- var/obj/item/storage/box/spec/spec_box
- var/specialist_assignment
- switch(selection)
- if("Pyro")
- spec_box = new /obj/item/storage/box/spec/pyro(T)
- specialist_assignment = "Pyro"
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_PYRO)
- if("Grenadier")
- spec_box = new /obj/item/storage/box/spec/heavy_grenadier(T)
- specialist_assignment = "Grenadier"
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_GRENADIER)
- if("Sniper")
- spec_box = new /obj/item/storage/box/spec/sniper(T)
- specialist_assignment = "Sniper"
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_SNIPER)
- if("Anti-materiel Sniper")
- spec_box = new /obj/item/storage/box/spec/sniper/anti_materiel(T)
- specialist_assignment = "Heavy Sniper"
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_SNIPER)
- if("Scout")
- spec_box = new /obj/item/storage/box/spec/scout(T)
- specialist_assignment = "Scout"
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_SCOUT)
- //this is to be able to use C4s that are coming with the kit
- if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE))
- user.skills.set_skill(SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)
- if("Demo")
- spec_box = new /obj/item/storage/box/spec/demolitionist(T)
- specialist_assignment = "Demo"
- user.skills.set_skill(SKILL_SPEC_WEAPONS, SKILL_SPEC_ROCKET)
- //this is to be able to use C4s that are coming with the kit
- if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_NOVICE))
- user.skills.set_skill(SKILL_ENGINEER, SKILL_ENGINEER_NOVICE)
- if(specialist_assignment)
- user.put_in_hands(spec_box)
- card.set_assignment((user.assigned_squad && squad_assignment_update ? (user.assigned_squad.name + " ") : "") + card.assignment + " ([specialist_assignment])")
- GLOB.data_core.manifest_modify(user.real_name, WEAKREF(user), card.assignment)
- GLOB.available_specialist_kit_boxes[selection]--
- return TRUE
- return FALSE
+ return FALSE
+ return GLOB.specialist_set_name_dict[selection].redeem_set(user, TRUE)
//******************************************PFC Kits****************************************************************/
diff --git a/code/modules/cm_marines/specialist.dm b/code/modules/cm_marines/specialist.dm
index 2fc1fdec10db..9fbb240a1178 100644
--- a/code/modules/cm_marines/specialist.dm
+++ b/code/modules/cm_marines/specialist.dm
@@ -38,3 +38,151 @@
for (var/datum/action/item_action/specialist/SA in H.actions)
if (SA.ability_primacy == SPEC_PRIMARY_ACTION_2)
SA.handle_spec_macro()
+
+/// Get a specialist set datum typepath given a mob, returns null if they aren't a spec or haven't chosen a kit.
+/proc/get_specialist_set(mob/living/spec)
+ for(var/datum/specialist_set/path as anything in GLOB.specialist_set_datums)
+ if(HAS_TRAIT(spec, TRAIT_SPEC(path::trait_to_give)))
+ return path
+
+/proc/setup_specialist_sets()
+ var/list/set_list = list()
+ for(var/datum/specialist_set/path as anything in subtypesof(/datum/specialist_set))
+ var/datum/specialist_set/object = new path
+ set_list[path] = object
+ GLOB.specialist_set_name_dict[object.get_name()] = object
+ return set_list
+
+/datum/specialist_set
+ /// Human-readable name for the specialist set
+ VAR_PROTECTED/name = "" as text
+ /// What is the role title that should go on ID cards
+ VAR_PROTECTED/role_name = "" as text
+ /// How many more of this spec set can be picked from spec vendors
+ VAR_PRIVATE/available_vendor_num = 1 as num
+ /// How many more of this spec set can be picked from /obj/item/spec_kit
+ VAR_PRIVATE/available_kit_num = 2 as num
+ /// What skill tier to give the person redeeming the set
+ VAR_PROTECTED/skill_to_give = SKILL_SPEC_DEFAULT as num
+ /// What trait to give the person redeeming the set
+ VAR_PROTECTED/trait_to_give
+ /// What typepath to spawn for the redeemer if from a kit
+ VAR_PROTECTED/kit_typepath
+ /// List of typepaths that are incompatible with this set, meaning it'll subtract 1 from their vendor/kit num as well
+ VAR_PROTECTED/list/incompatible_sets = list()
+
+/datum/specialist_set/New()
+ . = ..()
+ incompatible_sets += type
+
+/datum/specialist_set/proc/redeem_set(mob/living/carbon/human/redeemer, kit = FALSE)
+ SHOULD_CALL_PARENT(TRUE)
+ if(!redeemer)
+ return FALSE
+
+ if(kit && (available_kit_num <= 0))
+ to_chat(redeemer, SPAN_WARNING("No more kits of this type may be chosen."))
+ return FALSE
+ else if(!kit && (available_vendor_num <= 0))
+ to_chat(redeemer, SPAN_WARNING("That set is already taken."))
+ return FALSE
+
+ if(skill_to_give != SKILL_SPEC_DEFAULT)
+ redeemer.skills?.set_skill(SKILL_SPEC_WEAPONS, skill_to_give)
+
+ if(kit)
+ redeemer.put_in_any_hand_if_possible(new kit_typepath, FALSE)
+ for(var/path in incompatible_sets)
+ GLOB.specialist_set_datums[path].available_kit_num--
+ ADD_TRAIT(redeemer, TRAIT_SPEC_KIT, TRAIT_SOURCE_INHERENT)
+ else
+ for(var/path in incompatible_sets)
+ GLOB.specialist_set_datums[path].available_vendor_num--
+ ADD_TRAIT(redeemer, TRAIT_SPEC_VENDOR, TRAIT_SOURCE_INHERENT)
+ ADD_TRAIT(redeemer, TRAIT_SPEC(trait_to_give), TRAIT_SOURCE_INHERENT)
+ var/obj/item/card/id/idcard = redeemer.get_idcard()
+ if(idcard)
+ idcard.set_assignment((redeemer.assigned_squad ? (redeemer.assigned_squad.name + " ") : "") + JOB_SQUAD_SPECIALIST + " ([role_name])")
+ GLOB.data_core.manifest_modify(redeemer.real_name, WEAKREF(redeemer), idcard.assignment)
+ return TRUE
+
+/datum/specialist_set/proc/refund_set(mob/living/carbon/human/refunder)
+ SHOULD_CALL_PARENT(TRUE)
+ if(!refunder)
+ return
+
+ if(HAS_TRAIT(refunder, TRAIT_SPEC_KIT))
+ for(var/path in incompatible_sets)
+ GLOB.specialist_set_datums[path].available_kit_num++
+ else if(HAS_TRAIT(refunder, TRAIT_SPEC_VENDOR))
+ for(var/path in incompatible_sets)
+ GLOB.specialist_set_datums[path].available_vendor_num++
+
+/datum/specialist_set/proc/get_name() as text
+ return name
+
+/datum/specialist_set/proc/get_available_kit_num() as num
+ return available_kit_num
+
+/datum/specialist_set/proc/get_available_vendor_num() as num
+ return available_vendor_num
+
+/datum/specialist_set/sadar
+ name = "Demolitionist Set"
+ role_name = "Demo"
+ skill_to_give = SKILL_SPEC_ROCKET
+ kit_typepath = /obj/item/storage/box/spec/demolitionist
+
+/datum/specialist_set/sadar/redeem_set(mob/living/redeemer, kit)
+ . = ..()
+ if(!.)
+ return .
+
+ if(!skillcheck(redeemer, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED))
+ redeemer.skills?.set_skill(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)
+ return TRUE
+
+/datum/specialist_set/scout
+ name = "Scout Set"
+ role_name = "Scout"
+ skill_to_give = SKILL_SPEC_SCOUT
+ kit_typepath = /obj/item/storage/box/spec/scout
+
+/datum/specialist_set/scout/redeem_set(mob/living/redeemer, kit)
+ . = ..()
+ if(!.)
+ return .
+
+ if(!skillcheck(redeemer, SKILL_ENGINEER, SKILL_ENGINEER_TRAINED))
+ redeemer.skills?.set_skill(SKILL_ENGINEER, SKILL_ENGINEER_TRAINED)
+ return TRUE
+
+/datum/specialist_set/sniper
+ name = "Sniper Set"
+ role_name = "Sniper"
+ skill_to_give = SKILL_SPEC_SNIPER
+ kit_typepath = /obj/item/storage/box/spec/sniper
+ incompatible_sets = list(
+ /datum/specialist_set/anti_mat_sniper,
+ )
+
+/datum/specialist_set/anti_mat_sniper
+ name = "Anti-Materiel Sniper Set"
+ role_name = "Heavy Sniper"
+ skill_to_give = SKILL_SPEC_SNIPER
+ kit_typepath = /obj/item/storage/box/spec/sniper/anti_materiel
+ incompatible_sets = list(
+ /datum/specialist_set/sniper,
+ )
+
+/datum/specialist_set/grenadier
+ name = "Heavy Grenadier Set"
+ role_name = "Grenadier"
+ skill_to_give = SKILL_SPEC_GRENADIER
+ kit_typepath = /obj/item/storage/box/spec/heavy_grenadier
+
+/datum/specialist_set/pyro
+ name = "Pyro Set"
+ role_name = "Pyro"
+ skill_to_give = SKILL_SPEC_PYRO
+ kit_typepath = /obj/item/storage/box/spec/pyro
diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm
index 3bbbd11c0784..14336cbdba04 100644
--- a/code/modules/cm_preds/yaut_weapons.dm
+++ b/code/modules/cm_preds/yaut_weapons.dm
@@ -893,6 +893,8 @@
icon = 'icons/obj/items/hunter/pred_gear.dmi'
icon_state = null
works_in_recharger = FALSE
+ muzzle_flash = "muzzle_flash_blue"
+ muzzle_flash_color = COLOR_MAGENTA
item_icons = list(
WEAR_BACK = 'icons/mob/humans/onmob/hunter/pred_gear.dmi',
WEAR_L_HAND = 'icons/mob/humans/onmob/hunter/items_lefthand.dmi',
@@ -907,7 +909,6 @@
unacidable = TRUE
fire_sound = 'sound/weapons/pred_plasma_shot.ogg'
ammo = /datum/ammo/energy/yautja/rifle/bolt
- muzzle_flash = null // TO DO, add a decent one.
zoomdevicename = "scope"
flags_equip_slot = SLOT_BACK
w_class = SIZE_HUGE
@@ -992,6 +993,7 @@
#define FIRE_MODE_STANDARD "Standard"
#define FIRE_MODE_INCENDIARY "Incendiary"
+
/obj/item/weapon/gun/energy/yautja/plasmapistol
name = "plasma pistol"
desc = "A plasma pistol capable of rapid fire. It has an integrated battery. Can be used to set fires, either to braziers or on people."
@@ -1002,7 +1004,8 @@
fire_sound = 'sound/weapons/pulse3.ogg'
flags_equip_slot = SLOT_WAIST
ammo = /datum/ammo/energy/yautja/pistol
- muzzle_flash = null // TO DO, add a decent one.
+ muzzle_flash = "muzzle_flash_blue"
+ muzzle_flash_color = COLOR_MUZZLE_BLUE
w_class = SIZE_MEDIUM
/// Max amount of shots
var/charge_time = 40
@@ -1127,7 +1130,8 @@
)
fire_sound = 'sound/weapons/pred_plasmacaster_fire.ogg'
ammo = /datum/ammo/energy/yautja/caster/stun
- muzzle_flash = null // TO DO, add a decent one.
+ muzzle_flash = "muzzle_flash_blue"
+ muzzle_flash_color = COLOR_MUZZLE_BLUE
w_class = SIZE_HUGE
force = 0
fire_delay = 3
diff --git a/code/modules/gear_presets/corpses.dm b/code/modules/gear_presets/corpses.dm
index 9e688037860b..d84cf766c4fc 100644
--- a/code/modules/gear_presets/corpses.dm
+++ b/code/modules/gear_presets/corpses.dm
@@ -706,7 +706,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK)
@@ -731,7 +731,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate/lead, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate/lead, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK)
diff --git a/code/modules/gear_presets/survivors/kutjevo/preset_kutjevo.dm b/code/modules/gear_presets/survivors/kutjevo/preset_kutjevo.dm
index eb04cbd5a94e..6db2882ddf82 100644
--- a/code/modules/gear_presets/survivors/kutjevo/preset_kutjevo.dm
+++ b/code/modules/gear_presets/survivors/kutjevo/preset_kutjevo.dm
@@ -33,7 +33,7 @@
add_random_kutjevo_survivor_equipment(new_human)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran(new_human), WEAR_HANDS)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife(new_human), WEAR_FEET)
..()
/datum/equipment_preset/survivor/doctor/kutjevo
diff --git a/code/modules/gear_presets/survivors/lv_624/preset_lv.dm b/code/modules/gear_presets/survivors/lv_624/preset_lv.dm
index a56432b80b89..462075142698 100644
--- a/code/modules/gear_presets/survivors/lv_624/preset_lv.dm
+++ b/code/modules/gear_presets/survivors/lv_624/preset_lv.dm
@@ -86,7 +86,7 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/security(new_human), WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc(new_human), WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife(new_human), WEAR_FEET)
..()
/datum/equipment_preset/survivor/corporate/lv
diff --git a/code/modules/gear_presets/survivors/misc.dm b/code/modules/gear_presets/survivors/misc.dm
index f0cf368d4936..a6ed27cbb91a 100644
--- a/code/modules/gear_presets/survivors/misc.dm
+++ b/code/modules/gear_presets/survivors/misc.dm
@@ -185,7 +185,7 @@ Everything below isn't used or out of place.
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/five_slot, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK)
diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm
index 65e5a8f4c123..d90d31ef3880 100644
--- a/code/modules/gear_presets/survivors/survivors.dm
+++ b/code/modules/gear_presets/survivors/survivors.dm
@@ -18,6 +18,74 @@
var/survivor_variant = CIVILIAN_SURVIVOR
+ dress_under = list(
+ /obj/item/clothing/under/liaison_suit/black,
+ /obj/item/clothing/under/liaison_suit/blue,
+ /obj/item/clothing/under/liaison_suit/brown,
+ /obj/item/clothing/under/liaison_suit/corporate_formal,
+ /obj/item/clothing/under/liaison_suit,
+ /obj/item/clothing/under/liaison_suit/charcoal,
+ /obj/item/clothing/under/liaison_suit/formal,
+ /obj/item/clothing/under/liaison_suit/blazer,
+ /obj/item/clothing/under/liaison_suit/suspenders,
+ /obj/item/clothing/under/blackskirt,
+ /obj/item/clothing/under/suit_jacket/trainee,
+ /obj/item/clothing/under/liaison_suit/ivy,
+ /obj/item/clothing/under/liaison_suit/orange,
+ /obj/item/clothing/under/liaison_suit/field,
+ /obj/item/clothing/under/colonist/workwear,
+ /obj/item/clothing/under/colonist/workwear/khaki,
+ /obj/item/clothing/under/colonist/workwear/pink,
+ /obj/item/clothing/under/colonist/workwear/green,
+ )
+ dress_over = list(
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/brown,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/blue,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/red,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber,
+ /obj/item/clothing/suit/storage/bomber,
+ /obj/item/clothing/suit/storage/bomber/alt,
+ /obj/item/clothing/suit/storage/snow_suit/liaison,
+ /obj/item/clothing/suit/storage/labcoat,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/vest,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/tan,
+ /obj/item/clothing/suit/storage/webbing,
+ )
+ dress_extra = list(
+ /obj/item/clothing/accessory/black,
+ /obj/item/clothing/accessory/red,
+ /obj/item/clothing/accessory/purple,
+ /obj/item/clothing/accessory/blue,
+ /obj/item/clothing/accessory/green,
+ /obj/item/clothing/accessory/gold,
+ /obj/item/clothing/accessory/horrible,
+ /obj/item/clothing/glasses/sunglasses/big,
+ /obj/item/clothing/glasses/sunglasses/aviator,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/glasses/sunglasses/prescription,
+ /obj/item/clothing/glasses/regular/hipster,
+ )
+ dress_gloves = list(
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/marine/dress,
+ )
+ dress_shoes = list(
+ /obj/item/clothing/shoes/laceup,
+ /obj/item/clothing/shoes/laceup/brown,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/shoes/marine/corporate,
+ )
+ dress_hat = list(
+ /obj/item/clothing/head/fedora,
+ /obj/item/clothing/head/beret/cm/black/civilian,
+ /obj/item/clothing/head/beret/cm/white/civilian,
+ )
+
/datum/equipment_preset/survivor/load_name(mob/living/carbon/human/new_human, randomise)
new_human.gender = pick(MALE, FEMALE)
var/datum/preferences/A = new
diff --git a/code/modules/gear_presets/survivors/trijent/preset_trijent.dm b/code/modules/gear_presets/survivors/trijent/preset_trijent.dm
index 100f83518565..3c9926de69aa 100644
--- a/code/modules/gear_presets/survivors/trijent/preset_trijent.dm
+++ b/code/modules/gear_presets/survivors/trijent/preset_trijent.dm
@@ -17,7 +17,7 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel/sec(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/security(new_human), WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate(new_human), WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife(new_human), WEAR_FEET)
..()
/datum/equipment_preset/survivor/colonial_marshal/trijent
diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm
index ad7b1523d279..8ac573b5beae 100644
--- a/code/modules/gear_presets/upp.dm
+++ b/code/modules/gear_presets/upp.dm
@@ -1606,6 +1606,8 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet/upp, WEAR_IN_BACK)
+
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR)
//head
@@ -1766,6 +1768,7 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet/upp, WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR)
//head
@@ -1926,6 +1929,7 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet/upp, WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR)
//head
@@ -2086,6 +2090,7 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet/upp, WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR)
//head
@@ -2246,6 +2251,7 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet/upp, WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR)
//head
@@ -2406,6 +2412,7 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/motiondetector/hacked, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/megaphone, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/cotablet/upp, WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/command, WEAR_L_EAR)
//head
diff --git a/code/modules/gear_presets/uscm_ship.dm b/code/modules/gear_presets/uscm_ship.dm
index ba4a8a684321..38a07f8ee874 100644
--- a/code/modules/gear_presets/uscm_ship.dm
+++ b/code/modules/gear_presets/uscm_ship.dm
@@ -53,22 +53,73 @@
minimap_icon = "cl"
minimap_background = MINIMAP_ICON_BACKGROUND_CIVILIAN
- utility_under = list(/obj/item/clothing/under/liaison_suit/black)
- utility_hat = list()
- utility_gloves = list()
- utility_shoes = list(/obj/item/clothing/shoes/laceup)
- utility_extra = list(/obj/item/clothing/under/liaison_suit/blue)
-
- service_under = list(/obj/item/clothing/under/liaison_suit/field)
- service_over = list()
- service_hat = list()
- service_shoes = list(/obj/item/clothing/shoes/laceup)
-
- dress_under = list(/obj/item/clothing/under/liaison_suit/corporate_formal)
- dress_over = list()
- dress_hat = list()
- dress_gloves = list(/obj/item/clothing/gloves/marine/dress)
- dress_shoes = list(/obj/item/clothing/shoes/laceup)
+ dress_under = list(
+ /obj/item/clothing/under/liaison_suit/black,
+ /obj/item/clothing/under/liaison_suit/blue,
+ /obj/item/clothing/under/liaison_suit/brown,
+ /obj/item/clothing/under/liaison_suit/corporate_formal,
+ /obj/item/clothing/under/liaison_suit,
+ /obj/item/clothing/under/liaison_suit/charcoal,
+ /obj/item/clothing/under/liaison_suit/formal,
+ /obj/item/clothing/under/liaison_suit/blazer,
+ /obj/item/clothing/under/liaison_suit/suspenders,
+ /obj/item/clothing/under/blackskirt,
+ /obj/item/clothing/under/suit_jacket/trainee,
+ /obj/item/clothing/under/liaison_suit/ivy,
+ /obj/item/clothing/under/liaison_suit/orange,
+ /obj/item/clothing/under/liaison_suit/field,
+ /obj/item/clothing/under/colonist/workwear,
+ /obj/item/clothing/under/colonist/workwear/khaki,
+ /obj/item/clothing/under/colonist/workwear/pink,
+ /obj/item/clothing/under/colonist/workwear/green,
+ )
+ dress_over = list(
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/brown,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/blue,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/red,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber,
+ /obj/item/clothing/suit/storage/bomber,
+ /obj/item/clothing/suit/storage/bomber/alt,
+ /obj/item/clothing/suit/storage/snow_suit/liaison,
+ /obj/item/clothing/suit/storage/labcoat,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/vest,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/tan,
+ /obj/item/clothing/suit/storage/webbing,
+ )
+ dress_extra = list(
+ /obj/item/clothing/accessory/black,
+ /obj/item/clothing/accessory/red,
+ /obj/item/clothing/accessory/purple,
+ /obj/item/clothing/accessory/blue,
+ /obj/item/clothing/accessory/green,
+ /obj/item/clothing/accessory/gold,
+ /obj/item/clothing/accessory/horrible,
+ /obj/item/clothing/glasses/sunglasses/big,
+ /obj/item/clothing/glasses/sunglasses/aviator,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/glasses/sunglasses/prescription,
+ /obj/item/clothing/glasses/regular/hipster,
+ )
+ dress_gloves = list(
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/marine/dress,
+ )
+ dress_shoes = list(
+ /obj/item/clothing/shoes/laceup,
+ /obj/item/clothing/shoes/laceup/brown,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/shoes/marine/corporate,
+ )
+ dress_hat = list(
+ /obj/item/clothing/head/fedora,
+ /obj/item/clothing/head/beret/cm/black/civilian,
+ /obj/item/clothing/head/beret/cm/white/civilian,
+ )
/datum/equipment_preset/uscm_ship/liaison/New()
. = ..()
diff --git a/code/modules/gear_presets/wy.dm b/code/modules/gear_presets/wy.dm
index 75349115b47c..6cfccab00036 100644
--- a/code/modules/gear_presets/wy.dm
+++ b/code/modules/gear_presets/wy.dm
@@ -10,6 +10,74 @@
languages = list(LANGUAGE_ENGLISH, LANGUAGE_JAPANESE)
var/headset_type = /obj/item/device/radio/headset/distress/WY
+ dress_under = list(
+ /obj/item/clothing/under/liaison_suit/black,
+ /obj/item/clothing/under/liaison_suit/blue,
+ /obj/item/clothing/under/liaison_suit/brown,
+ /obj/item/clothing/under/liaison_suit/corporate_formal,
+ /obj/item/clothing/under/liaison_suit,
+ /obj/item/clothing/under/liaison_suit/charcoal,
+ /obj/item/clothing/under/liaison_suit/formal,
+ /obj/item/clothing/under/liaison_suit/blazer,
+ /obj/item/clothing/under/liaison_suit/suspenders,
+ /obj/item/clothing/under/blackskirt,
+ /obj/item/clothing/under/suit_jacket/trainee,
+ /obj/item/clothing/under/liaison_suit/ivy,
+ /obj/item/clothing/under/liaison_suit/orange,
+ /obj/item/clothing/under/liaison_suit/field,
+ /obj/item/clothing/under/colonist/workwear,
+ /obj/item/clothing/under/colonist/workwear/khaki,
+ /obj/item/clothing/under/colonist/workwear/pink,
+ /obj/item/clothing/under/colonist/workwear/green,
+ )
+ dress_over = list(
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/brown,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/blue,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/red,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber,
+ /obj/item/clothing/suit/storage/bomber,
+ /obj/item/clothing/suit/storage/bomber/alt,
+ /obj/item/clothing/suit/storage/snow_suit/liaison,
+ /obj/item/clothing/suit/storage/labcoat,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/vest,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/tan,
+ /obj/item/clothing/suit/storage/webbing,
+ )
+ dress_extra = list(
+ /obj/item/clothing/accessory/black,
+ /obj/item/clothing/accessory/red,
+ /obj/item/clothing/accessory/purple,
+ /obj/item/clothing/accessory/blue,
+ /obj/item/clothing/accessory/green,
+ /obj/item/clothing/accessory/gold,
+ /obj/item/clothing/accessory/horrible,
+ /obj/item/clothing/glasses/sunglasses/big,
+ /obj/item/clothing/glasses/sunglasses/aviator,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/glasses/sunglasses/prescription,
+ /obj/item/clothing/glasses/regular/hipster,
+ )
+ dress_gloves = list(
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/marine/dress,
+ )
+ dress_shoes = list(
+ /obj/item/clothing/shoes/laceup,
+ /obj/item/clothing/shoes/laceup/brown,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/shoes/marine/corporate,
+ )
+ dress_hat = list(
+ /obj/item/clothing/head/fedora,
+ /obj/item/clothing/head/beret/cm/black/civilian,
+ /obj/item/clothing/head/beret/cm/white/civilian,
+ )
+
/datum/equipment_preset/wy/New()
. = ..()
access += get_access(ACCESS_LIST_WY_BASE)
diff --git a/code/modules/gear_presets/wy_goons.dm b/code/modules/gear_presets/wy_goons.dm
index c67f82176c93..a15e9b443302 100644
--- a/code/modules/gear_presets/wy_goons.dm
+++ b/code/modules/gear_presets/wy_goons.dm
@@ -70,7 +70,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK)
@@ -104,7 +104,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate, WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/welding, WEAR_EYES)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/engineerpack/ert, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK)
@@ -141,7 +141,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/marine/veteran/pmc/light/corporate/lead, WEAR_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/marine/veteran, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/marine/veteran/pmc/corporate/lead, WEAR_HEAD)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/weapon/baton, WEAR_IN_BACK)
@@ -167,12 +167,80 @@
paygrades = list(PAY_SHORT_CCMO = JOB_PLAYTIME_TIER_0)
skills = /datum/skills/researcher
+ dress_under = list(
+ /obj/item/clothing/under/liaison_suit/black,
+ /obj/item/clothing/under/liaison_suit/blue,
+ /obj/item/clothing/under/liaison_suit/brown,
+ /obj/item/clothing/under/liaison_suit/corporate_formal,
+ /obj/item/clothing/under/liaison_suit,
+ /obj/item/clothing/under/liaison_suit/charcoal,
+ /obj/item/clothing/under/liaison_suit/formal,
+ /obj/item/clothing/under/liaison_suit/blazer,
+ /obj/item/clothing/under/liaison_suit/suspenders,
+ /obj/item/clothing/under/blackskirt,
+ /obj/item/clothing/under/suit_jacket/trainee,
+ /obj/item/clothing/under/liaison_suit/ivy,
+ /obj/item/clothing/under/liaison_suit/orange,
+ /obj/item/clothing/under/liaison_suit/field,
+ /obj/item/clothing/under/colonist/workwear,
+ /obj/item/clothing/under/colonist/workwear/khaki,
+ /obj/item/clothing/under/colonist/workwear/pink,
+ /obj/item/clothing/under/colonist/workwear/green,
+ )
+ dress_over = list(
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/brown,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/blue,
+ /obj/item/clothing/suit/storage/jacket/marine/corporate/black,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber/red,
+ /obj/item/clothing/suit/storage/jacket/marine/bomber,
+ /obj/item/clothing/suit/storage/bomber,
+ /obj/item/clothing/suit/storage/bomber/alt,
+ /obj/item/clothing/suit/storage/snow_suit/liaison,
+ /obj/item/clothing/suit/storage/labcoat,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/grey,
+ /obj/item/clothing/suit/storage/jacket/marine/vest,
+ /obj/item/clothing/suit/storage/jacket/marine/vest/tan,
+ /obj/item/clothing/suit/storage/webbing,
+ )
+ dress_extra = list(
+ /obj/item/clothing/accessory/black,
+ /obj/item/clothing/accessory/red,
+ /obj/item/clothing/accessory/purple,
+ /obj/item/clothing/accessory/blue,
+ /obj/item/clothing/accessory/green,
+ /obj/item/clothing/accessory/gold,
+ /obj/item/clothing/accessory/horrible,
+ /obj/item/clothing/glasses/sunglasses/big,
+ /obj/item/clothing/glasses/sunglasses/aviator,
+ /obj/item/clothing/glasses/sunglasses,
+ /obj/item/clothing/glasses/sunglasses/prescription,
+ /obj/item/clothing/glasses/regular/hipster,
+ )
+ dress_gloves = list(
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/marine/dress,
+ )
+ dress_shoes = list(
+ /obj/item/clothing/shoes/laceup,
+ /obj/item/clothing/shoes/laceup/brown,
+ /obj/item/clothing/shoes/black,
+ /obj/item/clothing/shoes/marine/corporate,
+ )
+ dress_hat = list(
+ /obj/item/clothing/head/fedora,
+ /obj/item/clothing/head/beret/cm/black/civilian,
+ /obj/item/clothing/head/beret/cm/white/civilian,
+ )
+
/datum/equipment_preset/goon/researcher/load_gear(mob/living/carbon/human/new_human)
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/WY, WEAR_L_EAR)
new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/science, WEAR_EYES)
new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/corporate_formal, WEAR_BODY)
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat, WEAR_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate, WEAR_FEET)
+ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/marine/corporate/knife, WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/handheld_distress_beacon, WEAR_IN_BACK)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3adb5c53f299..993042a14a2b 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -512,7 +512,7 @@
last_special = world.time + 100
visible_message(SPAN_DANGER("[src] attempts to unbuckle themself!"),\
SPAN_DANGER("You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)"))
- if(do_after(src, 1200, INTERRUPT_ALL^INTERRUPT_RESIST, BUSY_ICON_HOSTILE))
+ if(do_after(src, 1200, INTERRUPT_NO_FLOORED^INTERRUPT_RESIST, BUSY_ICON_HOSTILE))
if(!buckled)
return
visible_message(SPAN_DANGER("[src] manages to unbuckle themself!"),\
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index f670fa682154..aff7deeae3b5 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -33,6 +33,8 @@
var/muzzle_flash = "muzzle_flash"
///muzzle flash brightness
var/muzzle_flash_lum = 3
+ ///Color of the muzzle flash light effect.
+ var/muzzle_flash_color = COLOR_VERY_SOFT_YELLOW
var/fire_sound = 'sound/weapons/Gunshot.ogg'
/// If fire_sound is null, it will pick a sound from the list here instead.
@@ -1780,6 +1782,7 @@ not all weapons use normal magazines etc. load_into_chamber() itself is designed
if(!light_on && (light_range <= muzzle_flash_lum))
set_light_range(muzzle_flash_lum)
set_light_on(TRUE)
+ set_light_color(muzzle_flash_color)
addtimer(CALLBACK(src, PROC_REF(reset_light_range), prev_light), 0.5 SECONDS)
var/image/I = image('icons/obj/items/weapons/projectiles.dmi', user, muzzle_flash, user.dir == NORTH ? ABOVE_LYING_MOB_LAYER : FLOAT_LAYER)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index b3dcae388a13..6826d8af921a 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -117,6 +117,7 @@
icon_state = "rxfm5_eva"
item_state = "eva"
muzzle_flash = "muzzle_laser"
+ muzzle_flash_color = COLOR_LASER_RED
fire_sound = 'sound/weapons/Laser4.ogg'
w_class = SIZE_MEDIUM
gun_category = GUN_CATEGORY_HANDGUN
@@ -174,6 +175,7 @@
icon_state = "laz_uzi"
item_state = "laz_uzi"
muzzle_flash = "muzzle_laser"
+ muzzle_flash_color = COLOR_LASER_RED
gun_category = GUN_CATEGORY_SMG
flags_equip_slot = SLOT_WAIST
charge_cost = 200
diff --git a/code/modules/projectiles/guns/pistols.dm b/code/modules/projectiles/guns/pistols.dm
index 3a85db687b26..e7d9174a6984 100644
--- a/code/modules/projectiles/guns/pistols.dm
+++ b/code/modules/projectiles/guns/pistols.dm
@@ -653,6 +653,7 @@
current_mag = /obj/item/ammo_magazine/pistol/es4
force = 8
muzzle_flash = "muzzle_flash_blue"
+ muzzle_flash_color = COLOR_MUZZLE_BLUE
flags_gun_features = GUN_AUTO_EJECTOR|GUN_CAN_POINTBLANK|GUN_ONE_HAND_WIELDED|GUN_AMMO_COUNTER
attachable_allowed = list(
/obj/item/attachable/flashlight,
diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm
index 4b7cdd69a449..1a4881904801 100644
--- a/code/modules/security_levels/keycard_authentication.dm
+++ b/code/modules/security_levels/keycard_authentication.dm
@@ -36,8 +36,11 @@
if(active == 1)
//This is not the device that made the initial request. It is the device confirming the request.
if(event_source)
+ if(event_source.event_triggered_by == user)
+ user.visible_message(SPAN_DANGER("Your ID is rejected, as it is the one that triggered the event!"))
+ return
event_source.confirmed = 1
- event_source.event_confirmed_by = usr
+ event_source.event_confirmed_by = user
else if(screen == 2)
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md
index b82d8f49e297..965e21b549a3 100644
--- a/code/modules/tgs/core/README.md
+++ b/code/modules/tgs/core/README.md
@@ -3,7 +3,7 @@
This folder contains all DMAPI code not directly involved in an API.
- [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals.
+- [byond_world_export.dm](./byond_world_export.dm) contains the default `/datum/tgs_http_handler` implementation which uses `world.Export()`.
- [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code.
- [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement.
- [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition
--
diff --git a/code/modules/tgs/core/byond_world_export.dm b/code/modules/tgs/core/byond_world_export.dm
new file mode 100644
index 000000000000..6ef8d841b8f7
--- /dev/null
+++ b/code/modules/tgs/core/byond_world_export.dm
@@ -0,0 +1,22 @@
+/datum/tgs_http_handler/byond_world_export
+
+/datum/tgs_http_handler/byond_world_export/PerformGet(url)
+ // This is an infinite sleep until we get a response
+ var/export_response = world.Export(url)
+ TGS_DEBUG_LOG("byond_world_export: Export complete")
+
+ if(!export_response)
+ TGS_ERROR_LOG("byond_world_export: Failed request: [url]")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ var/content = export_response["CONTENT"]
+ if(!content)
+ TGS_ERROR_LOG("byond_world_export: Failed request, missing content!")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ var/response_json = TGS_FILE2TEXT_NATIVE(content)
+ if(!response_json)
+ TGS_ERROR_LOG("byond_world_export: Failed request, failed to load content!")
+ return new /datum/tgs_http_result(null, FALSE)
+
+ return new /datum/tgs_http_result(response_json, TRUE)
diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm
index 15622228e91f..63cb5a2c3514 100644
--- a/code/modules/tgs/core/core.dm
+++ b/code/modules/tgs/core/core.dm
@@ -1,4 +1,4 @@
-/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE)
+/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler = null)
var/current_api = TGS_READ_GLOBAL(tgs)
if(current_api)
TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?")
@@ -55,7 +55,10 @@
TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]")
event_handler = null
- var/datum/tgs_api/new_api = new api_datum(event_handler, version)
+ if(!http_handler)
+ http_handler = new /datum/tgs_http_handler/byond_world_export
+
+ var/datum/tgs_api/new_api = new api_datum(event_handler, version, http_handler)
TGS_WRITE_GLOBAL(tgs, new_api)
diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm
index f734fd0527f0..3ca53e9bf7c6 100644
--- a/code/modules/tgs/core/datum.dm
+++ b/code/modules/tgs/core/datum.dm
@@ -6,7 +6,7 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null)
var/list/warned_deprecated_command_runs
-/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version)
+/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler)
..()
src.event_handler = event_handler
src.version = version
diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm
index 23b714f9d064..f5118ed55a3c 100644
--- a/code/modules/tgs/includes.dm
+++ b/code/modules/tgs/includes.dm
@@ -1,4 +1,5 @@
#include "core\_definitions.dm"
+#include "core\byond_world_export.dm"
#include "core\core.dm"
#include "core\datum.dm"
#include "core\tgs_version.dm"
diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm
index 05d0dee25b3c..3e328fc7c27d 100644
--- a/code/modules/tgs/v5/api.dm
+++ b/code/modules/tgs/v5/api.dm
@@ -31,9 +31,12 @@
var/detached = FALSE
-/datum/tgs_api/v5/New()
+ var/datum/tgs_http_handler/http_handler
+
+/datum/tgs_api/v5/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler)
. = ..()
interop_version = version
+ src.http_handler = http_handler
TGS_DEBUG_LOG("V5 API created: [json_encode(args)]")
/datum/tgs_api/v5/ApiVersion()
diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm
index 0c5e701a32b6..62201fcc9e58 100644
--- a/code/modules/tgs/v5/bridge.dm
+++ b/code/modules/tgs/v5/bridge.dm
@@ -78,27 +78,24 @@
WaitForReattach(FALSE)
TGS_DEBUG_LOG("Bridge request start")
- // This is an infinite sleep until we get a response
- var/export_response = world.Export(bridge_request)
+ var/datum/tgs_http_result/result = http_handler.PerformGet(bridge_request)
TGS_DEBUG_LOG("Bridge request complete")
- if(!export_response)
- TGS_ERROR_LOG("Failed bridge request: [bridge_request]")
+ if(isnull(result))
+ TGS_ERROR_LOG("Failed bridge request, handler returned null!")
return
- var/content = export_response["CONTENT"]
- if(!content)
- TGS_ERROR_LOG("Failed bridge request, missing content!")
+ if(!istype(result) || result.type != /datum/tgs_http_result)
+ TGS_ERROR_LOG("Failed bridge request, handler returned non-[/datum/tgs_http_result]!")
return
- var/response_json = TGS_FILE2TEXT_NATIVE(content)
- if(!response_json)
- TGS_ERROR_LOG("Failed bridge request, failed to load content!")
+ if(!result.success)
+ TGS_DEBUG_LOG("Failed bridge request, HTTP request failed!")
return
- var/list/bridge_response = json_decode(response_json)
+ var/list/bridge_response = json_decode(result.response_text)
if(!bridge_response)
- TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]")
+ TGS_ERROR_LOG("Failed bridge request, bad json: [result.response_text]")
return
var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE]
diff --git a/colonialmarines.dme b/colonialmarines.dme
index dab9a056a585..e3189c10baa4 100644
--- a/colonialmarines.dme
+++ b/colonialmarines.dme
@@ -843,7 +843,6 @@
#include "code\game\machinery\air_alarm.dm"
#include "code\game\machinery\autolathe.dm"
#include "code\game\machinery\autolathe_datums.dm"
-#include "code\game\machinery\Beacon.dm"
#include "code\game\machinery\biohazard_lockdown.dm"
#include "code\game\machinery\bioprinter.dm"
#include "code\game\machinery\buttons.dm"
@@ -998,6 +997,7 @@
#include "code\game\machinery\vending\vendor_types\antag\antag_guns_sorted.dm"
#include "code\game\machinery\vending\vendor_types\crew\combat_correspondent.dm"
#include "code\game\machinery\vending\vendor_types\crew\commanding_officer.dm"
+#include "code\game\machinery\vending\vendor_types\crew\corporate_liaison.dm"
#include "code\game\machinery\vending\vendor_types\crew\engineering.dm"
#include "code\game\machinery\vending\vendor_types\crew\medical.dm"
#include "code\game\machinery\vending\vendor_types\crew\mp.dm"
@@ -1322,10 +1322,10 @@
#include "code\game\objects\structures\window_frame.dm"
#include "code\game\objects\structures\barricade\barricade.dm"
#include "code\game\objects\structures\barricade\deployable.dm"
+#include "code\game\objects\structures\barricade\folding.dm"
#include "code\game\objects\structures\barricade\handrail.dm"
-#include "code\game\objects\structures\barricade\metal.dm"
#include "code\game\objects\structures\barricade\misc.dm"
-#include "code\game\objects\structures\barricade\plasteel.dm"
+#include "code\game\objects\structures\barricade\non_folding.dm"
#include "code\game\objects\structures\barricade\sandbags.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"
diff --git a/html/changelogs/AutoChangeLog-pr-6876.yml b/html/changelogs/AutoChangeLog-pr-6876.yml
deleted file mode 100644
index 16ca3bf4b61c..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6876.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "MarpleJones"
-delete-after: True
-changes:
- - balance: "Reduces the cost of the AGM-184 'Harpoon II' from 300 to 200."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6888.yml b/html/changelogs/AutoChangeLog-pr-6888.yml
deleted file mode 100644
index 002755079dc0..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6888.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Git-Nivrak"
-delete-after: True
-changes:
- - balance: "Explosions now always deal full damage at the source tile"
- - bugfix: "Fixed sadar rockets not gibbing humans on direct hit"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6908.yml b/html/changelogs/AutoChangeLog-pr-6908.yml
deleted file mode 100644
index 8718ee21c162..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6908.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Doubleumc"
-delete-after: True
-changes:
- - admin: "\"Start Round\" can start a delayed round"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6909.yml b/html/changelogs/AutoChangeLog-pr-6909.yml
deleted file mode 100644
index 9a91dee8fd9d..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6909.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Adamix147"
-delete-after: True
-changes:
- - maptweak: "Moved the unfixable APC at Kutjevo Botany to make it fixable again."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-6910.yml b/html/changelogs/AutoChangeLog-pr-6910.yml
deleted file mode 100644
index fc24d3612b92..000000000000
--- a/html/changelogs/AutoChangeLog-pr-6910.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Contrabang"
-delete-after: True
-changes:
- - bugfix: "ERT no longer show up in the orbit escape section"
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml
index 1209b8165f1f..ee3672d5738f 100644
--- a/html/changelogs/archive/2024-08.yml
+++ b/html/changelogs/archive/2024-08.yml
@@ -198,3 +198,61 @@
out
zzzmike:
- rscadd: fun fact for internal bleeding fixed
+2024-08-13:
+ Adamix147:
+ - maptweak: Moved the unfixable APC at Kutjevo Botany to make it fixable again.
+ Contrabang:
+ - bugfix: ERT no longer show up in the orbit escape section
+ Doubleumc:
+ - admin: '"Start Round" can start a delayed round'
+ Git-Nivrak:
+ - balance: Explosions now always deal full damage at the source tile
+ - bugfix: Fixed sadar rockets not gibbing humans on direct hit
+ MarpleJones:
+ - balance: Reduces the cost of the AGM-184 'Harpoon II' from 300 to 200.
+2024-08-15:
+ Blundir:
+ - rscadd: plasteel non folding barricade
+ Steelpoint:
+ - rscadd: A plantable UPP flag has been added to the game, an equilivant of the
+ United Americas flag. Currently admin spawn only.
+ - rscadd: A Command Tablet has been added that can be used by UPP Officers.
+ - rscadd: UPP Officers ranked O4 or greater (USCM Major Equilivant) are issued with
+ a Command Tablet.
+2024-08-16:
+ Doubleumc:
+ - ui: dark HUD indicators stay anchored to the viewport edge
+2024-08-17:
+ 567Turtle:
+ - rscadd: Gay crayons for your helmet ("Box of Prideful Crayons" in the toys section
+ of the loadout menu.)
+ Blundir:
+ - rscadd: Guns now support custom muzzle flash light color, some guns have a new
+ color of it now, standard color is yellow tinted now instead of white
+ cuberound:
+ - bugfix: two persons are needed to activate red, ert and emergency acces using
+ cards
+2024-08-18:
+ Zonespace27:
+ - bugfix: Fixed heavy sniper spec opening up the wrong specialist slot on admin
+ cryo
+ cuberound:
+ - rscdel: removes bluespace beacon
+2024-08-19:
+ Asmocard:
+ - qol: Playing cards no longer take a storage slot from your helmet, they take a
+ vanity slot now.
+ Vandujr:
+ - rscadd: Added a new 'Corporate Liaison's Wardrobe' that all corporate roles can
+ use. includes more clothes than the cabinet originally had.
+ - rscadd: Added a new orange outfit the CL can pick from his Wardrobe Vendor.
+ - rscadd: Added civilian black and white berets.
+ - refactor: Refactored the corporate boots, making a version with and without a
+ knife in it on spawn. All roles that should have the knife version, have it.
+ - imageadd: Added new item sprites to the old 'complete' suits; that being the tan
+ and formal suits, aswell as the suspenders.
+ - imageadd: Added a new item sprite for the black beret, in line with the rest of
+ the modern berets.
+ - maptweak: Swapped the CL's cabinet for the wardrobe vendor.
+ zzzmike:
+ - bugfix: lets you resist when bucklecuffed to bed
diff --git a/icons/mob/humans/onmob/helmet_garb.dmi b/icons/mob/humans/onmob/helmet_garb.dmi
index 9876dd8629ad..5611d28c8480 100644
Binary files a/icons/mob/humans/onmob/helmet_garb.dmi and b/icons/mob/humans/onmob/helmet_garb.dmi differ
diff --git a/icons/mob/humans/onmob/items_lefthand_64.dmi b/icons/mob/humans/onmob/items_lefthand_64.dmi
index d005d8c5f049..e086e4a7ffe0 100644
Binary files a/icons/mob/humans/onmob/items_lefthand_64.dmi and b/icons/mob/humans/onmob/items_lefthand_64.dmi differ
diff --git a/icons/mob/humans/onmob/items_righthand_64.dmi b/icons/mob/humans/onmob/items_righthand_64.dmi
index 72335e39bfff..00d1fae7531d 100644
Binary files a/icons/mob/humans/onmob/items_righthand_64.dmi and b/icons/mob/humans/onmob/items_righthand_64.dmi differ
diff --git a/icons/mob/humans/onmob/uniform_0.dmi b/icons/mob/humans/onmob/uniform_0.dmi
index 2dd645697684..c957814e9f3b 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/obj/items/clothing/cm_hats.dmi b/icons/obj/items/clothing/cm_hats.dmi
index 923a26b55c20..626de8fa5dd5 100644
Binary files a/icons/obj/items/clothing/cm_hats.dmi and b/icons/obj/items/clothing/cm_hats.dmi differ
diff --git a/icons/obj/items/crayons.dmi b/icons/obj/items/crayons.dmi
index 7ebabd5a81ef..1c7053a8a958 100644
Binary files a/icons/obj/items/crayons.dmi and b/icons/obj/items/crayons.dmi differ
diff --git a/icons/obj/structures/barricades.dmi b/icons/obj/structures/barricades.dmi
index f3c5a5c809e1..0e3cb6889d10 100644
Binary files a/icons/obj/structures/barricades.dmi and b/icons/obj/structures/barricades.dmi differ
diff --git a/icons/obj/structures/barricades_christmas.dmi b/icons/obj/structures/barricades_christmas.dmi
index 215bf9710a80..64b2383a4a9e 100644
Binary files a/icons/obj/structures/barricades_christmas.dmi and b/icons/obj/structures/barricades_christmas.dmi differ
diff --git a/icons/obj/structures/machinery/vending.dmi b/icons/obj/structures/machinery/vending.dmi
index 3098aadca8be..ba45e612ca22 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/plantable_flag.dmi b/icons/obj/structures/plantable_flag.dmi
index c92311529be3..2485f29c3b1f 100644
Binary files a/icons/obj/structures/plantable_flag.dmi and b/icons/obj/structures/plantable_flag.dmi differ
diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm
index 2764da8aaa78..079067d7938a 100644
--- a/maps/map_files/USS_Almayer/USS_Almayer.dmm
+++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm
@@ -2461,10 +2461,10 @@
icon_state = "SE-out"
},
/obj/structure/machinery/door_control{
+ access_modified = 1;
id = "OTStore";
name = "Shutters";
pixel_y = -24;
- access_modified = 1;
req_one_access_txt = "35"
},
/obj/structure/surface/rack,
@@ -3293,12 +3293,12 @@
/obj/structure/machinery/faxmachine/uscm/command,
/obj/item/device/megaphone,
/obj/structure/machinery/computer/cameras/almayer_brig{
- dir = 8;
desc = "Used to access the various cameras in the security brig.";
+ dir = 8;
+ layer = 2.99;
name = "brig cameras console";
- pixel_y = 12;
pixel_x = 17;
- layer = 2.99
+ pixel_y = 12
},
/turf/open/floor/almayer/plate,
/area/almayer/command/cic)
@@ -12176,8 +12176,8 @@
/area/almayer/hallways/lower/starboard_midship_hallway)
"bMg" = (
/obj/structure/pipes/vents/pump/no_boom/gas{
- vent_tag = "Synth Bay";
- dir = 8
+ dir = 8;
+ vent_tag = "Synth Bay"
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -16114,8 +16114,8 @@
desc = "A pneumatic delivery unit.";
icon_state = "delivery_engi";
name = "Returns";
- pixel_y = 28;
- pixel_x = 25
+ pixel_x = 25;
+ pixel_y = 28
},
/obj/structure/surface/rack,
/turf/open/floor/almayer/aicore/no_build,
@@ -16407,54 +16407,10 @@
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
"cOY" = (
-/obj/item/clothing/under/blackskirt{
- desc = "A stylish skirt, in a business-black and red colour scheme.";
- name = "liaison's skirt"
- },
-/obj/item/clothing/under/suit_jacket/charcoal{
- desc = "A professional black suit and blue tie. A combination popular among government agents and corporate Yes-Men alike.";
- name = "liaison's black suit"
- },
-/obj/item/clothing/under/suit_jacket/navy{
- desc = "A navy suit and red tie, intended for the Almayer's finest. And accountants.";
- name = "liaison's navy suit"
- },
-/obj/item/clothing/under/suit_jacket/trainee,
-/obj/item/clothing/under/liaison_suit/charcoal,
-/obj/item/clothing/under/liaison_suit/blazer,
-/obj/item/clothing/suit/storage/snow_suit/liaison,
-/obj/item/clothing/gloves/black,
-/obj/item/clothing/gloves/marine/dress,
-/obj/item/clothing/glasses/sunglasses/big,
-/obj/item/clothing/accessory/blue,
-/obj/item/clothing/accessory/red,
/obj/structure/machinery/status_display{
pixel_x = -32
},
-/obj/item/clothing/accessory/black,
-/obj/item/clothing/accessory/green,
-/obj/item/clothing/accessory/gold,
-/obj/item/clothing/accessory/purple,
-/obj/item/clothing/under/liaison_suit/corporate_formal,
-/obj/item/clothing/under/liaison_suit/field,
-/obj/item/clothing/under/liaison_suit/ivy,
-/obj/item/clothing/under/liaison_suit/blue,
-/obj/item/clothing/under/liaison_suit/brown,
-/obj/item/clothing/under/liaison_suit/black,
-/obj/item/clothing/suit/storage/jacket/marine/vest,
-/obj/item/clothing/suit/storage/jacket/marine/vest/grey,
-/obj/item/clothing/suit/storage/jacket/marine/vest/tan,
-/obj/item/clothing/suit/storage/jacket/marine/bomber,
-/obj/item/clothing/suit/storage/jacket/marine/bomber/red,
-/obj/item/clothing/suit/storage/jacket/marine/bomber/grey,
-/obj/item/clothing/suit/storage/jacket/marine/corporate,
-/obj/item/clothing/suit/storage/jacket/marine/corporate/black,
-/obj/item/clothing/suit/storage/jacket/marine/corporate/blue,
-/obj/item/clothing/suit/storage/jacket/marine/corporate/brown,
-/obj/item/clothing/suit/storage/jacket/marine/corporate/formal,
-/obj/structure/closet/cabinet{
- storage_capacity = 35
- },
+/obj/structure/machinery/cm_vending/clothing/dress/corporate_liaison,
/turf/open/floor/wood/ship,
/area/almayer/command/corporateliaison)
"cPg" = (
@@ -17730,8 +17686,8 @@
/obj/structure/machinery/door_control{
id = "ARES JoeCryo";
name = "ARES WorkingJoe Bay Shutters";
- req_one_access_txt = "91;92";
- pixel_x = 24
+ pixel_x = 24;
+ req_one_access_txt = "91;92"
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
autoname = 0;
@@ -18019,9 +17975,9 @@
layer = 3.3
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
autoname = 0;
- c_tag = "AI - Secondary Processors"
+ c_tag = "AI - Secondary Processors";
+ dir = 8
},
/turf/open/floor/almayer/aicore/no_build/ai_floor2,
/area/almayer/command/airoom)
@@ -19567,10 +19523,10 @@
req_one_access_txt = "90;91;92"
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 4;
- pixel_y = -8;
autoname = 0;
- c_tag = "AI - Main Staircase"
+ c_tag = "AI - Main Staircase";
+ dir = 4;
+ pixel_y = -8
},
/obj/effect/step_trigger/clone_cleaner,
/turf/open/floor/almayer/aicore/no_build/ai_silver/west,
@@ -19832,8 +19788,8 @@
pixel_y = 10
},
/obj/structure/machinery/computer/cameras/almayer_brig{
- dir = 4;
desc = "Used to access the various cameras in the security brig.";
+ dir = 4;
name = "brig cameras console";
pixel_y = -11
},
@@ -20216,13 +20172,13 @@
desc = "A large handheld tool used to override various machine functions. Primarily used to pulse Airlock and APC wires on a shortwave frequency. It contains a small data buffer as well. This one is comically oversized. Made in Texas.";
icon_state = "multitool_big";
name = "\improper Oversized Security Access Tuner";
- pixel_y = 11;
- pixel_x = 4
+ pixel_x = 4;
+ pixel_y = 11
},
/obj/item/stack/sheet/cardboard/medium_stack{
- pixel_y = -6;
+ layer = 3.01;
pixel_x = -7;
- layer = 3.01
+ pixel_y = -6
},
/turf/open/floor/almayer,
/area/almayer/squads/alpha_bravo_shared)
@@ -20903,9 +20859,9 @@
"eGr" = (
/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
autoname = 0;
- c_tag = "AI - Records"
+ c_tag = "AI - Records";
+ dir = 8
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -21261,9 +21217,9 @@
/obj/structure/machinery/door_control{
id = "ARES StairsLock";
name = "ARES Exterior Lockdown";
+ pixel_x = 6;
pixel_y = -24;
- req_one_access_txt = "91;92";
- pixel_x = 6
+ req_one_access_txt = "91;92"
},
/obj/structure/surface/table/reinforced/almayer_B{
indestructible = 1;
@@ -21342,10 +21298,10 @@
pixel_x = 1
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
- pixel_y = 2;
autoname = 0;
- c_tag = "AI - Reception Exterior"
+ c_tag = "AI - Reception Exterior";
+ dir = 8;
+ pixel_y = 2
},
/turf/open/floor/almayer/silver/east,
/area/almayer/hallways/upper/midship_hallway)
@@ -22220,8 +22176,8 @@
/area/almayer/medical/containment/cell/cl)
"flf" = (
/obj/structure/pipes/vents/pump/no_boom/gas{
- vent_tag = "Records";
- dir = 1
+ dir = 1;
+ vent_tag = "Records"
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -22237,9 +22193,9 @@
/area/almayer/maint/upper/u_a_p)
"flL" = (
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
autoname = 0;
- c_tag = "AI - SynthBay"
+ c_tag = "AI - SynthBay";
+ dir = 8
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -22950,10 +22906,10 @@
/area/almayer/hallways/lower/repair_bay)
"fCI" = (
/obj/structure/machinery/door/poddoor/shutters/almayer{
+ dir = 4;
id = "ARES JoeCryo";
name = "\improper ARES Synth Bay Shutters";
- plane = -7;
- dir = 4
+ plane = -7
},
/obj/structure/pipes/standard/simple/hidden/supply/no_boom{
dir = 4
@@ -23587,9 +23543,9 @@
/area/almayer/maint/hull/lower/l_f_s)
"fQD" = (
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
autoname = 0;
- c_tag = "AI - Core Chamber"
+ c_tag = "AI - Core Chamber";
+ dir = 8
},
/turf/open/floor/almayer/aicore/glowing/no_build/ai_floor3,
/area/almayer/command/airoom)
@@ -25222,10 +25178,10 @@
"gDh" = (
/obj/structure/machinery/door/airlock/almayer/secure/reinforced{
access_modified = 1;
+ dir = 1;
name = "\improper Security Vault";
req_access = null;
- req_one_access_txt = "91;92";
- dir = 1
+ req_one_access_txt = "91;92"
},
/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown/aicore{
plane = -6
@@ -29230,9 +29186,9 @@
plane = -7
},
/obj/structure/disposalpipe/up/almayer{
+ dir = 2;
id = "ares_vault_in";
- name = "aicore";
- dir = 2
+ name = "aicore"
},
/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown,
/turf/open/floor/almayer/no_build/test_floor4,
@@ -30441,8 +30397,8 @@
},
/obj/structure/machinery/computer/secure_data{
dir = 4;
- pixel_y = 23;
- layer = 2.99
+ layer = 2.99;
+ pixel_y = 23
},
/turf/open/floor/almayer/red/west,
/area/almayer/shipboard/brig/processing)
@@ -31476,15 +31432,15 @@
/obj/structure/surface/table/almayer,
/obj/structure/machinery/computer/secure_data{
dir = 4;
- pixel_y = 19;
- layer = 2.99
+ layer = 2.99;
+ pixel_y = 19
},
/obj/structure/machinery/computer/cameras/almayer_brig{
- dir = 4;
desc = "Used to access the various cameras in the security brig.";
+ dir = 4;
+ layer = 2.99;
name = "brig cameras console";
- pixel_y = 5;
- layer = 2.99
+ pixel_y = 5
},
/turf/open/floor/almayer,
/area/almayer/shipboard/brig/chief_mp_office)
@@ -31928,9 +31884,9 @@
/obj/structure/machinery/door/firedoor/border_only/almayer,
/obj/structure/surface/table/reinforced/almayer_blend,
/obj/item/desk_bell{
+ anchored = 1;
pixel_x = -6;
- pixel_y = 10;
- anchored = 1
+ pixel_y = 10
},
/turf/open/floor/almayer/test_floor4,
/area/almayer/squads/req)
@@ -37050,13 +37006,13 @@
pixel_y = 10
},
/obj/item/stack/cable_coil{
- pixel_y = 1;
- pixel_x = 8
+ pixel_x = 8;
+ pixel_y = 1
},
/obj/item/stack/sheet/cardboard/small_stack{
- pixel_y = 2;
+ layer = 3.01;
pixel_x = -3;
- layer = 3.01
+ pixel_y = 2
},
/turf/open/floor/almayer,
/area/almayer/squads/alpha_bravo_shared)
@@ -38735,9 +38691,9 @@
pixel_x = -32
},
/obj/structure/machinery/light{
+ alpha = 0;
dir = 8;
- pixel_x = -32;
- alpha = 0
+ pixel_x = -32
},
/turf/open/floor/almayer/silver/west,
/area/almayer/command/computerlab)
@@ -39336,8 +39292,8 @@
"mAe" = (
/obj/structure/window/framed/almayer/aicore/hull/black/hijack_bustable,
/obj/structure/machinery/door/poddoor/almayer/blended/ai_lockdown{
- plane = -6;
- dir = 4
+ dir = 4;
+ plane = -6
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -39466,10 +39422,10 @@
"mCx" = (
/obj/structure/machinery/door/airlock/almayer/secure/reinforced{
access_modified = 1;
+ dir = 1;
name = "\improper AI Reception";
req_access = null;
- req_one_access_txt = "91;92";
- dir = 1
+ req_one_access_txt = "91;92"
},
/obj/effect/step_trigger/clone_cleaner,
/obj/structure/machinery/door/poddoor/shutters/almayer{
@@ -40363,10 +40319,10 @@
req_one_access_txt = "90;91;92"
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
- pixel_y = 2;
+ autoname = 0;
c_tag = "AI - Main Corridor";
- autoname = 0
+ dir = 8;
+ pixel_y = 2
},
/turf/open/floor/almayer/aicore/no_build/ai_silver/east,
/area/almayer/command/airoom)
@@ -40668,8 +40624,8 @@
/obj/structure/machinery/door_control{
id = "ARES JoeCryo";
name = "ARES WorkingJoe Bay Shutters";
- req_one_access_txt = "91;92";
- pixel_x = -24
+ pixel_x = -24;
+ req_one_access_txt = "91;92"
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -42029,8 +41985,8 @@
},
/obj/structure/machinery/computer/shuttle/dropship/flight/remote_control{
dir = 4;
- pixel_y = -12;
- name = "Remote dropship navigation computer"
+ name = "Remote dropship navigation computer";
+ pixel_y = -12
},
/turf/open/floor/almayer/redfull,
/area/almayer/living/offices/flight)
@@ -43098,10 +43054,10 @@
/area/almayer/hallways/upper/midship_hallway)
"nZm" = (
/obj/structure/machinery/door_control{
+ access_modified = 1;
id = "OTStore";
name = "Shutters";
pixel_y = 24;
- access_modified = 1;
req_one_access_txt = "35"
},
/obj/effect/decal/warning_stripes{
@@ -43409,8 +43365,8 @@
unslashable = 1
},
/obj/structure/machinery/computer/working_joe{
- layer = 3.3;
dir = 4;
+ layer = 3.3;
pixel_y = 6
},
/turf/open/floor/almayer/aicore/no_build,
@@ -44489,8 +44445,8 @@
/area/almayer/command/cichallway)
"oBD" = (
/obj/structure/pipes/vents/pump/no_boom/gas{
- vent_tag = "Access Hall";
- dir = 8
+ dir = 8;
+ vent_tag = "Access Hall"
},
/turf/open/floor/almayer/aicore/no_build/ai_silver/east,
/area/almayer/command/airoom)
@@ -44689,8 +44645,8 @@
"oEA" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/weapon/gun/shotgun/pump{
- starting_attachment_types = list(/obj/item/attachable/stock/shotgun);
- pixel_y = 9
+ pixel_y = 9;
+ starting_attachment_types = list(/obj/item/attachable/stock/shotgun)
},
/obj/item/stack/sheet/cardboard/small_stack{
layer = 3.01
@@ -45799,8 +45755,8 @@
"pax" = (
/obj/effect/step_trigger/clone_cleaner,
/obj/structure/pipes/vents/pump/no_boom/gas{
- vent_tag = "Reception";
- dir = 8
+ dir = 8;
+ vent_tag = "Reception"
},
/turf/open/floor/almayer/aicore/glowing/no_build/ai_floor3,
/area/almayer/command/airoom)
@@ -46284,8 +46240,8 @@
"pmV" = (
/obj/structure/pipes/standard/simple/hidden/supply/no_boom,
/obj/structure/machinery/computer/tech_control{
- pixel_y = 16;
- density = 0
+ density = 0;
+ pixel_y = 16
},
/turf/open/floor/almayer/no_build/ai_floors,
/area/almayer/command/airoom)
@@ -48477,9 +48433,9 @@
/obj/structure/machinery/door/firedoor/border_only/almayer,
/obj/structure/surface/table/reinforced/almayer_blend/north,
/obj/item/desk_bell{
+ anchored = 1;
pixel_x = -6;
- pixel_y = -8;
- anchored = 1
+ pixel_y = -8
},
/turf/open/floor/almayer/test_floor4,
/area/almayer/squads/req)
@@ -48824,9 +48780,9 @@
/area/almayer/maint/hull/lower/l_f_p)
"qpY" = (
/obj/structure/machinery/cryopod/right{
+ dir = 4;
layer = 3.1;
- pixel_y = 13;
- dir = 4
+ pixel_y = 13
},
/turf/open/floor/almayer/aicore/no_build/ai_cargo,
/area/almayer/command/airoom)
@@ -51696,8 +51652,8 @@
desc = "A pneumatic delivery unit.";
icon_state = "delivery_engi";
name = "Security Vault";
- pixel_y = 28;
- pixel_x = -24
+ pixel_x = -24;
+ pixel_y = 28
},
/obj/structure/disposalpipe/trunk{
dir = 1
@@ -56014,9 +55970,9 @@
/area/almayer/maint/hull/lower/stern)
"tmV" = (
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 8;
autoname = 0;
- c_tag = "AI - SecVault"
+ c_tag = "AI - SecVault";
+ dir = 8
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -56131,9 +56087,9 @@
req_access_txt = "8"
},
/obj/item/desk_bell{
+ anchored = 1;
pixel_x = -6;
- pixel_y = 10;
- anchored = 1
+ pixel_y = 10
},
/obj/structure/machinery/door/firedoor/border_only/almayer,
/turf/open/floor/almayer/sterile_green,
@@ -56771,9 +56727,9 @@
desc = "An outlet for the pneumatic delivery system.";
icon_state = "delivery_outlet";
name = "returns outlet";
+ pixel_x = -7;
pixel_y = 28;
- range = 0;
- pixel_x = -7
+ range = 0
},
/turf/open/floor/almayer/no_build/test_floor4,
/area/almayer/command/airoom)
@@ -56871,9 +56827,9 @@
/area/almayer/hallways/upper/port)
"tCC" = (
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 1;
+ autoname = 0;
c_tag = "AI - Reception Interior";
- autoname = 0
+ dir = 1
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -59887,15 +59843,15 @@
unslashable = 1
},
/obj/item/paper_bin/uscm{
- pixel_y = 6;
- pixel_x = -12
+ pixel_x = -12;
+ pixel_y = 6
},
/obj/item/tool/pen{
pixel_x = -14
},
/obj/structure/machinery/aicore_lockdown{
- pixel_y = 4;
- pixel_x = 3
+ pixel_x = 3;
+ pixel_y = 4
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -60988,13 +60944,13 @@
unslashable = 1
},
/obj/structure/machinery/computer/working_joe{
- layer = 3.3;
- dir = 8
+ dir = 8;
+ layer = 3.3
},
/obj/item/desk_bell/ares{
- pixel_y = 14;
+ anchored = 1;
pixel_x = -5;
- anchored = 1
+ pixel_y = 14
},
/turf/open/floor/almayer/aicore/no_build,
/area/almayer/command/airoom)
@@ -61054,14 +61010,14 @@
"vqI" = (
/obj/structure/surface/table/reinforced/prison,
/obj/item/device/camera_film{
+ layer = 3.03;
pixel_x = 4;
- pixel_y = 1;
- layer = 3.03
+ pixel_y = 1
},
/obj/item/stack/sheet/cardboard/small_stack{
+ layer = 3.02;
pixel_x = -5;
- pixel_y = 3;
- layer = 3.02
+ pixel_y = 3
},
/turf/open/floor/almayer,
/area/almayer/squads/charlie_delta_shared)
@@ -61743,9 +61699,9 @@
layer = 3.3
},
/obj/structure/machinery/camera/autoname/almayer/containment/ares{
- dir = 4;
+ autoname = 0;
c_tag = "AI - Primary Processors";
- autoname = 0
+ dir = 4
},
/turf/open/floor/almayer/aicore/no_build/ai_floor2,
/area/almayer/command/airoom)
@@ -65788,8 +65744,8 @@
"xeU" = (
/obj/structure/machinery/door/airlock/almayer/generic{
name = "\improper Laundry Room";
- req_one_access = list(19,7);
- req_access = list()
+ req_access = list();
+ req_one_access = list(19,7)
},
/turf/open/floor/almayer/test_floor4,
/area/almayer/engineering/laundry)
@@ -66027,8 +65983,8 @@
pixel_y = 27
},
/obj/structure/machinery/computer/cameras/almayer_brig{
- dir = 4;
desc = "Used to access the various cameras in the security brig.";
+ dir = 4;
name = "brig cameras console"
},
/turf/open/floor/almayer/red/west,
@@ -66178,9 +66134,9 @@
},
/obj/structure/machinery/computer/shuttle/dropship/flight/remote_control{
dir = 8;
+ name = "Remote dropship navigation computer";
pixel_y = 12;
- shuttleId = "dropship_alamo";
- name = "Remote dropship navigation computer"
+ shuttleId = "dropship_alamo"
},
/turf/open/floor/almayer/redfull,
/area/almayer/living/offices/flight)
@@ -66597,8 +66553,8 @@
/area/almayer/living/briefing)
"xwU" = (
/obj/structure/pipes/vents/pump/no_boom/gas{
- vent_tag = "Comms";
- dir = 1
+ dir = 1;
+ vent_tag = "Comms"
},
/turf/open/floor/almayer/aicore/no_build/ai_plates,
/area/almayer/command/airoom)
diff --git a/sound/effects/flag_upp_warcry.ogg b/sound/effects/flag_upp_warcry.ogg
new file mode 100644
index 000000000000..589274ffb8e8
Binary files /dev/null and b/sound/effects/flag_upp_warcry.ogg differ
diff --git a/sound/effects/flag_upp_warcry_extra.ogg b/sound/effects/flag_upp_warcry_extra.ogg
new file mode 100644
index 000000000000..5ac6ff51e039
Binary files /dev/null and b/sound/effects/flag_upp_warcry_extra.ogg differ