mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-22 12:29:46 +01:00
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:
co-authored by
SleepyGemmy
Fluffy
parent
5a36bf8231
commit
5ad3c00da2
@@ -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`;
|
||||
@@ -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)}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
@@ -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 +
|
||||
|
||||
Reference in New Issue
Block a user