diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index e680bb3cc606..f0bcd0be0fbd 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -317,7 +317,7 @@ resistance_flags = FIRE_PROOF|LAVA_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + complexity_max = DEFAULT_MAX_COMPLEXITY - 2 charge_drain = DEFAULT_CHARGE_DRAIN * 2 allowed_suit_storage = list( /obj/item/resonator, @@ -1293,7 +1293,7 @@ post-void war era modular suit to ever be safely utilized by an operator. This ancient clunker is still functional, \ though it's missing several modern-day luxuries from updated Nakamura Engineering designs. \ Primarily, the suit's myoelectric suit layer is entirely non-existant, and the servos do very little to \ - help distribute the weight evenly across the wearer's body, making it slow and bulky to move in. \ + help distribute the weight evenly across the wearer's body when the suit is deactivated, making it slow and bulky to move in. \ The internal heads-up display is rendered in nearly unreadable cyan, as the visor suggests, \ leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool." default_skin = "prototype" @@ -1302,8 +1302,8 @@ siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 5 charge_drain = DEFAULT_CHARGE_DRAIN * 2 - slowdown_inactive = 2 - slowdown_active = 1.5 + slowdown_inactive = 1.5 + slowdown_active = 1 ui_theme = "hackerman" inbuilt_modules = list(/obj/item/mod/module/anomaly_locked/kinesis/prebuilt/prototype) allowed_suit_storage = list( diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index e33472006c4b..3da0067f0eb6 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -106,6 +106,7 @@ /obj/item/mod/module/orebag, /obj/item/mod/module/clamp, /obj/item/mod/module/drill, + /obj/item/mod/module/mouthhole, ) default_pins = list( /obj/item/mod/module/gps, @@ -304,7 +305,7 @@ applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/noslip, - /obj/item/mod/module/status_readout, + /obj/item/mod/module/status_readout/ninja, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/dispenser/ninja, /obj/item/mod/module/dna_lock/reinforced, diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 5f40982e9e90..2b4f9c70f5f0 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -10,7 +10,7 @@ The implant is stored in the module and needs to be injected in a human to function. \ Nakamura Engineering swears up and down there's airbrakes." icon_state = "pathfinder" - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/pathfinder) /// The pathfinding implant. diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index e41b35aa51ee..a609236b02fe 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -85,7 +85,7 @@ these are only capable of working in zero-gravity environments, a blessing to some Engineers." icon_state = "tether" module_type = MODULE_ACTIVE - complexity = 3 + complexity = 2 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/tether) cooldown_time = 1.5 SECONDS diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 5ce86023956a..ea8e4409ee1b 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -38,9 +38,12 @@ /obj/item/mod/module/storage/proc/on_chestplate_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) if(QDELETED(source) || !mod.wearer || newloc == mod.wearer || !mod.wearer.s_store) return - to_chat(mod.wearer, span_notice("[src] tries to store [mod.wearer.s_store] inside itself.")) - if(atom_storage?.attempt_insert(mod.wearer.s_store, mod.wearer, override = TRUE)) - mod.wearer.temporarilyRemoveItemFromInventory(mod.wearer.s_store) + if(!atom_storage?.attempt_insert(mod.wearer.s_store, mod.wearer, override = TRUE)) + balloon_alert(mod.wearer, "storage failed!") + to_chat(mod.wearer, span_warning("[src] fails to store [mod.wearer.s_store] inside itself!")) + return + to_chat(mod.wearer, span_notice("[src] stores [mod.wearer.s_store] inside itself.")) + mod.wearer.temporarilyRemoveItemFromInventory(mod.wearer.s_store) /obj/item/mod/module/storage/large_capacity name = "MOD expanded storage module" @@ -163,6 +166,68 @@ overlay_state_active = "module_jetpackadv_on" full_speed = TRUE +///Status Readout - Puts a lot of information including health, nutrition, fingerprints, temperature to the suit TGUI. +/obj/item/mod/module/status_readout + name = "MOD status readout module" + desc = "A once-common module, this technology unfortunately went out of fashion in the safer regions of space; \ + and found new life in the research networks of the Periphery. This particular unit hooks into the suit's spine, \ + capable of capturing and displaying all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \ + and even useful information such as their overall health and wellness. The vitals monitor also comes with a speaker, loud enough \ + to alert anyone nearby that someone has, in fact, died." + icon_state = "status" + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 + incompatible_modules = list(/obj/item/mod/module/status_readout) + tgui_id = "status_readout" + /// Does this show the round ID and shift time? + var/show_time = FALSE + /// Death sound. May or may not be funny. Vareditable at your own risk. + var/death_sound = 'sound/effects/flatline3.ogg' + /// Death sound volume. Please be responsible with this. + var/death_sound_volume = 50 + +/obj/item/mod/module/status_readout/add_ui_data() + . = ..() + .["show_time"] = show_time + .["statustime"] = station_time_timestamp() + .["statusid"] = GLOB.round_id + .["statushealth"] = mod.wearer?.health || 0 + .["statusmaxhealth"] = mod.wearer?.getMaxHealth() || 0 + .["statusbrute"] = mod.wearer?.getBruteLoss() || 0 + .["statusburn"] = mod.wearer?.getFireLoss() || 0 + .["statustoxin"] = mod.wearer?.getToxLoss() || 0 + .["statusoxy"] = mod.wearer?.getOxyLoss() || 0 + .["statustemp"] = mod.wearer?.bodytemperature || 0 + .["statusnutrition"] = mod.wearer?.nutrition || 0 + .["statusfingerprints"] = mod.wearer ? md5(mod.wearer.dna.unique_identity) : null + .["statusdna"] = mod.wearer?.dna.unique_enzymes + .["statusviruses"] = null + if(!length(mod.wearer?.diseases)) + return . + var/list/viruses = list() + for(var/datum/disease/virus as anything in mod.wearer.diseases) + var/list/virus_data = list() + virus_data["name"] = virus.name + virus_data["type"] = virus.spread_text + virus_data["stage"] = virus.stage + virus_data["maxstage"] = virus.max_stages + virus_data["cure"] = virus.cure_text + viruses += list(virus_data) + .["statusviruses"] = viruses + + return . + +/obj/item/mod/module/status_readout/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_LIVING_DEATH, PROC_REF(death_sound)) + +/obj/item/mod/module/status_readout/on_suit_deactivation(deleting) + UnregisterSignal(mod.wearer, COMSIG_LIVING_DEATH) + +/obj/item/mod/module/status_readout/proc/death_sound(mob/living/carbon/human/wearer) + SIGNAL_HANDLER + if(death_sound && death_sound_volume) + playsound(wearer, death_sound, death_sound_volume, FALSE) + ///Eating Apparatus - Lets the user eat/drink with the suit on. /obj/item/mod/module/mouthhole name = "MOD eating apparatus module" @@ -181,8 +246,8 @@ /obj/item/mod/module/mouthhole/on_install() former_flags = mod.helmet.flags_cover former_visor_flags = mod.helmet.visor_flags_cover - mod.helmet.flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF - mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF + mod.helmet.flags_cover &= ~(HEADCOVERSMOUTH|PEPPERPROOF) + mod.helmet.visor_flags_cover &= ~(HEADCOVERSMOUTH|PEPPERPROOF) /obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) if(deleting) @@ -358,7 +423,7 @@ ensuring they're comfortable; even if they're some that like it hot." icon_state = "regulator" module_type = MODULE_TOGGLE - complexity = 2 + complexity = 1 active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/thermal_regulator) cooldown_time = 0.5 SECONDS @@ -389,7 +454,7 @@ however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." icon_state = "dnalock" module_type = MODULE_USABLE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/dna_lock, /obj/item/mod/module/eradication_lock) cooldown_time = 0.5 SECONDS @@ -472,6 +537,11 @@ incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) overlay_state_inactive = "module_plasma" +/obj/item/mod/module/plasma_stabilizer/generate_worn_overlay() + if(locate(/obj/item/mod/module/infiltrator) in mod.modules) + return list() + return ..() + /obj/item/mod/module/plasma_stabilizer/on_equip() ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION_HEAD_ONLY, MOD_TRAIT) @@ -484,7 +554,7 @@ /obj/item/mod/module/hat_stabilizer name = "MOD hat stabilizer module" desc = "A simple set of deployable stands, directly atop one's head; \ - these will deploy under a select few hats to keep them from falling off, allowing them to be worn atop the sealed helmet. \ + these will deploy under a hat to keep it from falling off, allowing them to be worn atop the sealed helmet. \ You still need to take the hat off your head while the helmet deploys, though. \ This is a must-have for Nanotrasen Captains, enabling them to show off their authoritative hat even while in their MODsuit." icon_state = "hat_holder" @@ -493,36 +563,9 @@ even though it comes inbuilt into the Magnate/Corporate MODS and spawns in maints, I like the idea of stealing them*/ /// Currently "stored" hat. No armor or function will be inherited, ONLY the icon. var/obj/item/clothing/head/attached_hat - /// Whitelist of attachable hats, read note in Initialize() below this line - var/static/list/attachable_hats_list - -/obj/item/mod/module/hat_stabilizer/Initialize(mapload) - . = ..() - attachable_hats_list = typecacheof( - //List of attachable hats. Make sure these and their subtypes are all tested, so they dont appear janky. - //This list should also be gimmicky, so captains can have fun. I.E. the Santahat, Pirate hat, Tophat, Chefhat... - //Yes, I said it, the captain should have fun. - list( - /obj/item/clothing/head/hats/caphat, - /obj/item/clothing/head/costume/crown, - /obj/item/clothing/head/hats/centhat, - /obj/item/clothing/head/hats/centcom_cap, - /obj/item/clothing/head/costume/pirate, - /obj/item/clothing/head/costume/santa, - /obj/item/clothing/head/utility/hardhat/reindeer, - /obj/item/clothing/head/costume/sombrero/green, - /obj/item/clothing/head/costume/kitty, - /obj/item/clothing/head/costume/rabbitears, - /obj/item/clothing/head/costume/festive, - /obj/item/clothing/head/costume/powdered_wig, - /obj/item/clothing/head/costume/weddingveil, - /obj/item/clothing/head/hats/tophat, - /obj/item/clothing/head/costume/nursehat, - /obj/item/clothing/head/utility/chefhat, - /obj/item/clothing/head/costume/papersack, - /obj/item/clothing/head/caphat/beret, - /obj/item/clothing/head/helmet/space/beret, - )) + /// Original cover flags for the MOD helmet, before a hat is placed + var/former_flags + var/former_visor_flags /obj/item/mod/module/hat_stabilizer/on_suit_activation() RegisterSignal(mod.helmet, COMSIG_ATOM_EXAMINE, PROC_REF(add_examine)) @@ -552,14 +595,15 @@ if(!mod.active) balloon_alert(user, "suit must be active!") return - if(!is_type_in_typecache(hitting_item, attachable_hats_list)) - balloon_alert(user, "this hat won't fit!") - return if(attached_hat) balloon_alert(user, "hat already attached!") return if(mod.wearer.transferItemToLoc(hitting_item, src, force = FALSE, silent = TRUE)) attached_hat = hitting_item + former_flags = mod.helmet.flags_cover + former_visor_flags = mod.helmet.visor_flags_cover + mod.helmet.flags_cover |= attached_hat.flags_cover + mod.helmet.visor_flags_cover |= attached_hat.visor_flags_cover balloon_alert(user, "hat attached, right-click to remove") mod.wearer.update_clothing(mod.slot_flags) @@ -579,6 +623,8 @@ else balloon_alert_to_viewers("the hat falls to the floor!") attached_hat = null + mod.helmet.flags_cover = former_flags + mod.helmet.visor_flags_cover = former_visor_flags mod.wearer.update_clothing(mod.slot_flags) ///Sign Language Translator - allows people to sign over comms using the modsuit's gloves. diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 9829321f6400..d3eb905a2068 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -287,6 +287,7 @@ playsound(src, 'sound/effects/curseattack.ogg', 50) mod.wearer.AddElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(check_upstairs)) + RegisterSignal(mod.wearer, COMSIG_MOB_SAY, PROC_REF(on_talk)) ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) check_upstairs() //todo at some point flip your screen around @@ -300,7 +301,7 @@ if(deleting) playsound(src, 'sound/effects/curseattack.ogg', 50) qdel(mod.wearer.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY)) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + UnregisterSignal(mod.wearer, list(COMSIG_MOVABLE_MOVED, COMSIG_MOB_SAY)) step_count = 0 REMOVE_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) var/turf/open/openspace/current_turf = get_turf(mod.wearer) @@ -334,3 +335,7 @@ QDEL_IN(mod.wearer, FLY_TIME) #undef FLY_TIME + +/obj/item/mod/module/atrocinator/proc/on_talk(datum/source, list/speech_args) + SIGNAL_HANDLER + speech_args[SPEECH_SPANS] |= "upside_down" diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 46f698e0d5fb..10d3be3b0f41 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -13,24 +13,30 @@ but it's up to you to do something with it." icon_state = "health" module_type = MODULE_ACTIVE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/health_analyzer) cooldown_time = 0.5 SECONDS tgui_id = "health_analyzer" /// Scanning mode, changes how we scan something. var/mode = HEALTH_SCAN + /// Do we relay the wearer's health data to the info tab? Mainly useful for turning off if you also have a status readout. + var/show_vitals = TRUE /// List of all scanning modes. var/static/list/modes = list(HEALTH_SCAN, WOUND_SCAN, CHEM_SCAN) /obj/item/mod/module/health_analyzer/add_ui_data() . = ..() - .["userhealth"] = mod.wearer?.health || 0 - .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0 - .["userbrute"] = mod.wearer?.getBruteLoss() || 0 - .["userburn"] = mod.wearer?.getFireLoss() || 0 - .["usertoxin"] = mod.wearer?.getToxLoss() || 0 - .["useroxy"] = mod.wearer?.getOxyLoss() || 0 + .["show_vitals"] = show_vitals + if(show_vitals) + .["userhealth"] = mod.wearer?.health || 0 + .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0 + .["userbrute"] = mod.wearer?.getBruteLoss() || 0 + .["userburn"] = mod.wearer?.getFireLoss() || 0 + .["usertoxin"] = mod.wearer?.getToxLoss() || 0 + .["useroxy"] = mod.wearer?.getOxyLoss() || 0 + + return . /obj/item/mod/module/health_analyzer/on_select_use(atom/target) . = ..() @@ -50,11 +56,16 @@ /obj/item/mod/module/health_analyzer/get_configuration() . = ..() .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) + .["show_vitals"] = add_ui_configuration("Self Vitals Display", "bool", show_vitals) + + return . /obj/item/mod/module/health_analyzer/configure_edit(key, value) switch(key) if("mode") mode = value + if("show_vitals") + show_vitals = value #undef HEALTH_SCAN #undef WOUND_SCAN diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index 64613a4bcec8..02bcc706c5ed 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -287,52 +287,24 @@ empulse(src, heavy_range = 4, light_range = 6) drain_power(use_power_cost) -///Status Readout - Puts a lot of information including health, nutrition, fingerprints, temperature to the suit TGUI. -/obj/item/mod/module/status_readout - name = "MOD status readout module" - desc = "A once-common module, this technology went unfortunately out of fashion; \ - and right into the arachnid grip of the Spider Clan. This hooks into the suit's spine, \ - capable of capturing and displaying all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \ - and even useful information such as their overall health and wellness." - icon_state = "status" - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 - incompatible_modules = list(/obj/item/mod/module/status_readout) - tgui_id = "status_readout" - -/obj/item/mod/module/status_readout/add_ui_data() - . = ..() - .["statustime"] = station_time_timestamp() - .["statusid"] = GLOB.round_id - .["statushealth"] = mod.wearer?.health || 0 - .["statusmaxhealth"] = mod.wearer?.getMaxHealth() || 0 - .["statusbrute"] = mod.wearer?.getBruteLoss() || 0 - .["statusburn"] = mod.wearer?.getFireLoss() || 0 - .["statustoxin"] = mod.wearer?.getToxLoss() || 0 - .["statusoxy"] = mod.wearer?.getOxyLoss() || 0 - .["statustemp"] = mod.wearer?.bodytemperature || 0 - .["statusnutrition"] = mod.wearer?.nutrition || 0 - .["statusfingerprints"] = mod.wearer ? md5(mod.wearer.dna.unique_identity) : null - .["statusdna"] = mod.wearer?.dna.unique_enzymes - .["statusviruses"] = null - if(!length(mod.wearer?.diseases)) - return - var/list/viruses = list() - for(var/datum/disease/virus as anything in mod.wearer.diseases) - var/list/virus_data = list() - virus_data["name"] = virus.name - virus_data["type"] = virus.spread_text - virus_data["stage"] = virus.stage - virus_data["maxstage"] = virus.max_stages - virus_data["cure"] = virus.cure_text - viruses += list(virus_data) - .["statusviruses"] = viruses +/// Ninja Status Readout - Like the normal status display (see the base type), but with a clock. +/obj/item/mod/module/status_readout/ninja + name = "MOD Spider Clan status readout module" + desc = "A once-common module, this technology unfortunately went out of fashion in the safer regions of space; \ + and, according to the extra markings on this particular unit's casing, right into the arachnid grip of the Spider Clan. \ + Like other similar units, this one hooks into the suit's spine, and is capable of capturing and displaying \ + all possible biometric data of the wearer; sleep, nutrition, fitness, fingerprints, \ + and even useful information such as their overall health and wellness. This one comes with a clock that calibrates to the \ + local system time, and an operational ID number display. The vital monitor's speaker has been removed." + show_time = TRUE + death_sound = null + death_sound_volume = null ///Energy Net - Ensnares enemies in a net that prevents movement. /obj/item/mod/module/energy_net name = "MOD energy net module" desc = "A custom-built net-thrower. While conventional implementations of this capturing device \ - tilize monomolecular fibers or cutting razorwire, this uses hardlight technology to deploy a \ + utilize monomolecular fibers or cutting razorwire, this uses hardlight technology to deploy a \ trapping field capable of immobilizing even the strongest opponents." icon_state = "energy_net" removable = FALSE diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 8669e7debe8d..d943c2c7d99b 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -364,8 +364,8 @@ Its loud ping is much harder to hide in an indoor station than in the outdoor operations it was designed for." icon_state = "active_sonar" module_type = MODULE_USABLE - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 - complexity = 3 + use_power_cost = DEFAULT_CHARGE_DRAIN * 4 + complexity = 2 incompatible_modules = list(/obj/item/mod/module/active_sonar) cooldown_time = 25 SECONDS diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 061c81313225..5381a26e88bd 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -27,7 +27,7 @@ allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." icon_state = "microwave_beam" module_type = MODULE_ACTIVE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organ_thrower) cooldown_time = 10 SECONDS diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index f5cd29622911..70e57e685b01 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -118,7 +118,7 @@ your drill is surely the one that both pierces and creates the heavens." icon_state = "drill" module_type = MODULE_ACTIVE - complexity = 2 + complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/drill) cooldown_time = 0.5 SECONDS diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index 33ee50a7ed0e..e8656fe92331 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -5,7 +5,7 @@ name = "MOD visor module" desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." module_type = MODULE_TOGGLE - complexity = 2 + complexity = 1 active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/visor) cooldown_time = 0.5 SECONDS diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index ec29ee5f36b0..d6849f41c04e 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1893,6 +1893,19 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL +/datum/design/module/statusreadout + name = "Status Readout Module" + id = "mod_statusreadout" + materials = list( + /datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT * 3, + /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/titanium = SMALL_MATERIAL_AMOUNT * 2, + ) + build_path = /obj/item/mod/module/status_readout + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_MEDICAL + ) + /datum/design/module/patienttransport name = "Patient Transport Module" id = "mod_patienttransport" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 35de515ceee6..feab11b01e32 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1757,6 +1757,7 @@ "mod_defib", "mod_threadripper", "mod_surgicalprocessor", + "mod_statusreadout", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index 5c269e8c7e8d..bffff02e5fbc 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -2,7 +2,7 @@ name = "MOD circuit adapter module" desc = "A module shell that allows a circuit to be inserted into, and interface with, a MODsuit." module_type = MODULE_USABLE - complexity = 3 + complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/circuit) cooldown_time = 0.5 SECONDS diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 6b1a5788e639..a247d3ad9c83 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -172,6 +172,8 @@ h1.alert, h2.alert {color: #000000;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.upside_down {display: inline; -moz-transform: scale(-1, -1); -webkit-transform: scale(-1, -1); -o-transform: scale(-1, -1); -ms-transform: scale(-1, -1); transform: scale(-1, -1);} + //MONKESTATION ADDITION START .brass { color: #BE8700; diff --git a/sound/effects/flatline3.ogg b/sound/effects/flatline3.ogg new file mode 100644 index 000000000000..1430ee7429b8 Binary files /dev/null and b/sound/effects/flatline3.ogg differ diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 0a8bfe7cfd81..031d987925af 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -895,6 +895,15 @@ em { color: #298f85; } +.upside_down { + display: inline; + -moz-transform: scale(-1, -1); + -webkit-transform: scale(-1, -1); + -o-transform: scale(-1, -1); + -ms-transform: scale(-1, -1); + transform: scale(-1, -1); +} + .connectionClosed, .fatalError { background: red; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index edd742a00a78..ba3df2116007 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -925,6 +925,15 @@ h2.alert { color: #298f85; } +.upside_down { + display: inline; + -moz-transform: scale(-1, -1); + -webkit-transform: scale(-1, -1); + -o-transform: scale(-1, -1); + -ms-transform: scale(-1, -1); + transform: scale(-1, -1); +} + .connectionClosed, .fatalError { background: red; diff --git a/tgui/packages/tgui/interfaces/MODsuit.jsx b/tgui/packages/tgui/interfaces/MODsuit.jsx index 488622c830de..97ed019d93a7 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.jsx +++ b/tgui/packages/tgui/interfaces/MODsuit.jsx @@ -132,6 +132,7 @@ const RadCounter = (props) => { const HealthAnalyzer = (props) => { const { active, + show_vitals, userhealth, usermaxhealth, userbrute, @@ -140,79 +141,88 @@ const HealthAnalyzer = (props) => { useroxy, } = props; return ( - <> -
- - - -
- - -
- - - -
-
- -
- - - -
-
- -
- - - -
-
- -
+
+ {show_vitals ? ( + <> +
- +
- - - + + +
+ + + +
+
+ +
+ + + +
+
+ +
+ + + +
+
+ +
+ + + +
+
+
+ + ) : ( +
+ {'Health Analyzer Vitals Readout Disabled In Settings'} +
+ )} +
); }; const StatusReadout = (props) => { const { active, + show_time, statustime, statusid, statushealth, @@ -229,18 +239,20 @@ const StatusReadout = (props) => { } = props; return ( <> - - -
- {active ? statustime : '00:00:00'} -
-
- -
- {active ? statusid || '0' : '???'} -
-
-
+ {!!show_time && ( + + +
+ {active ? statustime : '00:00:00'} +
+
+ +
+ {active ? statusid : '???'} +
+
+
+ )}