mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 12:41:09 +01:00
Sensors can now be printed, removed and installed on jumpsuits. HANDCRAFTED jumpsuits no longer have sensors by default (also mild crafting refactor) (#93121)
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
///The item representing suit sensors when removed from a suit or dress (obj/item/clothing/under)
|
||||
/obj/item/suit_sensor
|
||||
name = "suit sensor"
|
||||
desc = "That thingamabob medbay keeps telling you to set to 'Tracking Beacon'. It needs to be attached to a worn suit or dress to work."
|
||||
icon = 'icons/obj/devices/tracker.dmi'
|
||||
icon_state = "suit_sensor"
|
||||
base_icon_state = "suit_sensor"
|
||||
obj_flags = CONDUCTS_ELECTRICITY
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT, /datum/material/glass= SMALL_MATERIAL_AMOUNT)
|
||||
drop_sound = 'sound/items/handling/component_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/component_pickup.ogg'
|
||||
throwforce = 2
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
///The current sensor mode, inherited from the clothing it's cut from. Can also be changed when using it in hand.
|
||||
var/sensor_mode = SENSOR_OFF
|
||||
///Suit sensors are busted when struck by a heavy electromagnetic pulse.
|
||||
var/broken = FALSE
|
||||
|
||||
/obj/item/suit_sensor/examine(mob/user)
|
||||
. = ..()
|
||||
if(broken)
|
||||
. += span_warning("It's currently broken. You can use a piece of [EXAMINE_HINT("cable")] to fix it.")
|
||||
else
|
||||
. += span_notice("It's currently set on '[GLOB.suit_sensor_mode_to_defines.Find(sensor_mode + 1)]'.")
|
||||
|
||||
/obj/item/suit_sensor/update_overlays()
|
||||
. = ..()
|
||||
if(broken)
|
||||
return
|
||||
switch(sensor_mode)
|
||||
if(SENSOR_LIVING)
|
||||
. += "suit_sensor_binary"
|
||||
if(SENSOR_VITALS)
|
||||
. += "suit_sensor_vitals"
|
||||
if(SENSOR_COORDS)
|
||||
. += "suit_sensor_tracking"
|
||||
|
||||
/obj/item/suit_sensor/proc/set_mode(new_mode)
|
||||
if(sensor_mode == new_mode)
|
||||
return FALSE
|
||||
sensor_mode = new_mode
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
return TRUE
|
||||
|
||||
/obj/item/suit_sensor/attack_self(mob/living/user)
|
||||
. = ..()
|
||||
if(!(user.mobility_flags & MOBILITY_USE) || !IsReachableBy(user))
|
||||
return FALSE
|
||||
if(broken)
|
||||
balloon_alert(user, "fix it first!")
|
||||
return
|
||||
var/current_mode_text = GLOB.suit_sensor_mode_to_defines[sensor_mode + 1]
|
||||
var/new_mode = tgui_input_list(user, "Select a sensor mode", "Suit Sensors", GLOB.suit_sensor_mode_to_defines, current_mode_text)
|
||||
if(isnull(new_mode) || broken|| !(user.mobility_flags & MOBILITY_USE) || !IsReachableBy(user))
|
||||
user.balloon_alert(user, "can't do that now!")
|
||||
return
|
||||
set_mode(GLOB.suit_sensor_mode_to_defines[new_mode])
|
||||
balloon_alert(user, "sensor set to '[LOWER_TEXT(new_mode)]'")
|
||||
|
||||
/obj/item/suit_sensor/emp_act(severity)
|
||||
. = ..()
|
||||
if(. & EMP_PROTECT_SELF || broken)
|
||||
return
|
||||
|
||||
if(severity <= EMP_HEAVY)
|
||||
broken = TRUE
|
||||
else
|
||||
set_mode(pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS))
|
||||
playsound(source = src, soundin = 'sound/effects/sparks/sparks3.ogg', vol = 75, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
|
||||
|
||||
/obj/item/suit_sensor/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
|
||||
if(!istype(tool, /obj/item/stack/cable_coil))
|
||||
return ..()
|
||||
if(!broken)
|
||||
balloon_alert(user, "not broken!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/obj/item/stack/cable_coil/cabling = tool
|
||||
cabling.use(1)
|
||||
balloon_alert(user, "suit sensor repaired")
|
||||
broken = FALSE
|
||||
update_appearance(UPDATE_OVERLAYS)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
@@ -34,7 +34,7 @@
|
||||
/// Does this undersuit spawn with a random sensor value
|
||||
var/random_sensor = TRUE
|
||||
/// What is the active sensor mode of this udnersuit
|
||||
var/sensor_mode = NO_SENSORS
|
||||
var/sensor_mode = SENSOR_OFF
|
||||
|
||||
// Accessory handling (Can be componentized eventually)
|
||||
/// The max number of accessories we can have on this suit.
|
||||
@@ -60,6 +60,19 @@
|
||||
register_context()
|
||||
AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK, body = TRUE)
|
||||
|
||||
/obj/item/clothing/under/on_craft_completion(list/components, datum/crafting_recipe/current_recipe, atom/crafter)
|
||||
. = ..()
|
||||
var/obj/item/clothing/under/any_original = locate() in components
|
||||
if(!any_original)
|
||||
set_has_sensor(NO_SENSORS)
|
||||
return
|
||||
set_has_sensor(any_original.has_sensor)
|
||||
set_sensor_mode(any_original.sensor_mode)
|
||||
|
||||
/obj/item/clothing/under/used_in_craft(atom/result, datum/crafting_recipe/current_recipe)
|
||||
. = ..()
|
||||
dump_attachments()
|
||||
|
||||
/obj/item/clothing/under/setup_reskinning()
|
||||
if(!check_setup_reskinning())
|
||||
return
|
||||
@@ -72,7 +85,7 @@
|
||||
|
||||
var/changed = FALSE
|
||||
|
||||
if((isnull(held_item) || held_item == src) && has_sensor == HAS_SENSORS)
|
||||
if(has_sensor == HAS_SENSORS && (isnull(held_item) || held_item == src))
|
||||
context[SCREENTIP_CONTEXT_RMB] = "Toggle suit sensors"
|
||||
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Set suit sensors to tracking"
|
||||
changed = TRUE
|
||||
@@ -85,10 +98,18 @@
|
||||
context[SCREENTIP_CONTEXT_ALT_RMB] = "Remove accessory"
|
||||
changed = TRUE
|
||||
|
||||
if(istype(held_item, /obj/item/stack/cable_coil) && has_sensor == BROKEN_SENSORS)
|
||||
if(has_sensor == BROKEN_SENSORS && istype(held_item, /obj/item/stack/cable_coil))
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Repair suit sensors"
|
||||
changed = TRUE
|
||||
|
||||
if(has_sensor == NO_SENSORS)
|
||||
if(istype(held_item, /obj/item/suit_sensor))
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Install suit sensors"
|
||||
changed = TRUE
|
||||
else if(held_item?.tool_behaviour == TOOL_WIRECUTTER)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Cut suit sensors"
|
||||
changed = TRUE
|
||||
|
||||
if(can_adjust && adjusted != DIGITIGRADE_STYLE)
|
||||
context[SCREENTIP_CONTEXT_ALT_LMB] = "Wear [adjusted == ALT_STYLE ? "normally" : "casually"]"
|
||||
changed = TRUE
|
||||
@@ -114,15 +135,55 @@
|
||||
if (blood_overlay)
|
||||
. += blood_overlay
|
||||
|
||||
/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
|
||||
if(repair_sensors(attacking_item, user))
|
||||
return TRUE
|
||||
/obj/item/clothing/under/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
|
||||
if(istype(tool, /obj/item/stack/cable_coil))
|
||||
if(!repair_sensors(user))
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/obj/item/stack/cable_coil/cabling = tool
|
||||
cabling.use(1)
|
||||
cabling.visible_message(span_notice("[user] repairs the suit sensors on [src] with [cabling]."))
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
if(istype(attacking_item, /obj/item/clothing/accessory))
|
||||
return attach_accessory(attacking_item, user)
|
||||
if(istype(tool, /obj/item/clothing/accessory))
|
||||
return attach_accessory(tool, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
|
||||
|
||||
if(istype(tool, /obj/item/suit_sensor))
|
||||
if(has_sensor != NO_SENSORS)
|
||||
balloon_alert(user, "already has sensors!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
balloon_alert(user, "installing sensors...")
|
||||
if(!do_after(user, 5 SECONDS, target = src))
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/obj/item/suit_sensor/sensor = tool
|
||||
if(sensor.broken)
|
||||
set_has_sensor(BROKEN_SENSORS)
|
||||
else
|
||||
set_has_sensor(HAS_SENSORS)
|
||||
set_sensor_mode(sensor.sensor_mode)
|
||||
qdel(tool)
|
||||
balloon_alert(user, "sensors installed")
|
||||
playsound(source = src, soundin = 'sound/effects/sparks/sparks4.ogg', vol = 50, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/wirecutter_act(mob/living/user, obj/item/tool)
|
||||
if(has_sensor == NO_SENSORS)
|
||||
balloon_alert(user, "doesn't have sensors!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
balloon_alert(user, "cutting out sensors...")
|
||||
if(!do_after(user, 5 SECONDS, target = src))
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
var/obj/item/suit_sensor/sensor = new (drop_location())
|
||||
if(sensor.IsReachableBy(user))
|
||||
user.put_in_hands(sensor)
|
||||
if(has_sensor == BROKEN_SENSORS)
|
||||
sensor.broken = TRUE
|
||||
else
|
||||
sensor.set_mode(sensor_mode)
|
||||
set_has_sensor(NO_SENSORS)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/obj/item/clothing/under/attack_hand_secondary(mob/user, params)
|
||||
. = ..()
|
||||
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
|
||||
@@ -144,7 +205,7 @@
|
||||
if(damaged_state == CLOTHING_SHREDDED && has_sensor > NO_SENSORS)
|
||||
break_sensors()
|
||||
else if(damaged_state == CLOTHING_PRISTINE && has_sensor == BROKEN_SENSORS)
|
||||
repair_sensors(cable_required = FALSE)
|
||||
repair_sensors()
|
||||
update_appearance()
|
||||
|
||||
/obj/item/clothing/under/visual_equipped(mob/user, slot)
|
||||
@@ -189,23 +250,12 @@
|
||||
/**
|
||||
* Repair the suit sensors and update the mob's status on the global sensor list.
|
||||
* Can be called either through player action such as repairing with coil, or as part of a general fixing proc
|
||||
*
|
||||
* Arguments:
|
||||
* * attacking_item - the item being used for the repair, if any
|
||||
* * user - mob that's doing the repair
|
||||
* * cable_required - set to FALSE to bypass consuming cable coil
|
||||
*/
|
||||
/obj/item/clothing/under/proc/repair_sensors(obj/item/attacking_item, mob/user, cable_required = TRUE)
|
||||
/obj/item/clothing/under/proc/repair_sensors(mob/user)
|
||||
if(has_sensor != BROKEN_SENSORS)
|
||||
return
|
||||
|
||||
if(cable_required)
|
||||
if(!istype(attacking_item, /obj/item/stack/cable_coil))
|
||||
return
|
||||
var/obj/item/stack/cable_coil/cabling = attacking_item
|
||||
if(!cabling.use(1))
|
||||
return
|
||||
cabling.visible_message(span_notice("[user] repairs the suit sensors on [src] with [cabling]."))
|
||||
if(user)
|
||||
balloon_alert(user, "sensors [has_sensor == NO_SENSORS ? "missing" : "not broken"]!")
|
||||
return FALSE
|
||||
|
||||
playsound(source = src, soundin = 'sound/effects/sparks/sparks4.ogg', vol = 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
|
||||
set_has_sensor(HAS_SENSORS)
|
||||
@@ -393,6 +443,9 @@
|
||||
. += "Its vital tracker appears to be enabled."
|
||||
if(SENSOR_COORDS)
|
||||
. += "Its vital tracker and tracking beacon appear to be enabled."
|
||||
else
|
||||
. += span_tooltip("You can always get new suit sensors to install from a lathe.", "It isn't equipped with medical sensors.")
|
||||
|
||||
if(LAZYLEN(attached_accessories))
|
||||
var/list/accessories = list_accessories_with_icon(user)
|
||||
. += "It has [english_list(accessories)] attached."
|
||||
@@ -414,14 +467,14 @@
|
||||
if(!can_toggle_sensors(user_mob))
|
||||
return
|
||||
|
||||
var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon")
|
||||
var/switchMode = tgui_input_list(user_mob, "Select a sensor mode", "Suit Sensors", modes, modes[sensor_mode + 1])
|
||||
if(isnull(switchMode))
|
||||
var/current_mode_text = GLOB.suit_sensor_mode_to_defines[sensor_mode + 1]
|
||||
var/new_mode = tgui_input_list(user_mob, "Select a sensor mode", "Suit Sensors", GLOB.suit_sensor_mode_to_defines, current_mode_text)
|
||||
if(isnull(new_mode))
|
||||
return
|
||||
if(!can_toggle_sensors(user_mob))
|
||||
return
|
||||
|
||||
set_sensor_mode(modes.Find(switchMode) - 1)
|
||||
set_sensor_mode(GLOB.suit_sensor_mode_to_defines[new_mode])
|
||||
if (loc == user_mob)
|
||||
switch(sensor_mode)
|
||||
if(SENSOR_OFF)
|
||||
|
||||
Reference in New Issue
Block a user