diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 7c082f0b228..66715dbf879 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -836,6 +836,9 @@ GLOBAL_LIST_INIT(layers_to_offset, list(
/// The layer above mutant body parts
#define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1)
+/// We need gloves to layer on top of modsuit chestplates because we need the hole in the suit filled in if the user lacks a limb
+#define MOD_CHESTPLATE_LAYER (GLOVES_LAYER+0.5)
+
/// If gravity must be present to perform action (can't use pens without gravity)
#define NEED_GRAVITY (1<<0)
/// If reading is required to perform action (can't read a book if you are illiterate)
diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm
index 7da28c17a3a..a9a793d8a2f 100644
--- a/code/modules/mod/mod_activation.dm
+++ b/code/modules/mod/mod_activation.dm
@@ -20,13 +20,15 @@
var/obj/item/part = locate(part_reference) in get_parts()
if(!istype(part) || user.incapacitated)
return
- if(active || activating)
- balloon_alert(user, "deactivate the suit first!")
+ if(activating)
+ balloon_alert(user, "currently [active ? "unsealing" : "sealing"]!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return
var/parts_to_check = parts - part
if(part.loc == src)
deploy(user, part)
+ if(active && !delayed_seal_part(part))
+ return
SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user)
for(var/obj/item/checking_part as anything in parts_to_check)
if(checking_part.loc != src)
@@ -34,6 +36,8 @@
choose_deploy(user)
break
else
+ if(active && !delayed_seal_part(part))
+ return
retract(user, part)
SEND_SIGNAL(src, COMSIG_MOD_RETRACTED, user)
for(var/obj/item/checking_part as anything in parts_to_check)
@@ -44,8 +48,8 @@
/// Quickly deploys all parts (or retracts if all are on the wearer)
/obj/item/mod/control/proc/quick_deploy(mob/user)
- if(active || activating)
- balloon_alert(user, "deactivate the suit first!")
+ if(activating)
+ balloon_alert(user, "currently sealing/unsealing!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE
var/deploy = TRUE
@@ -57,7 +61,11 @@
for(var/obj/item/part as anything in get_parts())
if(deploy && part.loc == src)
deploy(null, part)
+ if(active && !delayed_seal_part(part))
+ return
else if(!deploy && part.loc != src)
+ if(active && !delayed_seal_part(part))
+ return
retract(null, part)
wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."),
span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."),
@@ -137,11 +145,6 @@
if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE))
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE
- for(var/obj/item/part as anything in get_parts())
- if(!force_deactivate && part.loc == src)
- balloon_alert(user, "deploy all parts first!")
- playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
- return FALSE
if(locked && !active && !allowed(user) && !force_deactivate)
balloon_alert(user, "access insufficient!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
@@ -166,29 +169,45 @@
activating = TRUE
mod_link.end_call()
to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"]."))
- for(var/obj/item/part as anything in get_parts())
- var/datum/mod_part/part_datum = get_part_datum(part)
- if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE))
- to_chat(wearer, span_notice("[part] [active ? part_datum.unsealed_message : part_datum.sealed_message]."))
- playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- seal_part(part, is_sealed = !active)
+ //deploy the control unit
if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE))
- to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
- if(ai_assistant)
- to_chat(ai_assistant, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai_assistant]\""))
- finish_activation(is_on = !active)
- if(active)
- playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
- if(!malfunctioning)
- wearer.playsound_local(get_turf(src), 'sound/vehicles/mecha/nominal.ogg', 50)
- else
- playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ playsound(src, active ? 'sound/machines/synth/synth_no.ogg' : 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 8000)
+ else
+ activating = FALSE
+ return
+
+ for(var/obj/item/part as anything in get_parts()) //seals/unseals all deployed parts
+ if(part.loc == src)
+ continue
+ delayed_seal_part(part, no_activation = TRUE)
+
+ //finish activation
+ to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer]."))
+ if(ai_assistant)
+ to_chat(ai_assistant, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai_assistant]\""))
+ finish_activation(is_on = !active)
+ if(active)
+ playsound(src, 'sound/machines/synth/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+ if(!malfunctioning)
+ wearer.playsound_local(get_turf(src), 'sound/vehicles/mecha/nominal.ogg', 50)
+ else
+ playsound(src, 'sound/machines/synth/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000)
+
activating = FALSE
SEND_SIGNAL(src, COMSIG_MOD_TOGGLED, user)
return TRUE
+/obj/item/mod/control/proc/delayed_seal_part(obj/item/clothing/part, no_activation = FALSE)
+ . = FALSE
+ var/datum/mod_part/part_datum = get_part_datum(part)
+ if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)), hidden = TRUE))
+ to_chat(wearer, span_notice("[part] [!part_datum.sealed ? part_datum.sealed_message : part_datum.unsealed_message]."))
+ playsound(src, 'sound/vehicles/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
+ seal_part(part, is_sealed = !part_datum.sealed, no_activation = no_activation)
+ return TRUE
+
///Seals or unseals the given part.
-/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed)
+/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed, no_activation = FALSE)
var/datum/mod_part/part_datum = get_part_datum(part)
part_datum.sealed = is_sealed
if(part_datum.sealed)
@@ -211,6 +230,22 @@
wearer.update_obscured_slots(part.visor_flags_inv)
if((part.clothing_flags & (MASKINTERNALS|HEADINTERNALS)) && wearer.invalid_internals())
wearer.cutoff_internals()
+ if(!active || no_activation)
+ return
+ // these only matter during sealing and unsealing while active via deployment
+ if(is_sealed)
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.has_required_parts(list("[part.slot_flags]" = part_datum), need_extended = TRUE))
+ continue
+ module.on_suit_activation()
+ else
+ for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.has_required_parts(list("[part.slot_flags]" = part_datum), need_extended = TRUE))
+ continue
+ module.on_suit_deactivation()
+ if(!module.active || (module.allow_flags & MODULE_ALLOW_INACTIVE))
+ continue
+ module.deactivate(display_message = FALSE)
/// Finishes the suit's activation
/obj/item/mod/control/proc/finish_activation(is_on)
@@ -219,9 +254,13 @@
active = is_on
if(active)
for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.has_required_parts(mod_parts, need_extended = TRUE))
+ continue
module.on_suit_activation()
else
for(var/obj/item/mod/module/module as anything in modules)
+ if(!module.has_required_parts(mod_parts, need_extended = TRUE)) //it probably will runtime if we dont do this
+ continue
module.on_suit_deactivation()
update_speed()
update_appearance(UPDATE_ICON_STATE)
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index df2096ae367..21bf8509d6b 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -219,6 +219,10 @@
/obj/item/mod/control/allow_attack_hand_drop(mob/user)
if(user != wearer)
return ..()
+ if(active)
+ balloon_alert(wearer, "deactivate the suit first!")
+ playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
+ return
for(var/obj/item/part as anything in get_parts())
if(part.loc != src)
balloon_alert(user, "retract parts first!")
@@ -228,6 +232,10 @@
/obj/item/mod/control/mouse_drop_dragged(atom/over_object, mob/user)
if(user != wearer || !istype(over_object, /atom/movable/screen/inventory/hand))
return
+ if(active)
+ balloon_alert(wearer, "deactivate the suit first!")
+ playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE)
+ return
for(var/obj/item/part as anything in get_parts())
if(part.loc != src)
balloon_alert(wearer, "retract parts first!")
@@ -575,7 +583,7 @@
new_module.on_install()
if(wearer)
new_module.on_equip()
- if(active)
+ if(active && new_module.has_required_parts(mod_parts, need_extended = TRUE))
new_module.on_suit_activation()
if(user)
balloon_alert(user, "[new_module] added")
@@ -679,8 +687,6 @@
part.forceMove(src)
return
retract(wearer, part)
- if(active)
- INVOKE_ASYNC(src, PROC_REF(toggle_activate), wearer, TRUE)
/obj/item/mod/control/proc/on_part_destruction(obj/item/part, damage_flag)
SIGNAL_HANDLER
diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm
index 76f9063df0b..664f9118b83 100644
--- a/code/modules/mod/mod_theme.dm
+++ b/code/modules/mod/mod_theme.dm
@@ -62,6 +62,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -203,6 +205,8 @@
SEALED_COVER = HEADCOVERSEYES,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
@@ -266,6 +270,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -334,6 +340,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -406,6 +414,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -480,6 +490,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT,
@@ -512,6 +524,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEBELT,
@@ -588,6 +602,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE,
@@ -660,6 +676,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -693,6 +711,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -773,6 +793,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -845,6 +867,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -912,6 +936,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -979,6 +1005,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1052,6 +1080,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1120,6 +1150,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1195,6 +1227,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1228,6 +1262,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1301,6 +1337,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1376,6 +1414,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_INVISIBILITY = HIDEJUMPSUIT|HIDEMUTWINGS,
CAN_OVERSLOT = TRUE,
@@ -1461,6 +1501,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1531,6 +1573,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL|CASTING_CLOTHES,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1600,6 +1644,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1671,6 +1717,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1739,6 +1787,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1806,6 +1856,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1837,6 +1889,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1919,6 +1973,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -1988,6 +2044,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2052,6 +2110,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2118,6 +2178,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL,
SEALED_CLOTHING = STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
@@ -2183,6 +2245,8 @@
SEALED_MESSAGE = HELMET_SEAL_MESSAGE,
),
/obj/item/clothing/suit/mod = list(
+ UNSEALED_LAYER = MOD_CHESTPLATE_LAYER,
+ SEALED_LAYER = MOD_CHESTPLATE_LAYER,
UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE,
SEALED_INVISIBILITY = HIDEJUMPSUIT,
UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE,
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
index 6065a486d0c..3055d0616f9 100644
--- a/code/modules/mod/modules/_module.dm
+++ b/code/modules/mod/modules/_module.dm
@@ -108,6 +108,16 @@
if(mod.wearer)
balloon_alert(mod.wearer, "not active!")
return
+ if(!has_required_parts(mod.mod_parts, need_extended = TRUE))
+ if(mod.wearer)
+ balloon_alert(mod.wearer, "required parts inactive!")
+ var/list/slot_strings = list()
+ for(var/slot in required_slots)
+ var/list/slot_list = parse_slot_flags(slot)
+ slot_strings += (length(slot_list) == 1 ? "" : "one of ") + english_list(slot_list, and_text = " or ")
+ to_chat(mod.wearer, span_warning("[src] requires these slots to be deployed: [english_list(slot_strings)]"))
+ playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
+ return
if(module_type != MODULE_USABLE)
if(active)
deactivate()
diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi
index aa9b6feca11..071db6ba93c 100644
Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ