A Reasonable Suit Sensor Rebalance (#17607)

* A Reasonable Suit Sensor Rebalance

* discombobulate

* weird ahh

* HAPPY WHEELS

* SQL

* this will work hopefully

* damn me dumb

* please work

* Apply suggestions from code review

* Rename V004_suit_sensors.sql to V004__suit_sensors.sql

* remove sensor lock

* dmdocs + fixes

* Update code/modules/clothing/under/jobs/civilian.dm

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

* Update SQL/migrate-2023/V004__suit_sensors.sql

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

* Update code/modules/clothing/clothing.dm

Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>

* Update code/modules/clothing/clothing.dm

Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>

* Update code/modules/clothing/clothing.dm

Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>

* Update code/modules/clothing/clothing.dm

Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>

* Update code/modules/clothing/clothing.dm

Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>

* changes

---------

Co-authored-by: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>
Co-authored-by: SleepyGemmy <99297919+SleepyGemmy@users.noreply.github.com>
This commit is contained in:
Wowzewow (Wezzy)
2023-12-06 18:41:46 +00:00
committed by GitHub
co-authored by SleepyGemmy Fluffy
parent 5a36bf8231
commit 5ad3c00da2
21 changed files with 257 additions and 114 deletions
+5
View File
@@ -0,0 +1,5 @@
--
-- Implemented in PR #17607.
-- Adds suit sensor prefs.
--
ALTER TABLE `ss13_characters` ADD `sensor_setting` INT(11) DEFAULT NULL AFTER `headset_choice`;
+3
View File
@@ -144,6 +144,9 @@
#define isitem(D) istype(D, /obj/item)
#define islist(D) istype(D, /list)
/// Semantic define for a 0 int intended for use as a bitfield
#define EMPTY_BITFIELD 0
// Insert an object A into a sorted list using cmp_proc (/code/_helpers/cmp.dm) for comparison.
#define ADD_SORTED(list, A, cmp_proc) if(!list.len) {list.Add(A)} else {list.Insert(FindElementIndex(A, list, cmp_proc), A)}
+6
View File
@@ -205,3 +205,9 @@
#define SUIT_SENSOR_BINARY 1
#define SUIT_SENSOR_VITAL 2
#define SUIT_SENSOR_TRACKING 3
#define SUIT_SENSOR_MODES list("Off" = SUIT_SENSOR_OFF, "Binary sensors" = SUIT_SENSOR_BINARY, "Vitals tracker" = SUIT_SENSOR_VITAL, "Tracking beacon" = SUIT_SENSOR_TRACKING)
#define SUIT_NO_SENSORS EMPTY_BITFIELD
#define SUIT_HAS_SENSORS FLAG(0)
#define SUIT_LOCKED_SENSORS FLAG(1)
+4
View File
@@ -409,6 +409,10 @@ SUBSYSTEM_DEF(jobs)
BITSET(H.hud_updateflag, IMPLOYAL_HUD)
BITSET(H.hud_updateflag, SPECIALROLE_HUD)
var/obj/item/clothing/under/uniform = H.w_uniform
if(istype(uniform) && uniform.has_sensor)
uniform.sensor_mode = SUIT_SENSOR_MODES[H.client.prefs.sensor_setting]
INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(show_location_blurb), H.client, 10 SECONDS)
if(spawning_at == "Arrivals Shuttle")
+1 -1
View File
@@ -71,7 +71,7 @@
name = "Chef"
jobtype = /datum/job/chef
uniform = /obj/item/clothing/under/rank/chef/nt
uniform = /obj/item/clothing/under/rank/chef
suit = /obj/item/clothing/suit/chef_jacket/nt
head = /obj/item/clothing/head/chefhat/nt
shoes = /obj/item/clothing/shoes/sneakers/black
@@ -49,7 +49,7 @@
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/storage/box/gloves(src)
new /obj/item/storage/box/mousetraps(src)
new /obj/item/clothing/under/rank/chef/nt(src)
new /obj/item/clothing/under/rank/chef(src)
new /obj/item/clothing/under/rank/chef/idris(src)
new /obj/item/clothing/head/chefhat/nt(src)
new /obj/item/clothing/head/chefhat/idris(src)
@@ -16,6 +16,7 @@
S["pda_choice"] >> pref.pda_choice
S["headset_choice"] >> pref.headset_choice
S["primary_radio_slot"] >> pref.primary_radio_slot
S["sensor_setting"] >> pref.sensor_setting
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["all_underwear"] << pref.all_underwear
@@ -27,6 +28,7 @@
S["pda_choice"] << pref.pda_choice
S["headset_choice"] << pref.headset_choice
S["primary_radio_slot"] << pref.primary_radio_slot
S["sensor_setting"] << pref.sensor_setting
/datum/category_item/player_setup_item/general/equipment/gather_load_query()
return list(
@@ -40,7 +42,8 @@
"backbag_strap",
"pda_choice",
"headset_choice",
"primary_radio_slot"
"primary_radio_slot",
"sensor_setting"
),
"args" = list("id")
)
@@ -61,6 +64,7 @@
"pda_choice",
"headset_choice",
"primary_radio_slot",
"sensor_setting",
"id" = 1,
"ckey" = 1
)
@@ -77,6 +81,7 @@
"pda_choice" = pref.pda_choice,
"headset_choice" = pref.headset_choice,
"primary_radio_slot" = pref.primary_radio_slot,
"sensor_setting" = pref.sensor_setting,
"id" = pref.current_character,
"ckey" = PREF_CLIENT_CKEY
)
@@ -137,6 +142,7 @@
pref.headset_choice = sanitize_integer(pref.headset_choice, 1, headsetlist.len, initial(pref.headset_choice))
if(!(pref.primary_radio_slot in primary_radio_slot_choice))
pref.primary_radio_slot = primary_radio_slot_choice[1]
pref.sensor_setting = sanitize_inlist(pref.sensor_setting, SUIT_SENSOR_MODES, get_key_by_index(SUIT_SENSOR_MODES, 0))
/datum/category_item/player_setup_item/general/equipment/content(var/mob/user)
. = list()
@@ -160,6 +166,7 @@
. += "PDA Type: <a href='?src=\ref[src];change_pda=1'><b>[pdalist[pref.pda_choice]]</b></a><br>"
. += "Headset Type: <a href='?src=\ref[src];change_headset=1'><b>[headsetlist[pref.headset_choice]]</b></a><br>"
. += "Primary Radio Slot: <a href='?src=\ref[src];change_radio_slot=1'><b>[pref.primary_radio_slot]</b></a><br>"
. += "Suit Sensor Setting: <a href='?src=\ref[src];change_sensor_setting=1'><b>[pref.sensor_setting]</b></a><br/>"
return jointext(., null)
@@ -217,11 +224,17 @@
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["change_radio_slot"])
var/new_slot = tgui_input_list(user, "Choose which radio will be spoken into first if multiple slots are occupied.", "Charcter Preference", primary_radio_slot_choice, pref.primary_radio_slot)
var/new_slot = tgui_input_list(user, "Choose which radio will be spoken into first if multiple slots are occupied.", "Character Preference", primary_radio_slot_choice, pref.primary_radio_slot)
if(!isnull(new_slot) && CanUseTopic(user))
pref.primary_radio_slot = new_slot
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["change_sensor_setting"])
var/new_sensor = tgui_input_list(user, "Select a sensor mode.", "Character Preference", SUIT_SENSOR_MODES, pref.sensor_setting)
if(!isnull(new_sensor) && CanUseTopic(user))
pref.sensor_setting = new_sensor
return TOPIC_REFRESH_UPDATE_PREVIEW
else if(href_list["change_underwear"])
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[href_list["change_underwear"]]
if(!UWC)
@@ -196,7 +196,7 @@
/datum/category_group/player_setup_category/proc/content(var/mob/user)
. = "<table style='width:100%'><tr style='vertical-align:top'><td style='width:50%'>"
var/current = 0
var/halfway = items.len / 2
var/halfway = items.len / 2.5
for(var/datum/category_item/player_setup_item/PI in items)
if(halfway && current++ >= halfway)
halfway = 0
+2
View File
@@ -53,6 +53,8 @@ var/list/preferences_datums = list()
var/pda_choice = OUTFIT_TAB_PDA
var/headset_choice = OUTFIT_HEADSET
var/primary_radio_slot = "Left Ear"
///Suit sensors setting in the loadout.
var/sensor_setting
var/h_style = "Bedhead 2" //Hair type
var/tail_style = null
var/hair_colour = "#000000" //Hair colour hex value, for SQL loading
+70 -66
View File
@@ -1055,26 +1055,32 @@
armor = null
w_class = ITEMSIZE_NORMAL
equip_sound = 'sound/items/equip/jumpsuit.ogg'
var/has_sensor = 1 //For the crew computer 2 = unable to change mode
var/sensor_mode = 0
/*
1 = Report living/dead
2 = Report detailed damages
3 = Report location
*/
///SUIT_NO_SENSORS = No sensors, SUIT_HAS_SENSORS = Sensors, SUIT_LOCKED_SENSORS = Locked sensors
var/has_sensor = SUIT_NO_SENSORS
///SUIT_SENSOR_OFF = Off, SUIT_SENSOR_BINARY = Report living/dead, SUIT_SENSOR_VITAL = Report detailed damages, SUIT_SENSOR_TRACKING = Report location
var/sensor_mode = SUIT_SENSOR_OFF
var/displays_id = 1
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/initial_icon_override //If set, rolling up sleeves/rolling down will use this icon state instead of initial().
///0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_down = -1
///0 = unrolled, 1 = rolled, -1 = cannot be toggled
var/rolled_sleeves = -1
///If set, rolling up sleeves/rolling down will use this icon state instead of initial().
var/initial_icon_override
species_restricted = list("exclude",BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM,BODYTYPE_GOLEM, BODYTYPE_TESLA_BODY)
//convenience var for defining the icon state for the overlay used when the clothing is worn.
//Also used by rolling/unrolling.
///Convenience var for defining the icon state for the overlay used when the clothing is worn. Also used by rolling/unrolling.
var/worn_state = null
valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_UTILITY_MINOR, ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_GENERIC, ACCESSORY_SLOT_CAPE)
restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY)
/obj/item/clothing/under/attack_hand(var/mob/user)
if(LAZYLEN(accessories))
..()
@@ -1084,6 +1090,8 @@
/obj/item/clothing/under/Initialize()
. = ..()
if(has_sensor)
src.verbs += /obj/item/clothing/under/proc/toggle
if(worn_state)
LAZYINITLIST(item_state_slots)
item_state_slots[slot_w_uniform_str] = worn_state
@@ -1198,61 +1206,64 @@
/obj/item/clothing/under/examine(mob/user, distance, is_adjacent)
. = ..()
switch(src.sensor_mode)
if(0)
to_chat(user, "Its sensors appear to be disabled.")
if(1)
to_chat(user, "Its binary life sensors appear to be enabled.")
if(2)
to_chat(user, "Its vital tracker appears to be enabled.")
if(3)
to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.")
if(has_sensor)
switch(src.sensor_mode)
if(SUIT_SENSOR_OFF)
to_chat(user, "Its sensors appear to be disabled.")
if(SUIT_SENSOR_BINARY)
to_chat(user, "Its binary life sensors appear to be enabled.")
if(SUIT_SENSOR_VITAL)
to_chat(user, "Its vitals tracker appears to be enabled.")
if(SUIT_SENSOR_TRACKING)
to_chat(user, "Its vitals tracker and tracking beacon appear to be enabled.")
/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
var/mob/M = usr
if(M.stat || M.paralysis || M.stunned || M.weakened || M.restrained())
to_chat(usr, "You cannot reach your suit sensors like this...")
/obj/item/clothing/under/proc/set_sensors(mob/user as mob)
var/mob/M = user
if (isobserver(M) || user.incapacitated())
return
if(has_sensor >= 2)
to_chat(usr, "The controls are locked.")
if(has_sensor >= SUIT_LOCKED_SENSORS)
to_chat(user, "The controls are locked.")
return 0
if(has_sensor <= 0)
to_chat(usr, "This suit does not have any sensors.")
if(has_sensor <= SUIT_NO_SENSORS)
to_chat(user, "This suit does not have any sensors.")
return 0
var/list/modes = list("Off", "Binary sensors", "Vitals tracker", "Tracking beacon")
var/switchMode = tgui_input_list(usr, "Select a sensor mode.", "Suit Sensor Mode", modes)
if(get_dist(usr, src) > 1)
to_chat(usr, "You have moved too far away.")
var/switchMode = tgui_input_list(user, "Select a sensor mode.", "Suit Sensor Mode", SUIT_SENSOR_MODES)
if(get_dist(user, src) > 1)
to_chat(user, "You have moved too far away.")
return
sensor_mode = modes.Find(switchMode) - 1
sensor_mode = SUIT_SENSOR_MODES[switchMode]
if (src.loc == usr)
if (src.loc == user)
switch(sensor_mode)
if(0)
to_chat(usr, "You disable your suit's remote sensing equipment.")
if(1)
to_chat(usr, "Your suit will now report whether you are live or dead.")
if(2)
to_chat(usr, "Your suit will now report your vital lifesigns.")
if(3)
to_chat(usr, "Your suit will now report your vital lifesigns as well as your coordinate position.")
else if (istype(src.loc, /mob))
switch(sensor_mode)
if(0)
for(var/mob/V in viewers(usr, 1))
V.show_message(SPAN_WARNING("[usr] disables [src.loc]'s remote sensing equipment."), 1)
if(1)
for(var/mob/V in viewers(usr, 1))
V.show_message("[usr] turns [src.loc]'s remote sensors to binary.", 1)
if(2)
for(var/mob/V in viewers(usr, 1))
V.show_message("[usr] sets [src.loc]'s sensors to track vitals.", 1)
if(3)
for(var/mob/V in viewers(usr, 1))
V.show_message("[usr] sets [src.loc]'s sensors to maximum.", 1)
if(SUIT_SENSOR_OFF)
user.visible_message("[user] adjusts the tracking sensor on [get_pronoun("him")] [src.name].", "You disable your suit's remote sensing equipment.")
if(SUIT_SENSOR_BINARY)
user.visible_message("[user] adjusts the tracking sensor on [get_pronoun("him")] [src.name].", "Your suit will now report your pulse.")
if(SUIT_SENSOR_VITAL)
user.visible_message("[user] adjusts the tracking sensor on [get_pronoun("him")] [src.name].", "Your suit will now report your pulse and vital lifesigns.")
if(SUIT_SENSOR_TRACKING)
user.visible_message("[user] adjusts the tracking sensor on [get_pronoun("him")] [src.name].", "Your suit will now report your pulse, vital lifesigns, and your coordinate position.")
else if (ismob(src.loc))
if(sensor_mode == SUIT_SENSOR_OFF)
user.visible_message(SPAN_WARNING("[user] disables [src.loc]'s remote sensing equipment."), "You disable [src.loc]'s remote sensing equipment.")
else
user.visible_message("[user] adjusts the tracking sensor on [src.loc]'s [src.name].", "You adjust [src.loc]'s sensors.")
else
user.visible_message("[user] adjusts the tracking sensor on [src]", "You adjust the sensor on [src].")
/obj/item/clothing/under/verb/toggle()
/obj/item/clothing/under/emp_act(severity)
..()
var/new_mode
switch(severity)
if (2)
new_mode = pick(75;SUIT_SENSOR_OFF, 15;SUIT_SENSOR_BINARY, 10;SUIT_SENSOR_VITAL)
if (1)
new_mode = pick(50;SUIT_SENSOR_OFF, 25;SUIT_SENSOR_BINARY, 20;SUIT_SENSOR_VITAL, 5;SUIT_SENSOR_TRACKING)
sensor_mode = new_mode
/obj/item/clothing/under/proc/toggle()
set name = "Toggle Suit Sensors"
set category = "Object"
set src in usr
@@ -1342,16 +1353,9 @@
to_chat(user, SPAN_NOTICE("You roll down \the [src]'s sleeves."))
update_clothing_icon()
/obj/item/clothing/under/rank/Initialize()
sensor_mode = pick(0,1,2,3)
. = ..()
/obj/item/clothing/under/clothing_class()
return "uniform"
/obj/item/clothing/under/AltClick(var/mob/user)
set_sensors(user)
//Rings
/obj/item/clothing/ring
+4 -1
View File
@@ -36,6 +36,7 @@
icon_state = "uniform"
item_state = "uniform"
worn_state = "uniform"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
var/is_open = FALSE
@@ -69,6 +70,7 @@
icon_state = "uniform_fem"
item_state = "uniform_fem"
worn_state = "uniform_fem"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
var/is_open = FALSE
@@ -194,6 +196,7 @@
icon_state = "uniform"
item_state = "uniform"
worn_state = "uniform"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/suit/captunic
@@ -228,5 +231,5 @@
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "captain"
item_state = "captain"
contained_sprite = TRUE
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
+2 -2
View File
@@ -20,8 +20,8 @@
desc = "It's standardised prisoner-wear. Its suit sensors are stuck in the \"Fully On\" position."
icon_state = "orange"
item_state = "orange"
has_sensor = 2
sensor_mode = 3
has_sensor = SUIT_LOCKED_SENSORS
sensor_mode = SUIT_SENSOR_TRACKING
var/id
/obj/item/clothing/under/color/orange/cell1
+31 -21
View File
@@ -3,8 +3,10 @@
/obj/item/clothing/under/rank/bartender
name = "bartender's uniform"
desc = "It looks like it could use some more flair."
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
icon_state = "nt_bartender"
item_state = "nt_bartender"
@@ -17,28 +19,23 @@
item_state = "orion_bartender"
/obj/item/clothing/under/rank/chaplain
desc = "It's a black jumpsuit, often worn by religious folk."
name = "chaplain's jumpsuit"
desc = "It's a black jumpsuit, often worn by religious folk."
has_sensor = SUIT_HAS_SENSORS
icon_state = "chaplain"
item_state = "bl_suit"
worn_state = "chapblack"
/obj/item/clothing/under/rank/chef
desc = "It's an apron which is given only to the most <b>hardcore</b> chefs in space."
name = "chef's uniform"
icon_state = "chef"
item_state = "w_suit"
worn_state = "chef"
/obj/item/clothing/under/rank/chef/nt
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
desc = "It's an apron which is given only to the most <b>hardcore</b> chefs in space."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
icon_state = "nt_chef"
item_state = "nt_chef"
/obj/item/clothing/under/rank/chef/idris
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
contained_sprite = TRUE
icon_state = "idris_chef"
item_state = "idris_chef"
@@ -49,8 +46,9 @@
item_state = "orion_chef"
/obj/item/clothing/under/rank/hydroponics
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
name = "botanist's jumpsuit"
desc = "It's a jumpsuit designed to protect against minor plant-related hazards."
has_sensor = SUIT_HAS_SENSORS
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
icon_state = "nt_gardener"
item_state = "nt_gardener"
@@ -70,10 +68,11 @@
/obj/item/clothing/under/rank/liaison
name = "corporate liaison uniform"
desc = "The plain, professional attire of a corporate liaison. The collar is <i>immaculately</i> starched."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
icon_state = "nt_liaison"
item_state = "nt_liaison"
contained_sprite = TRUE
/obj/item/clothing/under/rank/liaison/zeng
icon_state = "zeng_liaison"
@@ -101,12 +100,13 @@
// Janitor
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
icon_state = "nt_janitor"
item_state = "nt_janitor"
contained_sprite = TRUE
armor = list(
bio = ARMOR_BIO_MINOR
)
@@ -150,6 +150,7 @@
/obj/item/clothing/under/librarian
name = "sensible suit"
desc = "It's very... sensible."
has_sensor = SUIT_HAS_SENSORS
icon = 'icons/obj/item/clothing/department_uniforms/service.dmi'
contained_sprite = TRUE
icon_state = "nt_librarian"
@@ -166,10 +167,11 @@
// Miner
/obj/item/clothing/under/rank/miner
desc = "It's a snappy miner's jumpsuit, complete with overalls and caked-on dirt."
name = "miner's jumpsuit"
icon = 'icons/obj/item/clothing/department_uniforms/operations.dmi'
desc = "It's a snappy miner's jumpsuit, complete with overalls and caked-on dirt."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/operations.dmi'
icon_state = "nt_miner"
item_state = "nt_miner"
@@ -184,18 +186,20 @@
/obj/item/clothing/under/rank/operations_manager
name = "operations manager's jumpsuit"
desc = "A uniform worn by the operations manager. It has the SCC insignia on it."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "operations_manager"
item_state = "operations_manager"
contained_sprite = TRUE
/obj/item/clothing/under/rank/hangar_technician
name = "hangar technician's jumpsuit"
desc = "The future of hangar tech apparel: long, stuffy slacks. We never said it was a bright future."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/operations.dmi'
icon_state = "nt_tech"
item_state = "nt_tech"
contained_sprite = TRUE
/obj/item/clothing/under/rank/hangar_technician/heph
icon_state = "heph_tech"
@@ -208,6 +212,8 @@
/obj/item/clothing/under/rank/bridge_crew
name = "bridge crew's jumpsuit"
desc = "The uniform worn by the SCC's bridge crew."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "bridge_crew"
item_state = "bridge_crew"
@@ -218,6 +224,7 @@
desc = "The uniform worn by the SCC's bridge crew, featuring a skirt."
icon_state = "bridge_crew_alt"
item_state = "bridge_crew_alt"
/obj/item/clothing/under/rank/bridge_crew/alt/white
icon_state = "bridge_crew_alt_white"
item_state = "bridge_crew_alt_white"
@@ -241,16 +248,18 @@
/obj/item/clothing/under/rank/xo
name = "executive officer's jumpsuit"
desc = "The uniform worn by the SCC's executive officers."
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "executive_officer"
item_state = "executive_officer"
contained_sprite = TRUE
/obj/item/clothing/under/rank/machinist
name = "machinist's jumpsuit"
desc = "A practical uniform designed for industrial work."
icon = 'icons/obj/item/clothing/department_uniforms/operations.dmi'
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
icon = 'icons/obj/item/clothing/department_uniforms/operations.dmi'
icon_state = "nt_machinist"
item_state = "nt_machinist"
@@ -265,6 +274,7 @@
/obj/item/clothing/under/rank/captain/hephaestus
name = "hephaestus captain's jumpsuit"
desc = "It's a green-and-orange jumpsuit with some gold markings denoting the rank of \"Captain\" used by Hephaestus Industries."
has_sensor = SUIT_NO_SENSORS
icon = 'icons/clothing/under/uniforms/cyclops_uniforms.dmi'
icon_state = "heph_captain"
item_state = "heph_captain"
@@ -5,6 +5,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "chief_engineer"
item_state = "chief_engineer"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
armor = list(
rad = ARMOR_RAD_MINOR
@@ -17,6 +18,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/engineering.dmi'
icon_state = "nt_atmos"
item_state = "nt_atmos"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
siemens_coefficient = 0.75
@@ -34,6 +36,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/engineering.dmi'
icon_state = "nt_engineer"
item_state = "nt_engineer"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
armor = list(
rad = ARMOR_RAD_MINOR
@@ -7,6 +7,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "research_director"
item_state = "research_director"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
armor = list(
bio = ARMOR_BIO_MINOR
@@ -23,6 +24,7 @@
armor = list(
bio = ARMOR_BIO_MINOR
)
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/rank/scientist/zeng
@@ -107,6 +109,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "chief_medical_officer"
item_state = "chief_medical_officer"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
permeability_coefficient = 0.50
armor = list(
@@ -119,6 +122,7 @@
icon = 'icons/clothing/under/uniforms/iac_uniform.dmi'
icon_state = "iac"
item_state = "iac"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
permeability_coefficient = 0.50
armor = list(
@@ -133,6 +137,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/medical.dmi'
icon_state = "nt_phys"
item_state = "nt_phys"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
permeability_coefficient = 0.50
armor = list(
@@ -211,6 +216,7 @@
desc = "It's made of a special fiber that provides minor protection against biohazards. Specially fitted to ensure surgical precision."
icon_state = "nt_surgeon"
item_state = "nt_surgeon"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/rank/medical/surgeon/zeng
@@ -19,6 +19,7 @@
melee = ARMOR_MELEE_SMALL
)
siemens_coefficient = 0.75
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/rank/security/zavod
@@ -83,6 +84,7 @@
melee = ARMOR_MELEE_SMALL
)
siemens_coefficient = 0.75
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/rank/cadet/zavod
@@ -106,6 +108,7 @@
icon = 'icons/clothing/under/uniforms/cyclops_uniforms.dmi'
icon_state = "heph_security"
item_state = "heph_security"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/rank/warden
@@ -118,6 +121,7 @@
melee = ARMOR_MELEE_SMALL
)
siemens_coefficient = 0.75
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/rank/warden/remote
@@ -158,6 +162,7 @@
melee = ARMOR_MELEE_SMALL
)
siemens_coefficient = 0.75
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
/obj/item/clothing/under/det/zavod
@@ -200,6 +205,7 @@
icon = 'icons/obj/item/clothing/department_uniforms/command.dmi'
icon_state = "head_of_security"
item_state = "head_of_security"
has_sensor = SUIT_HAS_SENSORS
contained_sprite = TRUE
armor = list(
melee = ARMOR_MELEE_SMALL
+2 -2
View File
@@ -500,8 +500,8 @@
desc = "A loose pieces of clothing, commonly worn by medical patients."
icon_state = "medicalgown"
item_state = "medicalgown"
has_sensor = 2
sensor_mode = 3
has_sensor = SUIT_LOCKED_SENSORS
sensor_mode = SUIT_SENSOR_TRACKING
/obj/item/clothing/under/medical_gown/white
icon_state = "whitemedicalgown"
+1 -1
View File
@@ -20,7 +20,7 @@
item_state = "bl_suit"
worn_state = "tactifool"
siemens_coefficient = 1
has_sensor = 1
has_sensor = SUIT_HAS_SENSORS
armor = null
/obj/item/clothing/under/syndicate/tracksuit
@@ -9,10 +9,10 @@
requires_ntnet = TRUE
network_destination = "crew lifesigns monitoring system"
size = 11
usage_flags = PROGRAM_ALL_REGULAR | PROGRAM_STATIONBOUND
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_STATIONBOUND
color = LIGHT_COLOR_CYAN
tgui_id = "SuitSensors"
tgui_theme = "zenghu"
tgui_theme = "nanotrasen"
/datum/computer_file/program/suit_sensors/ui_data(mob/user)
var/list/data = list()
@@ -29,6 +29,8 @@
for(var/z_level in current_map.map_levels)
data["crewmembers"] += crew_repository.health_data(z_level)
data["security_level"] = seclevel2num(get_security_level())
return data
/datum/computer_file/program/suit_sensors/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
@@ -0,0 +1,45 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
# balance
# admin
# backend
# security
# refactor
#################################
# Your name.
author: Wowzewow (Wezzy)
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- balance: "Suit sensors are now tiered based on alert level."
- balance: "Suit sensors are now only installed on job uniforms."
- balance: "Suit sensors are no longer able to be installed on PDAs and Tablets."
- rscadd: "You are now able to set your suit sensors on the character creation menu."
- bugfix: "Fixes the weird imbalance with the character creation menu."
+45 -14
View File
@@ -6,6 +6,7 @@ import { NtosWindow } from '../layouts';
export type SensorsData = {
crewmembers: CrewMember[];
isAI: BooleanLike;
security_level: number;
};
type CrewMember = {
@@ -37,7 +38,7 @@ export const SuitSensors = (props, context) => {
<Table>
<Table.Row header>
<Table.Cell>Name</Table.Cell>
<Table.Cell>Pulse or Charge</Table.Cell>
<Table.Cell>Pulse/Charge</Table.Cell>
<Table.Cell>Blood Pressure</Table.Cell>
<Table.Cell>Blood Oxygenation</Table.Cell>
<Table.Cell>Temperature</Table.Cell>
@@ -48,27 +49,57 @@ export const SuitSensors = (props, context) => {
<Table.Row key={crewmember.name}>
<Table.Cell>{crewmember.name}</Table.Cell>
{crewmember.cellCharge === -1 ? (
<Table.Cell color={getPulseClass(crewmember.tpulse)}>
{crewmember.pulse} BPM
<Table.Cell
color={
crewmember.stype > 0 && data.security_level > 1
? getPulseClass(crewmember.tpulse)
: ''
}>
{crewmember.stype > 0 && data.security_level > 1
? crewmember.pulse + ' BPM'
: 'N/A'}
</Table.Cell>
) : (
<Table.Cell color={getChargeClass(crewmember.cellCharge)}>
{Math.round(crewmember.cellCharge)}%
<Table.Cell
color={
crewmember.stype > 0 && data.security_level > 1
? getChargeClass(crewmember.cellCharge)
: ''
}>
{crewmember.stype > 0 && data.security_level > 1
? Math.round(crewmember.cellCharge) + '%'
: 'N/A'}
</Table.Cell>
)}
<Table.Cell color={getPressureClass(crewmember.tpressure)}>
{crewmember.stype > 1 ? crewmember.pressure : 'N/A'}
<Table.Cell
color={
crewmember.stype > 1 && data.security_level > 1
? getPressureClass(crewmember.tpressure)
: ''
}>
{crewmember.stype > 1 && data.security_level > 1
? crewmember.pressure
: 'N/A'}
</Table.Cell>
<Table.Cell color={getOxyClass(crewmember.oxyg)}>
{toOxyLabel(crewmember.oxyg)}
</Table.Cell>
<Table.Cell>
{crewmember.stype > 1
? Math.round(crewmember.bodytemp * 10) / 10 + 'C'
<Table.Cell
color={
crewmember.stype > 1 && data.security_level > 1
? getOxyClass(crewmember.oxyg)
: ''
}>
{crewmember.stype > 1 && data.security_level > 1
? toOxyLabel(crewmember.oxyg)
: 'N/A'}
</Table.Cell>
<Table.Cell>
{crewmember.stype > 2
{crewmember.stype > 1 && data.security_level > 1
? Math.round(crewmember.bodytemp * 10) / 10 + 'C'
: 'N/A'}
</Table.Cell>
<Table.Cell>
{crewmember.stype > 2 && data.security_level > 2
? crewmember.area +
' (' +
crewmember.x +