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 : '???'}
+
+
+
+ )}