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