diff --git a/code/__DEFINES/~~bubber_defines/misc.dm b/code/__DEFINES/~~bubber_defines/misc.dm
index 7888ce0ba80..ee1917dfb59 100644
--- a/code/__DEFINES/~~bubber_defines/misc.dm
+++ b/code/__DEFINES/~~bubber_defines/misc.dm
@@ -7,3 +7,6 @@ GLOBAL_DATUM_INIT(noncapital_i, /regex, regex("\\b\[i]\\b", "g")) */ // TODO: RE
/// Used for the trait for when a dragon looses a portal
#define DRAGON_PORTAL_LOSS "dragon_portal_loss"
+
+/// Crew monitoring console update period. Why is this not a global define, why do I have to define it again
+#define SENSORS_UPDATE_PERIOD (7 SECONDS)
diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm
index 529777de388..efcef7453ff 100644
--- a/code/game/machinery/computer/crew.dm
+++ b/code/game/machinery/computer/crew.dm
@@ -1,5 +1,5 @@
-/// How often the sensor data is updated
-#define SENSORS_UPDATE_PERIOD (10 SECONDS) //How often the sensor data updates.
+/// How often the sensor data is updated // BUBBER EDIT REMOVAL - Defined in code/__DEFINES/~~bubber_defines/misc.dm
+// #define SENSORS_UPDATE_PERIOD (10 SECONDS) //How often the sensor data updates.
/// The job sorting ID associated with otherwise unknown jobs
#define UNKNOWN_JOB_ID 998
@@ -182,7 +182,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
/datum/crewmonitor/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if (!ui)
- ui = new(user, src, "CrewConsoleSkyrat")
+ ui = new(user, src, "CrewConsoleBubbers") // BUBBER EDIT CHANGE - Crew Console
ui.open()
/datum/crewmonitor/proc/show(mob/M, source)
@@ -285,7 +285,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
// Broken sensors show garbage data
if (uniform?.has_sensor == BROKEN_SENSORS) // BUBBER EDIT CHANGE - NANITES - Original: if (uniform.has_sensor == BROKEN_SENSORS)
- entry["life_status"] = rand(0,1)
+ entry["life_status"] = 1 // BUBBER EDIT CHANGE - Original: rand(0,1) - Mob stays in consistent list position when sensors are broken
entry["area"] = pick_list (ION_FILE, "ionarea")
entry["oxydam"] = rand(0,175)
entry["toxdam"] = rand(0,175)
@@ -301,12 +301,13 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
if (sensor_mode >= SENSOR_LIVING)
entry["is_dnr"] = tracked_human.get_dnr()
// Current status
- if(!isprotean(tracked_human))
- entry["life_status"] = tracked_living_mob.stat
+ var/obj/item/organ/brain/protean/protean_brain = tracked_human.get_organ_slot(ORGAN_SLOT_BRAIN)
+ if(istype(protean_brain))
+ if(!isprotean(tracked_human))
+ stack_trace("[tracked_human] brain-species mismatch! Species is [tracked_human.dna.species] but brain is Protean")
+ entry["life_status"] = protean_brain?.dead ? DEAD : tracked_living_mob.stat // If brain not dead/no brain then handling as usual
else
- // Check if protean is stuck in suit
- var/obj/item/organ/brain/protean/brain = tracked_human.get_organ_slot(ORGAN_SLOT_BRAIN)
- entry["life_status"] = brain?.dead ? DEAD : tracked_living_mob.stat // If brain not dead/no brain then handling as usual
+ entry["life_status"] = tracked_living_mob.stat
// BUBBERSTATION EDIT END
// Damage
@@ -346,5 +347,5 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new)
return
AI.ai_tracking_tool.track_name(AI, params["name"])
-#undef SENSORS_UPDATE_PERIOD
+// #undef SENSORS_UPDATE_PERIOD // BUBBER EDIT REMOVAL - Defined in code/__DEFINES/~~bubber_defines/misc.dm
#undef UNKNOWN_JOB_ID
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index 952da44a5a9..679b1709bcc 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -103,18 +103,13 @@ GLOBAL_LIST_INIT(holiday_mail, list())
if(PATTERN_RAINBOW)
var/datum/holiday/pride_week/rainbow_datum = new()
return rainbow_datum.get_holiday_colors(thing_to_color, PATTERN_DEFAULT)
- //if(!length(GLOB.holidays)) // BUBBER EDIT REMOVAL - Pride Flag Colors
- // return // BUBBER EDIT REMOVAL - Pride Flag Colors
+ if(!length(GLOB.holidays))
+ return
for(var/holiday_key in GLOB.holidays)
var/datum/holiday/holiday_real = GLOB.holidays[holiday_key]
if(!holiday_real.holiday_colors)
continue
return holiday_real.get_holiday_colors(thing_to_color, pattern || holiday_real.holiday_pattern)
- // BUBBER EDIT ADDITION BEGIN - Pride Flag Colors
- if(prob(20))
- var/datum/holiday/pride_week/rainbow_datum = new()
- return rainbow_datum.get_holiday_colors(thing_to_color, pattern)
- // BUBBER EDIT ADDITION END - Pride Flag Colors
// The actual holidays
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f663e9e04a8..7865daac43c 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1532,7 +1532,7 @@
return
//Bubber edit BEGIN - Allow for people to get hungry faster
if(HAS_TRAIT(src, TRAIT_FAST_METABOLISM) && change < 0)
- change = change * 2
+ change = change * 1.5
//Bubber edit END
nutrition = max(0, nutrition + change)
diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4328.yml b/html/changelogs/AutoChangeLog-bubber-pr-4328.yml
deleted file mode 100644
index 79d2128674a..00000000000
--- a/html/changelogs/AutoChangeLog-bubber-pr-4328.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "StrangeWeirdKitten"
-delete-after: True
-changes:
- - rscadd: "MODsuit Remote Module that allows you to remotely control other people's modsuits"
\ No newline at end of file
diff --git a/html/changelogs/bubber_archive/2025-08.yml b/html/changelogs/bubber_archive/2025-08.yml
index 4f95e88ada8..5826846cac3 100644
--- a/html/changelogs/bubber_archive/2025-08.yml
+++ b/html/changelogs/bubber_archive/2025-08.yml
@@ -43,3 +43,14 @@
Modular Suit Equipment research.
thegrb93:
- rscadd: Added vox hairstyles, vox braids, vox wise braids, vox flowing
+2025-08-05:
+ LT3:
+ - bugfix: Fixed edge case of Proteans causing crew health monitor to bluescreen
+ - qol: Mobs with broken suit sensors now stay in order each screen update
+ StrangeWeirdKitten:
+ - rscadd: MODsuit Remote Module that allows you to remotely control other people's
+ modsuits
+ lessthnthree:
+ - bugfix: Station tile decal color should be back to normal
+ shayoki:
+ - balance: Vulpkanin hunger drain reduced from 2x -> 1.5x
diff --git a/modular_skyrat/modules/blueshield/code/devices/crew.dm b/modular_skyrat/modules/blueshield/code/devices/crew.dm
index fe15297f8f2..dcb1a02533d 100644
--- a/modular_skyrat/modules/blueshield/code/devices/crew.dm
+++ b/modular_skyrat/modules/blueshield/code/devices/crew.dm
@@ -2,9 +2,6 @@
* Trimmed and modified copy of ".../machinery/computer/crew.dm"
* for the sake of modularity. (Blueshield Monitor Console soon?)
*/
-
-#define SENSORS_UPDATE_PERIOD (10 SECONDS)
-
GLOBAL_DATUM_INIT(blueshield_crewmonitor, /datum/crewmonitor/blueshield, new)
//list of all Command/CC jobs
@@ -129,5 +126,3 @@ GLOBAL_DATUM_INIT(blueshield_crewmonitor, /datum/crewmonitor/blueshield, new)
last_update["[z]"] = world.time
return results
-
-#undef SENSORS_UPDATE_PERIOD
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm
index aebefb33483..bfde745678b 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/vulpkanin.dm
@@ -64,7 +64,7 @@
SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
SPECIES_PERK_ICON = "stomach",
SPECIES_PERK_NAME = "Hunger",
- SPECIES_PERK_DESC = "Vulpkanin will get hungry twice as fast as most species",
+ SPECIES_PERK_DESC = "Vulpkanin will get hungrier 50% faster than most species",
))
return to_add
diff --git a/modular_zubbers/code/game/machinery/computer/crew.dm b/modular_zubbers/code/game/machinery/computer/crew.dm
index 9e6c9b5fed5..e094d5275e9 100644
--- a/modular_zubbers/code/game/machinery/computer/crew.dm
+++ b/modular_zubbers/code/game/machinery/computer/crew.dm
@@ -113,9 +113,3 @@
JOB_TERRAGOV_LIASON = 903
)
-
-/datum/crewmonitor/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if (!ui)
- ui = new(user, src, "CrewConsoleBubbers")
- ui.open()
diff --git a/modular_zubbers/code/game/machinery/crew_monitor.dm b/modular_zubbers/code/game/machinery/crew_monitor.dm
index 6a5fea92e0c..e8d28515515 100644
--- a/modular_zubbers/code/game/machinery/crew_monitor.dm
+++ b/modular_zubbers/code/game/machinery/crew_monitor.dm
@@ -1,4 +1,3 @@
-#define SENSORS_UPDATE_PERIOD 15 SECONDS //Why is this not a global define, why do I have to define it again
#define ALARM_PERIOD 45 SECONDS
/obj/machinery/computer/crew
@@ -51,5 +50,4 @@
return canalarm
-#undef SENSORS_UPDATE_PERIOD
#undef ALARM_PERIOD
diff --git a/tgui/packages/tgui/interfaces/CrewConsoleBubbers.tsx b/tgui/packages/tgui/interfaces/CrewConsoleBubbers.tsx
index 1c12c59181f..23624f0c2dd 100644
--- a/tgui/packages/tgui/interfaces/CrewConsoleBubbers.tsx
+++ b/tgui/packages/tgui/interfaces/CrewConsoleBubbers.tsx
@@ -90,6 +90,15 @@ const areaSort = (a: CrewSensor, b: CrewSensor) => {
return 0;
};
+const getHealthLevel = (healthSum: number): number => {
+ if (healthSum <= 74) return 0;
+ if (healthSum <= 95) return 1;
+ if (healthSum <= 116) return 2;
+ if (healthSum <= 137) return 3;
+ if (healthSum <= 158) return 4;
+ return 5; // over 158 (near crit)
+};
+
const healthToAttribute = (
oxy: number,
tox: number,
@@ -98,7 +107,7 @@ const healthToAttribute = (
attributeList: string[],
) => {
const healthSum = oxy + tox + burn + brute;
- const level = Math.min(Math.max(Math.ceil(healthSum / 25), 0), 5);
+ const level = getHealthLevel(healthSum);
return attributeList[level];
};
diff --git a/tgui/packages/tgui/interfaces/CrewConsoleSkyrat.jsx b/tgui/packages/tgui/interfaces/CrewConsoleSkyrat.jsx
deleted file mode 100644
index 6cb80ecfe2d..00000000000
--- a/tgui/packages/tgui/interfaces/CrewConsoleSkyrat.jsx
+++ /dev/null
@@ -1,202 +0,0 @@
-// THIS IS A SKYRAT UI FILE
-import { sortBy } from 'es-toolkit';
-import { Box, Button, Icon, Section, Table } from 'tgui-core/components';
-
-import { useBackend } from '../backend';
-import { COLORS } from '../constants';
-import { Window } from '../layouts';
-
-const HEALTH_COLOR_BY_LEVEL = [
- '#17d568',
- '#c4cf2d',
- '#e67e22',
- '#ed5100',
- '#e74c3c',
- '#801308',
-];
-
-const STAT_LIVING = 0;
-const STAT_DEAD = 4;
-
-const jobIsHead = (jobId) => jobId % 10 === 0;
-
-const jobToColor = (jobId) => {
- if (jobId === 0) {
- return COLORS.department.captain;
- }
- if (jobId >= 10 && jobId < 20) {
- return COLORS.department.security;
- }
- if (jobId >= 20 && jobId < 30) {
- return COLORS.department.medbay;
- }
- if (jobId >= 30 && jobId < 40) {
- return COLORS.department.science;
- }
- if (jobId >= 40 && jobId < 50) {
- return COLORS.department.engineering;
- }
- if (jobId >= 50 && jobId < 60) {
- return COLORS.department.cargo;
- }
- if (jobId >= 60 && jobId < 80) {
- return COLORS.department.service;
- }
- if (jobId >= 200 && jobId < 240) {
- return COLORS.department.centcom;
- }
- return COLORS.department.other;
-};
-
-const healthToAttribute = (oxy, tox, burn, brute, attributeList) => {
- const healthSum = oxy + tox + burn + brute;
- const level = Math.min(Math.max(Math.ceil(healthSum / 50), 0), 5);
- // 200 Default Health, Sum Divided by 50, 6 Health States
- return attributeList[level];
-};
-
-const HealthStat = (props) => {
- const { type, value } = props;
- return (
-