diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 5760dc5a05f..8f6aa7a268f 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -59,6 +59,10 @@ #define GAUNTLET_SEAL_MESSAGE "tighten around your fingers and wrists" #define BOOT_UNSEAL_MESSAGE "relax their grip on your legs" #define BOOT_SEAL_MESSAGE "seal around your feet" +#define GLASSES_UNSEAL_MESSAGE "moves away from your eyes" +#define GLASSES_SEAL_MESSAGE "settle onto your eyes" +#define NECKWEAR_UNSEAL_MESSAGE "looses around your neck" +#define NECKWEAR_SEAL_MESSAGE "tightens around your neck" /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/__DEFINES/research/techweb_nodes.dm b/code/__DEFINES/research/techweb_nodes.dm index 8fcd954e1a6..baf220fda68 100644 --- a/code/__DEFINES/research/techweb_nodes.dm +++ b/code/__DEFINES/research/techweb_nodes.dm @@ -83,6 +83,7 @@ #define TECHWEB_NODE_MOD_ENGI_ADV "mod_engi_adv" #define TECHWEB_NODE_MOD_ENTERTAINMENT "mod_entertainment" #define TECHWEB_NODE_MOD_EQUIP "mod_equip" +#define TECHWEB_NODE_MOD_SERVICE "mod_service" #define TECHWEB_NODE_MOD_EXPERIMENTAL "mod_experimental" #define TECHWEB_NODE_MOD_MEDICAL "mod_medical" #define TECHWEB_NODE_MOD_MEDICAL_ADV "mod_medical_adv" diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index bfebdb155e5..80a88ddb215 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -76,3 +76,35 @@ /obj/item/clothing/shoes/mod/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) + +/obj/item/clothing/glasses/mod + name = "MOD glasses" + desc = "A pair of glasses for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "standard-glasses" + base_icon_state = "glasses" + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + armor_type = /datum/armor/none + equip_sound = null + pickup_sound = null + drop_sound = null + +/obj/item/clothing/glasses/mod/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) + +/obj/item/clothing/neck/mod + name = "MOD tie" + desc = "An tie for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "standard-tie" + base_icon_state = "tie" + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + armor_type = /datum/armor/none + equip_sound = null + pickup_sound = null + drop_sound = null + +/obj/item/clothing/neck/mod/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NO_SPEED_POTION, INNATE_TRAIT) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index fd41c1c7f30..da27123ba92 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -95,6 +95,9 @@ /obj/item/mod/construction/plating/civilian theme = /datum/mod_theme/civilian +/obj/item/mod/construction/plating/portable_suit + theme = /datum/mod_theme/portable_suit + /obj/item/mod/construction/plating/engineering theme = /datum/mod_theme/engineering diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index f26cd106878..383fcc56044 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -232,6 +232,42 @@ acid = 25 wound = 5 +/datum/mod_theme/portable_suit + name = "portable suit" + desc = "A one-piece three-piece suit designed for maximum negotiating power. Provides no meaningful protection." + extended_desc = "The \"secret weapon\" of the Moonrakers Conglomerate, designed for maximum bureaucratic efficiency. \ + While giving practically no protection against any physical threat, the aura of affluence it exudes is said to ward off \ + bear markets." + default_skin = "psuit" + armor_type = /datum/armor/mod_theme_portable_suit + charge_drain = DEFAULT_CHARGE_DRAIN / 2 + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slot_flags = ITEM_SLOT_NECK + slowdown_deployed = 0 + inbuilt_modules = list(/obj/item/mod/module/selfcleaner) + variants = list( + "psuit" = list( + /obj/item/clothing/glasses/mod = list( + UNSEALED_MESSAGE = GLASSES_UNSEAL_MESSAGE, + SEALED_MESSAGE = GLASSES_SEAL_MESSAGE, + ), + /obj/item/clothing/suit/mod = list( + UNSEALED_MESSAGE = CHESTPLATE_UNSEAL_MESSAGE, + SEALED_MESSAGE = CHESTPLATE_SEAL_MESSAGE, + ), + /obj/item/clothing/shoes/mod = list( + CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = BOOT_UNSEAL_MESSAGE, + SEALED_MESSAGE = BOOT_SEAL_MESSAGE, + ), + ), + ) + +/datum/armor/mod_theme_portable_suit + bio = 50 + /datum/mod_theme/engineering name = "engineering" desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 385541f6f67..60c42cb8fc7 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -54,6 +54,16 @@ /obj/item/mod/module/flashlight, ) +/obj/item/mod/control/pre_equipped/portable_suit + theme = /datum/mod_theme/portable_suit + applied_modules = list( + /obj/item/mod/module/paper_dispenser, + /obj/item/mod/module/stamp, + ) + default_pins = list( + /obj/item/mod/module/stamp, + ) + /obj/item/mod/control/pre_equipped/engineering theme = /datum/mod_theme/engineering applied_modules = list( diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index e1169810723..f047cbfce34 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -243,7 +243,7 @@ use_energy_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/paper_dispenser) cooldown_time = 5 SECONDS - required_slots = list(ITEM_SLOT_GLOVES) + required_slots = list(ITEM_SLOT_GLOVES|ITEM_SLOT_NECK) /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. var/num_sheets_dispensed = 0 @@ -286,7 +286,7 @@ device = /obj/item/stamp/mod incompatible_modules = list(/obj/item/mod/module/stamp) cooldown_time = 0.5 SECONDS - required_slots = list(ITEM_SLOT_GLOVES) + required_slots = list(ITEM_SLOT_GLOVES|ITEM_SLOT_NECK) /obj/item/stamp/mod name = "MOD electronic stamp" diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 9ca53939fb2..c40e3552bce 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -109,3 +109,18 @@ var/refill_add = min(volume - reagents.total_volume, 2 * seconds_per_tick) if(refill_add > 0) reagents.add_reagent(/datum/reagent/space_cleaner, refill_add) + +/obj/item/mod/module/selfcleaner + name = "MOD perfumer module" + desc = "A small spray to clean oneself up. Has a pleasant scent." + icon_state = "cleaner" + module_type = MODULE_USABLE + use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/selfcleaner) + cooldown_time = 10 SECONDS + +/obj/item/mod/module/selfcleaner/on_use(mob/activator) + activator.wash(CLEAN_WASH) + drain_power(use_energy_cost) + playsound(activator, 'sound/effects/spray.ogg', 50, FALSE) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 29d2a640701..69989863ea6 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1981,6 +1981,18 @@ ) research_icon_state = "civilian-plating" +/datum/design/mod_plating/portable_suit + name = "MOD Portable Suit Plating" + id = "mod_plating_portable_suit" + build_path = /obj/item/mod/construction/plating/portable_suit + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 1, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT, + ) + research_icon_state = "psuit-plating" + /datum/design/mod_plating/engineering name = "MOD Engineering Plating" id = "mod_plating_engineering" diff --git a/code/modules/research/techweb/nodes/modsuit_nodes.dm b/code/modules/research/techweb/nodes/modsuit_nodes.dm index 63cc115125d..6c33271dc03 100644 --- a/code/modules/research/techweb/nodes/modsuit_nodes.dm +++ b/code/modules/research/techweb/nodes/modsuit_nodes.dm @@ -1,7 +1,7 @@ /datum/techweb_node/mod_suit id = TECHWEB_NODE_MOD_SUIT starting_node = TRUE - display_name = "Modular Suit" + display_name = "Modular Suits" description = "Specialized back mounted power suits with various different modules." prereq_ids = list(TECHWEB_NODE_ROBOTICS) design_ids = list( @@ -26,22 +26,33 @@ prereq_ids = list(TECHWEB_NODE_MOD_SUIT) design_ids = list( "modlink_scryer", - "mod_clamp", "mod_tether", "mod_welding", - "mod_safety", - "mod_mouthhole", "mod_longfall", "mod_thermal_regulator", "mod_sign_radio", - "mod_mister_janitor", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE) +/datum/techweb_node/mod_service + id = TECHWEB_NODE_MOD_SERVICE + display_name = "Civilian Modular Suits" + description = "Civilian MODsuits for dignified living." + prereq_ids = list(TECHWEB_NODE_MOD_SUIT) + design_ids = list( + "mod_clamp", + "mod_safety", + "mod_mouthhole", + "mod_mister_janitor", + "mod_plating_portable_suit" + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS / 2) + announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SERVICE) + /datum/techweb_node/mod_entertainment id = TECHWEB_NODE_MOD_ENTERTAINMENT - display_name = "Entertainment Modular Suit" + display_name = "Entertainment Modular Suits" description = "Powered suits for protection against low-humor environments." prereq_ids = list(TECHWEB_NODE_MOD_SUIT) design_ids = list( @@ -55,7 +66,7 @@ /datum/techweb_node/mod_medical id = TECHWEB_NODE_MOD_MEDICAL - display_name = "Medical Modular Suit" + display_name = "Medical Modular Suits" description = "Medical MODsuits for quick rescue purposes." prereq_ids = list(TECHWEB_NODE_MOD_SUIT, TECHWEB_NODE_CHEM_SYNTHESIS) design_ids = list( @@ -117,7 +128,7 @@ /datum/techweb_node/mod_engi_adv id = TECHWEB_NODE_MOD_ENGI_ADV - display_name = "Advanced Engineering Modular Suit" + display_name = "Advanced Engineering Modular Suits" description = "Advanced Engineering suits, for advanced powered engineers." prereq_ids = list(TECHWEB_NODE_MOD_ENGI) design_ids = list( @@ -137,7 +148,7 @@ /datum/techweb_node/mod_anomaly id = TECHWEB_NODE_MOD_ANOMALY - display_name = "Anomalock Modular Suit" + display_name = "Anomalock Modular Suits" description = "Modules for MODsuits that require anomaly cores to function." prereq_ids = list(TECHWEB_NODE_MOD_ENGI_ADV, TECHWEB_NODE_ANOMALY_RESEARCH) design_ids = list( diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 241a5eafa83..f681d970f9b 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -506,6 +506,7 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) icon_state = "lawdrobe" product_ads = "OBJECTION! Get the rule of law for yourself!" vend_reply = "Thank you for using the LawDrobe!" + extra_price = PAYCHECK_COMMAND * 3 products = list( /obj/item/clothing/accessory/lawyers_badge = 2, /obj/item/clothing/neck/tie = 3, @@ -536,6 +537,9 @@ GLOBAL_VAR_INIT(roaches_deployed, FALSE) /obj/item/storage/box/evidence = 2, /obj/item/reagent_containers/cup/fish_feed = 1, ) + premium = list( + /obj/item/mod/control/pre_equipped/portable_suit = 1, + ) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe payment_department = ACCOUNT_SRV diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index a3c1f8572ea..57139cdfc1b 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -280,12 +280,16 @@ var/part_name = "Undefined" if(istype(part, /obj/item/clothing/head/mod)) part_name = "Helmet" - if(istype(part, /obj/item/clothing/suit/mod)) + else if(istype(part, /obj/item/clothing/suit/mod)) part_name = "Chestplate" - if(istype(part, /obj/item/clothing/gloves/mod)) + else if(istype(part, /obj/item/clothing/gloves/mod)) part_name = "Gloves" - if(istype(part, /obj/item/clothing/shoes/mod)) + else if(istype(part, /obj/item/clothing/shoes/mod)) part_name = "Boots" + else if(istype(part, /obj/item/clothing/glasses/mod)) + part_name = "Glasses" + else if(istype(part, /obj/item/clothing/neck/mod)) + part_name = "Tie" string_list += part_name deployed_parts.set_output(string_list) deployed.set_output(is_deployed) diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi index 9a631a2352e..f7eaab9f9f4 100644 Binary files a/icons/mob/clothing/modsuit/mod_clothing.dmi and b/icons/mob/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi index 160606c790a..7caec6da24a 100644 Binary files a/icons/obj/clothing/modsuit/mod_clothing.dmi and b/icons/obj/clothing/modsuit/mod_clothing.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi index 054fafdc12e..c8f1a2f4960 100644 Binary files a/icons/obj/clothing/modsuit/mod_construction.dmi and b/icons/obj/clothing/modsuit/mod_construction.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index c0a6103d3fe..0cd210d85da 100644 Binary files a/icons/obj/clothing/modsuit/mod_modules.dmi and b/icons/obj/clothing/modsuit/mod_modules.dmi differ