mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-16 18:45:22 +01:00
More things use trait huds over raw hud management (#93084)
This commit is contained in:
@@ -433,7 +433,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define TRAIT_UNSTABLE "unstable"
|
||||
#define TRAIT_OIL_FRIED "oil_fried"
|
||||
#define TRAIT_MEDICAL_HUD "med_hud"
|
||||
#define TRAIT_MEDICAL_HUD_SENSOR_ONLY "med_hud_lesser"
|
||||
#define TRAIT_SECURITY_HUD "sec_hud"
|
||||
#define TRAIT_SECURITY_HUD_ID_ONLY "sec_hud_lesser"
|
||||
#define TRAIT_ABDUCTOR_HUD "abductor_hud"
|
||||
/// Stop the user from seeing the sechud. Only works for trait handled sechuds.
|
||||
#define TRAIT_BLOCK_SECHUD "block_sechud"
|
||||
/// for something granting you a diagnostic hud
|
||||
#define TRAIT_DIAGNOSTIC_HUD "diag_hud"
|
||||
#define TRAIT_BOT_PATH_HUD "bot_path_hud"
|
||||
@@ -1475,8 +1480,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
///Trait given to atoms currently affected by projectile dampeners
|
||||
#define TRAIT_GOT_DAMPENED "got_dampened"
|
||||
|
||||
/// humans with this trait will have their health visible to AIs without suit
|
||||
#define HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT "hmsensorsvisiblewithoutsuit"
|
||||
/// Having this trait allows the basic health hud to show up for this mob
|
||||
#define TRAIT_BASIC_HEALTH_HUD_VISIBLE "basic_health_hud_visible"
|
||||
/// Apply to movables to say "hey, this movable is technically flat on the floor, so it'd be mopped up by a mop"
|
||||
#define TRAIT_MOPABLE "mopable"
|
||||
|
||||
|
||||
@@ -150,6 +150,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_WALLMOUNTED" = TRAIT_WALLMOUNTED,
|
||||
),
|
||||
/mob = list(
|
||||
"TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD,
|
||||
"TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING,
|
||||
"TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING,
|
||||
"TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST,
|
||||
@@ -185,6 +186,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_BLOB_ALLY" = TRAIT_BLOB_ALLY,
|
||||
"TRAIT_BLOCKING_PROJECTILES" = TRAIT_BLOCKING_PROJECTILES,
|
||||
"TRAIT_BLOCK_FORMALDEHYDE_METABOLISM" = TRAIT_BLOCK_FORMALDEHYDE_METABOLISM,
|
||||
"TRAIT_BLOCK_SECHUD" = TRAIT_BLOCK_SECHUD,
|
||||
"TRAIT_BLOCK_SHUTTLE_MOVEMENT" = TRAIT_BLOCK_SHUTTLE_MOVEMENT,
|
||||
"TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES,
|
||||
"TRAIT_BLOODY_MESS" = TRAIT_BLOODY_MESS,
|
||||
@@ -373,6 +375,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE,
|
||||
"TRAIT_MANSUS_TOUCHED" = TRAIT_MANSUS_TOUCHED,
|
||||
"TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD,
|
||||
"TRAIT_MEDICAL_HUD_SENSOR_ONLY" = TRAIT_MEDICAL_HUD_SENSOR_ONLY,
|
||||
"TRAIT_MESON_VISION" = TRAIT_MESON_VISION,
|
||||
"TRAIT_MIME_FAN" = TRAIT_MIME_FAN,
|
||||
"TRAIT_MIMING" = TRAIT_MIMING,
|
||||
@@ -512,6 +515,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER,
|
||||
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
|
||||
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
|
||||
"TRAIT_SECURITY_HUD_ID_ONLY" = TRAIT_SECURITY_HUD_ID_ONLY,
|
||||
"TRAIT_SEE_WORN_COLOURS" = TRAIT_SEE_WORN_COLOURS,
|
||||
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
|
||||
"TRAIT_SELF_SURGERY" = TRAIT_SELF_SURGERY,
|
||||
@@ -630,7 +634,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA,
|
||||
"TRAIT_LEFT_EYE_SCAR" = TRAIT_LEFT_EYE_SCAR,
|
||||
"TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR,
|
||||
"HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT" = HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT,
|
||||
"TRAIT_BASIC_HEALTH_HUD_VISIBLE" = TRAIT_BASIC_HEALTH_HUD_VISIBLE,
|
||||
"TRAIT_PREVENT_BLINKING" = TRAIT_PREVENT_BLINKING,
|
||||
"TRAIT_PREVENT_BLINK_LOOPS" = TRAIT_PREVENT_BLINK_LOOPS,
|
||||
"TRAIT_NO_EYELIDS" = TRAIT_NO_EYELIDS,
|
||||
|
||||
@@ -32,6 +32,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_SPEED_POTIONED" = TRAIT_SPEED_POTIONED,
|
||||
),
|
||||
/mob = list(
|
||||
"TRAIT_ABDUCTOR_HUD" = TRAIT_ABDUCTOR_HUD,
|
||||
"TRAIT_ABDUCTOR_SCIENTIST_TRAINING" = TRAIT_ABDUCTOR_SCIENTIST_TRAINING,
|
||||
"TRAIT_ABDUCTOR_TRAINING" = TRAIT_ABDUCTOR_TRAINING,
|
||||
"TRAIT_ACT_AS_CULTIST" = TRAIT_ACT_AS_CULTIST,
|
||||
@@ -172,6 +173,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_MAGICALLY_GIFTED" = TRAIT_MAGICALLY_GIFTED,
|
||||
"TRAIT_MARTIAL_ARTS_IMMUNE" = TRAIT_MARTIAL_ARTS_IMMUNE,
|
||||
"TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD,
|
||||
"TRAIT_MEDICAL_HUD_SENSOR_ONLY" = TRAIT_MEDICAL_HUD_SENSOR_ONLY,
|
||||
"TRAIT_MIME_FAN" = TRAIT_MIME_FAN,
|
||||
"TRAIT_MIMING" = TRAIT_MIMING,
|
||||
"TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD,
|
||||
@@ -266,6 +268,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER,
|
||||
"TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO,
|
||||
"TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD,
|
||||
"TRAIT_SECURITY_HUD_ID_ONLY" = TRAIT_SECURITY_HUD_ID_ONLY,
|
||||
"TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE,
|
||||
"TRAIT_SETTLER" = TRAIT_SETTLER,
|
||||
"TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES,
|
||||
|
||||
@@ -27,14 +27,14 @@
|
||||
|
||||
/datum/element/digitalcamo/proc/HideFromAIHuds(mob/living/target)
|
||||
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
|
||||
for (var/hud_type in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type]
|
||||
for (var/hud_trait in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[GLOB.trait_to_hud[hud_trait]]
|
||||
silicon_hud.hide_single_atomhud_from(AI,target)
|
||||
|
||||
/datum/element/digitalcamo/proc/UnhideFromAIHuds(mob/living/target)
|
||||
for(var/mob/living/silicon/ai/AI in GLOB.ai_list)
|
||||
for (var/hud_type in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type]
|
||||
for (var/hud_trait in AI.silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[GLOB.trait_to_hud[hud_trait]]
|
||||
silicon_hud.unhide_single_atomhud_from(AI,target)
|
||||
|
||||
/datum/element/digitalcamo/proc/on_examine(datum/source, mob/M, list/examine_list)
|
||||
|
||||
+14
-3
@@ -20,11 +20,22 @@ GLOBAL_LIST_INIT(huds, list(
|
||||
DATA_HUD_MALF_APC = new /datum/atom_hud/data/malf_apc(),
|
||||
))
|
||||
|
||||
/// Assoc list of traits to the huds they give.
|
||||
GLOBAL_LIST_INIT(trait_to_hud, list(
|
||||
TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED,
|
||||
TRAIT_MEDICAL_HUD = DATA_HUD_MEDICAL_ADVANCED,
|
||||
TRAIT_DIAGNOSTIC_HUD = DATA_HUD_DIAGNOSTIC,
|
||||
TRAIT_ABDUCTOR_HUD = DATA_HUD_ABDUCTOR,
|
||||
TRAIT_BOT_PATH_HUD = DATA_HUD_BOT_PATH,
|
||||
TRAIT_CLOWN_ENJOYER = DATA_HUD_FAN,
|
||||
TRAIT_DIAGNOSTIC_HUD = DATA_HUD_DIAGNOSTIC,
|
||||
TRAIT_MEDICAL_HUD = DATA_HUD_MEDICAL_ADVANCED,
|
||||
TRAIT_MEDICAL_HUD_SENSOR_ONLY = DATA_HUD_MEDICAL_BASIC,
|
||||
TRAIT_MIME_FAN = DATA_HUD_FAN,
|
||||
TRAIT_SECURITY_HUD = DATA_HUD_SECURITY_ADVANCED,
|
||||
TRAIT_SECURITY_HUD_ID_ONLY = DATA_HUD_SECURITY_BASIC,
|
||||
))
|
||||
|
||||
/// Assoc list of traits that block other traits' huds to list of hud (traits) that they block
|
||||
GLOBAL_LIST_INIT(trait_blockers_to_hud, list(
|
||||
TRAIT_BLOCK_SECHUD = list(TRAIT_SECURITY_HUD, TRAIT_SECURITY_HUD_ID_ONLY),
|
||||
))
|
||||
|
||||
/datum/atom_hud
|
||||
|
||||
@@ -25,7 +25,3 @@
|
||||
|
||||
/datum/quirk/item_quirk/clown_enjoyer/add_unique(client/client_source)
|
||||
give_item_to_holder(/obj/item/clothing/accessory/clown_enjoyer_pin, list(LOCATION_BACKPACK, LOCATION_HANDS))
|
||||
|
||||
/datum/quirk/item_quirk/clown_enjoyer/add(client/client_source)
|
||||
var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
|
||||
fan.show_to(quirk_holder)
|
||||
|
||||
@@ -23,7 +23,3 @@
|
||||
|
||||
/datum/quirk/item_quirk/mime_fan/add_unique(client/client_source)
|
||||
give_item_to_holder(/obj/item/clothing/accessory/mime_fan_pin, list(LOCATION_BACKPACK, LOCATION_HANDS))
|
||||
|
||||
/datum/quirk/item_quirk/mime_fan/add(client/client_source)
|
||||
var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
|
||||
fan.show_to(quirk_holder)
|
||||
|
||||
@@ -299,16 +299,12 @@
|
||||
)
|
||||
|
||||
//Makes the user passive, it's in their oath not to harm!
|
||||
owner.add_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH), HIPPOCRATIC_OATH_TRAIT)
|
||||
var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
med_hud.show_to(owner)
|
||||
owner.add_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH, TRAIT_MEDICAL_HUD), HIPPOCRATIC_OATH_TRAIT)
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/hippocratic_oath/on_remove()
|
||||
QDEL_NULL(aura_healing)
|
||||
owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH), HIPPOCRATIC_OATH_TRAIT)
|
||||
var/datum/atom_hud/med_hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
med_hud.hide_from(owner)
|
||||
owner.remove_traits(list(TRAIT_PACIFISM, TRAIT_HIPPOCRATIC_OATH, TRAIT_MEDICAL_HUD), HIPPOCRATIC_OATH_TRAIT)
|
||||
|
||||
/datum/status_effect/hippocratic_oath/get_examine_text()
|
||||
return span_notice("[owner.p_They()] seem[owner.p_s()] to have an aura of healing and helpfulness about [owner.p_them()].")
|
||||
|
||||
+7
-25
@@ -20,36 +20,23 @@
|
||||
/datum/atom_hud/data/human/medical
|
||||
hud_icons = list(STATUS_HUD, HEALTH_HUD)
|
||||
|
||||
/// Sees health (0-100) status (alive, dead), but relies on suit sensors being on
|
||||
/datum/atom_hud/data/human/medical/basic
|
||||
|
||||
/datum/atom_hud/data/human/medical/basic/proc/check_sensors(mob/living/carbon/human/human)
|
||||
if(!istype(human))
|
||||
return FALSE
|
||||
if(HAS_TRAIT(human, HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT))
|
||||
return TRUE
|
||||
var/obj/item/clothing/under/undersuit = human.w_uniform
|
||||
if(!istype(undersuit))
|
||||
return FALSE
|
||||
if(undersuit.has_sensor < HAS_SENSORS)
|
||||
return FALSE
|
||||
if(undersuit.sensor_mode <= SENSOR_VITALS)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/M, mob/living/carbon/H)
|
||||
if(check_sensors(H))
|
||||
..()
|
||||
|
||||
/datum/atom_hud/data/human/medical/basic/proc/update_suit_sensors(mob/living/carbon/H)
|
||||
check_sensors(H) ? add_atom_to_hud(H) : remove_atom_from_hud(H)
|
||||
/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/requesting_mob, atom/hud_atom)
|
||||
if(HAS_TRAIT(hud_atom, TRAIT_BASIC_HEALTH_HUD_VISIBLE))
|
||||
return ..()
|
||||
|
||||
/// Sees health (0-100) status (alive, dead), always
|
||||
/datum/atom_hud/data/human/medical/advanced
|
||||
|
||||
/datum/atom_hud/data/human/security
|
||||
|
||||
/// Only sees ID card job
|
||||
/datum/atom_hud/data/human/security/basic
|
||||
hud_icons = list(ID_HUD)
|
||||
|
||||
/// Sees ID card job, implants, and wanted status
|
||||
/datum/atom_hud/data/human/security/advanced
|
||||
hud_icons = list(ID_HUD, IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD, WANTED_HUD)
|
||||
|
||||
@@ -165,11 +152,6 @@ Medical HUD! Basic mode needs suit sensors on.
|
||||
|
||||
//HOOKS
|
||||
|
||||
//called when a human changes suit sensors
|
||||
/mob/living/carbon/proc/update_suit_sensors()
|
||||
var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC]
|
||||
B.update_suit_sensors(src)
|
||||
|
||||
//called when a living mob changes health
|
||||
/mob/living/proc/med_hud_set_health()
|
||||
set_hud_image_state(HEALTH_HUD, "hud[RoundHealth(src)]")
|
||||
|
||||
@@ -102,6 +102,3 @@
|
||||
/obj/item/ammo_box/speedloader/c357 = 2,
|
||||
/obj/item/gun/ballistic/revolver/cowboy/nuclear = 1,
|
||||
), src)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -340,15 +340,17 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD.
|
||||
log_admin("[key_name(user)] toggled their admin combo HUD [user.combo_hud_enabled ? "ON" : "OFF"].")
|
||||
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Combo HUD", "[user.combo_hud_enabled ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
|
||||
|
||||
/// List of hud traits in the admin combo hud
|
||||
#define ADMIN_HUDS list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD)
|
||||
|
||||
/client/proc/enable_combo_hud()
|
||||
if (combo_hud_enabled)
|
||||
return
|
||||
|
||||
combo_hud_enabled = TRUE
|
||||
|
||||
for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH))
|
||||
var/datum/atom_hud/atom_hud = GLOB.huds[hudtype]
|
||||
atom_hud.show_to(mob)
|
||||
for (var/hudtrait in ADMIN_HUDS)
|
||||
ADD_TRAIT(mob, hudtrait, ADMIN_TRAIT)
|
||||
|
||||
for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances)
|
||||
antag_hud.show_to(mob)
|
||||
@@ -362,9 +364,8 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD.
|
||||
|
||||
combo_hud_enabled = FALSE
|
||||
|
||||
for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH))
|
||||
var/datum/atom_hud/atom_hud = GLOB.huds[hudtype]
|
||||
atom_hud.hide_from(mob)
|
||||
for (var/hudtrait in ADMIN_HUDS)
|
||||
REMOVE_TRAIT(mob, hudtrait, ADMIN_TRAIT)
|
||||
|
||||
for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances)
|
||||
antag_hud.hide_from(mob)
|
||||
@@ -372,6 +373,8 @@ ADMIN_VERB(combo_hud, R_ADMIN, "Toggle Combo HUD", "Toggles the Admin Combo HUD.
|
||||
mob.lighting_cutoff = mob.default_lighting_cutoff()
|
||||
mob.update_sight()
|
||||
|
||||
#undef ADMIN_HUDS
|
||||
|
||||
ADMIN_VERB(show_traitor_panel, R_ADMIN, "Show Traitor Panel", "Edit mobs's memory and role", ADMIN_CATEGORY_GAME, mob/target_mob)
|
||||
var/datum/mind/target_mind = target_mob.mind
|
||||
if(!target_mind)
|
||||
|
||||
@@ -74,11 +74,11 @@
|
||||
objectives += team.objectives
|
||||
finalize_abductor()
|
||||
// We don't want abductors to be converted by other antagonists
|
||||
owner.add_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
owner.add_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_ABDUCTOR_HUD, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/abductor/on_removal()
|
||||
owner.remove_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
owner.remove_traits(list(TRAIT_ABDUCTOR_TRAINING, TRAIT_ABDUCTOR_HUD, TRAIT_UNCONVERTABLE), ABDUCTOR_ANTAGONIST)
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/abductor/greet()
|
||||
|
||||
@@ -1151,14 +1151,13 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
|
||||
empulse(T, 0.42*(intensity), 1)
|
||||
|
||||
var/list/images = list()
|
||||
var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
for(var/mob/living/M in GLOB.alive_mob_list)
|
||||
if(!is_valid_z_level(T, get_turf(M)))
|
||||
continue
|
||||
if(ishuman(M))
|
||||
if(!IS_CULTIST(M))
|
||||
sec_hud.hide_from(M)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(hudFix), M), duration)
|
||||
ADD_TRAIT(M, TRAIT_BLOCK_SECHUD, CULT_TRAIT)
|
||||
addtimer(TRAIT_CALLBACK_REMOVE(M, TRAIT_BLOCK_SECHUD, CULT_TRAIT), duration)
|
||||
var/image/A = image('icons/mob/nonhuman-player/cult.dmi',M,"cultist", ABOVE_MOB_LAYER)
|
||||
A.override = 1
|
||||
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "human_apoc", A, NONE)
|
||||
@@ -1235,13 +1234,3 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
|
||||
if(I.icon_state != "bloodsparkles")
|
||||
I.override = TRUE
|
||||
sleep(19 SECONDS)
|
||||
|
||||
|
||||
|
||||
/proc/hudFix(mob/living/carbon/human/target)
|
||||
if(!target || !target.client)
|
||||
return
|
||||
var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES)
|
||||
if(istype(O, /obj/item/clothing/glasses/hud/security))
|
||||
var/datum/atom_hud/sec_hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
sec_hud.show_to(target)
|
||||
|
||||
@@ -85,8 +85,8 @@
|
||||
|
||||
if(istype(equip_to.w_uniform, /obj/item/clothing/under))
|
||||
var/obj/item/clothing/under/uniform = equip_to.w_uniform
|
||||
uniform.sensor_mode = NO_SENSORS
|
||||
uniform.has_sensor = NO_SENSORS
|
||||
uniform.set_sensor_mode(SENSOR_OFF)
|
||||
uniform.set_has_sensor(NO_SENSORS)
|
||||
|
||||
/datum/outfit/russian_hunter/leader
|
||||
name = "Russian Hunter Leader"
|
||||
|
||||
@@ -50,9 +50,8 @@
|
||||
//dont want anyone noticing there's two now
|
||||
var/mob/living/carbon/human/clone_human = owner.current
|
||||
var/obj/item/clothing/under/sensor_clothes = clone_human.w_uniform
|
||||
if(sensor_clothes)
|
||||
sensor_clothes.sensor_mode = SENSOR_OFF
|
||||
clone_human.update_suit_sensors()
|
||||
if(istype(sensor_clothes))
|
||||
sensor_clothes.set_sensor_mode(SENSOR_OFF)
|
||||
|
||||
// Perform a quick copy of existing memories.
|
||||
// This may result in some minutely imperfect memories, but it'll do
|
||||
|
||||
@@ -25,10 +25,9 @@
|
||||
outfit_id.update_icon()
|
||||
|
||||
var/obj/item/clothing/under/pirate_uniform = equipped.w_uniform
|
||||
if(pirate_uniform)
|
||||
pirate_uniform.has_sensor = NO_SENSORS
|
||||
pirate_uniform.sensor_mode = SENSOR_OFF
|
||||
equipped.update_suit_sensors()
|
||||
if(istype(pirate_uniform))
|
||||
pirate_uniform.set_has_sensor(NO_SENSORS)
|
||||
pirate_uniform.set_sensor_mode(SENSOR_OFF)
|
||||
|
||||
/datum/outfit/pirate/captain
|
||||
name = "Space Pirate Captain"
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
|
||||
/datum/outfit/cyber_police/post_equip(mob/living/carbon/human/user, visuals_only)
|
||||
var/obj/item/clothing/under/officer_uniform = user.w_uniform
|
||||
if(officer_uniform)
|
||||
officer_uniform.has_sensor = NO_SENSORS
|
||||
officer_uniform.sensor_mode = SENSOR_OFF
|
||||
user.update_suit_sensors()
|
||||
if(istype(officer_uniform))
|
||||
officer_uniform.set_has_sensor(NO_SENSORS)
|
||||
officer_uniform.set_sensor_mode(SENSOR_OFF)
|
||||
|
||||
@@ -658,43 +658,29 @@
|
||||
lighting_cutoff = LIGHTING_CUTOFF_HIGH
|
||||
glass_colour_type = FALSE
|
||||
vision_flags = SEE_TURFS
|
||||
clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_MADNESS_IMMUNE)
|
||||
var/list/hudlist = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC, DATA_HUD_SECURITY_ADVANCED, DATA_HUD_BOT_PATH)
|
||||
clothing_traits = list(
|
||||
TRAIT_REAGENT_SCANNER,
|
||||
TRAIT_MADNESS_IMMUNE,
|
||||
TRAIT_MEDICAL_HUD,
|
||||
TRAIT_SECURITY_HUD,
|
||||
TRAIT_DIAGNOSTIC_HUD,
|
||||
TRAIT_BOT_PATH_HUD,
|
||||
)
|
||||
var/xray = FALSE
|
||||
|
||||
/obj/item/clothing/glasses/debug/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/adjust_fishing_difficulty, -15)
|
||||
|
||||
/obj/item/clothing/glasses/debug/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(!(slot & ITEM_SLOT_EYES))
|
||||
return
|
||||
if(ishuman(user))
|
||||
for(var/hud in hudlist)
|
||||
var/datum/atom_hud/our_hud = GLOB.huds[hud]
|
||||
our_hud.show_to(user)
|
||||
user.add_traits(list(TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD), GLASSES_TRAIT)
|
||||
if(xray)
|
||||
ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT)
|
||||
|
||||
/obj/item/clothing/glasses/debug/dropped(mob/user)
|
||||
. = ..()
|
||||
user.remove_traits(list(TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD, TRAIT_XRAY_VISION), GLASSES_TRAIT)
|
||||
if(ishuman(user))
|
||||
for(var/hud in hudlist)
|
||||
var/datum/atom_hud/our_hud = GLOB.huds[hud]
|
||||
our_hud.hide_from(user)
|
||||
|
||||
/obj/item/clothing/glasses/debug/click_alt(mob/user)
|
||||
if(!ishuman(user))
|
||||
return CLICK_ACTION_BLOCKING
|
||||
if(xray)
|
||||
vision_flags &= ~SEE_MOBS|SEE_OBJS
|
||||
REMOVE_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT)
|
||||
detach_clothing_traits(TRAIT_XRAY_VISION)
|
||||
else
|
||||
vision_flags |= SEE_MOBS|SEE_OBJS
|
||||
ADD_TRAIT(user, TRAIT_XRAY_VISION, GLASSES_TRAIT)
|
||||
attach_clothing_traits(TRAIT_XRAY_VISION)
|
||||
xray = !xray
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
human_user.update_sight()
|
||||
|
||||
@@ -243,18 +243,14 @@
|
||||
if (wearer.glasses != src)
|
||||
return
|
||||
|
||||
for(var/trait in clothing_traits)
|
||||
REMOVE_CLOTHING_TRAIT(user, trait)
|
||||
|
||||
if (TRAIT_MEDICAL_HUD in clothing_traits)
|
||||
clothing_traits = null
|
||||
detach_clothing_traits(TRAIT_MEDICAL_HUD)
|
||||
else if (TRAIT_SECURITY_HUD in clothing_traits)
|
||||
clothing_traits = list(TRAIT_MEDICAL_HUD)
|
||||
detach_clothing_traits(TRAIT_MEDICAL_HUD)
|
||||
attach_clothing_traits(TRAIT_SECURITY_HUD)
|
||||
else
|
||||
clothing_traits = list(TRAIT_SECURITY_HUD)
|
||||
|
||||
for(var/trait in clothing_traits)
|
||||
ADD_CLOTHING_TRAIT(user, trait)
|
||||
detach_clothing_traits(TRAIT_MEDICAL_HUD)
|
||||
attach_clothing_traits(TRAIT_SECURITY_HUD)
|
||||
|
||||
/datum/action/item_action/switch_hud
|
||||
name = "Switch HUD"
|
||||
|
||||
@@ -54,7 +54,10 @@
|
||||
. = ..()
|
||||
if(random_sensor)
|
||||
//make the sensor mode favor higher levels, except coords.
|
||||
sensor_mode = pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF)
|
||||
set_sensor_mode(pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF))
|
||||
//ensure we add or remove relevant clothing traits based on base sensor status and mode
|
||||
update_wearer_status()
|
||||
|
||||
register_context()
|
||||
AddElement(/datum/element/update_icon_updates_onmob, flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_NECK, body = TRUE)
|
||||
|
||||
@@ -165,6 +168,12 @@
|
||||
if((slot & ITEM_SLOT_ICLOTHING) && freshly_laundered)
|
||||
freshly_laundered = FALSE
|
||||
user.add_mood_event("fresh_laundry", /datum/mood_event/fresh_laundry)
|
||||
update_wearer_status()
|
||||
|
||||
/obj/item/clothing/under/dropped(mob/living/user)
|
||||
. = ..()
|
||||
update_wearer_status()
|
||||
GLOB.suit_sensors_list -= user
|
||||
|
||||
// Start suit sensor handling
|
||||
|
||||
@@ -174,9 +183,8 @@
|
||||
return
|
||||
|
||||
visible_message(span_warning("[src]'s medical sensors short out!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
has_sensor = BROKEN_SENSORS
|
||||
set_has_sensor(BROKEN_SENSORS)
|
||||
sensor_malfunction()
|
||||
update_wearer_status()
|
||||
|
||||
/**
|
||||
* Repair the suit sensors and update the mob's status on the global sensor list.
|
||||
@@ -200,8 +208,7 @@
|
||||
cabling.visible_message(span_notice("[user] repairs the suit sensors on [src] with [cabling]."))
|
||||
|
||||
playsound(source = src, soundin = 'sound/effects/sparks/sparks4.ogg', vol = 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
|
||||
has_sensor = HAS_SENSORS
|
||||
update_wearer_status()
|
||||
set_has_sensor(HAS_SENSORS)
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -211,29 +218,46 @@
|
||||
do_sparks(number = 2, cardinal_only = FALSE, source = src)
|
||||
addtimer(CALLBACK(src, PROC_REF(sensor_malfunction)), rand(BROKEN_SPARKS_MIN, BROKEN_SPARKS_MAX * 0.5), TIMER_UNIQUE | TIMER_NO_HASH_WAIT)
|
||||
|
||||
/// If the item is being worn, update the mob's status on the global sensor list
|
||||
/// Changes whether the suit sensor has a sensor, or if it's broken, etc. and handles updating mob status if applicable
|
||||
/obj/item/clothing/under/proc/set_has_sensor(new_has_sensor)
|
||||
if(new_has_sensor == has_sensor)
|
||||
return FALSE
|
||||
if(new_has_sensor < BROKEN_SENSORS || new_has_sensor > LOCKED_SENSORS)
|
||||
stack_trace("Invalid has_sensor value [new_has_sensor] passed to set_has_sensor()")
|
||||
return FALSE
|
||||
has_sensor = new_has_sensor
|
||||
update_wearer_status()
|
||||
return TRUE
|
||||
|
||||
/// Changes the active sensor mode of the suit and handles updating mob status if applicable
|
||||
/obj/item/clothing/under/proc/set_sensor_mode(new_sensor_mode)
|
||||
if(new_sensor_mode == sensor_mode)
|
||||
return FALSE
|
||||
if(new_sensor_mode < SENSOR_OFF || new_sensor_mode > SENSOR_COORDS)
|
||||
stack_trace("Invalid sensor_mode value [new_sensor_mode] passed to set_sensor_mode()")
|
||||
return FALSE
|
||||
sensor_mode = new_sensor_mode
|
||||
update_wearer_status()
|
||||
return TRUE
|
||||
|
||||
/// Updates the sensor status and any mobs status if applicable
|
||||
/obj/item/clothing/under/proc/update_wearer_status()
|
||||
if(!ishuman(loc))
|
||||
if(has_sensor <= NO_SENSORS || sensor_mode <= SENSOR_VITALS)
|
||||
detach_clothing_traits(TRAIT_BASIC_HEALTH_HUD_VISIBLE)
|
||||
else
|
||||
attach_clothing_traits(TRAIT_BASIC_HEALTH_HUD_VISIBLE)
|
||||
|
||||
if(!ishuman(loc) || isdummy(loc))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/ooman = loc
|
||||
ooman.update_suit_sensors()
|
||||
ooman.med_hud_set_status()
|
||||
var/mob/living/carbon/human/wearer = loc
|
||||
|
||||
/mob/living/carbon/human/update_suit_sensors()
|
||||
. = ..()
|
||||
update_sensor_list()
|
||||
|
||||
/// Adds or removes a mob from the global suit sensors list based on sensor status and mode
|
||||
/mob/living/carbon/human/proc/update_sensor_list()
|
||||
var/obj/item/clothing/under/uniform = w_uniform
|
||||
if(istype(uniform) && uniform.has_sensor > NO_SENSORS && uniform.sensor_mode)
|
||||
GLOB.suit_sensors_list |= src
|
||||
if(has_sensor >= HAS_SENSORS && sensor_mode >= SENSOR_LIVING)
|
||||
GLOB.suit_sensors_list |= wearer
|
||||
else
|
||||
GLOB.suit_sensors_list -= src
|
||||
GLOB.suit_sensors_list -= wearer
|
||||
|
||||
/mob/living/carbon/human/dummy/update_sensor_list()
|
||||
return
|
||||
wearer.med_hud_set_status()
|
||||
|
||||
/obj/item/clothing/under/emp_act(severity)
|
||||
. = ..()
|
||||
@@ -244,13 +268,11 @@
|
||||
|
||||
if(severity <= EMP_HEAVY)
|
||||
break_sensors()
|
||||
return
|
||||
|
||||
else
|
||||
sensor_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)
|
||||
visible_message(span_warning("The [src]'s medical sensors flash and change rapidly!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
|
||||
update_wearer_status()
|
||||
set_sensor_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)
|
||||
visible_message(span_warning("The [src]'s medical sensors flash and change rapidly!"), blind_message = span_warning("The [src] makes an electronic sizzling sound!"), vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
|
||||
/**
|
||||
* Called by medical scanners a simple summary of the status
|
||||
@@ -399,7 +421,7 @@
|
||||
if(!can_toggle_sensors(user_mob))
|
||||
return
|
||||
|
||||
sensor_mode = modes.Find(switchMode) - 1
|
||||
set_sensor_mode(modes.Find(switchMode) - 1)
|
||||
if (loc == user_mob)
|
||||
switch(sensor_mode)
|
||||
if(SENSOR_OFF)
|
||||
@@ -411,15 +433,12 @@
|
||||
if(SENSOR_COORDS)
|
||||
to_chat(user_mob, span_notice("Your suit will now report your exact vital lifesigns as well as your coordinate position."))
|
||||
|
||||
update_wearer_status()
|
||||
|
||||
/obj/item/clothing/under/item_ctrl_click(mob/user)
|
||||
if(!can_toggle_sensors(user))
|
||||
return CLICK_ACTION_BLOCKING
|
||||
|
||||
sensor_mode = SENSOR_COORDS
|
||||
set_sensor_mode(SENSOR_COORDS)
|
||||
balloon_alert(user, "set to tracking")
|
||||
update_wearer_status()
|
||||
return CLICK_ACTION_SUCCESS
|
||||
|
||||
/// Checks if the toggler is allowed to toggle suit sensors currently
|
||||
|
||||
@@ -101,6 +101,5 @@
|
||||
|
||||
H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly.
|
||||
H.dna.add_mutation(/datum/mutation/clumsy, MUTATION_SOURCE_CLOWN_CLUMSINESS)
|
||||
var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
|
||||
fan.show_to(H)
|
||||
ADD_TRAIT(H, TRAIT_CLOWN_ENJOYER, INNATE_TRAIT)
|
||||
H.faction |= FACTION_CLOWN
|
||||
|
||||
@@ -77,8 +77,7 @@
|
||||
var/datum/action/cooldown/spell/vow_of_silence/vow = new(H.mind)
|
||||
vow.Grant(H)
|
||||
|
||||
var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN]
|
||||
fan.show_to(H)
|
||||
ADD_TRAIT(H, TRAIT_MIME_FAN, INNATE_TRAIT)
|
||||
|
||||
/obj/item/book/granter/action/spell/mime/mimery
|
||||
name = "Guide to Dank Mimery"
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
|
||||
/obj/item/organ/brain/cybernetic/ai/on_mob_insert(mob/living/carbon/brain_owner, special, movement_flags)
|
||||
. = ..()
|
||||
brain_owner.add_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src))
|
||||
brain_owner.add_traits(list(TRAIT_BASIC_HEALTH_HUD_VISIBLE, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src))
|
||||
update_med_hud_status(brain_owner)
|
||||
RegisterSignal(brain_owner, COMSIG_LIVING_HEALTH_UPDATE, PROC_REF(update_med_hud_status))
|
||||
RegisterSignal(brain_owner, COMSIG_CLICK, PROC_REF(owner_clicked))
|
||||
@@ -53,7 +53,7 @@
|
||||
/obj/item/organ/brain/cybernetic/ai/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags)
|
||||
undeploy()
|
||||
. = ..()
|
||||
organ_owner.remove_traits(list(HUMAN_SENSORS_VISIBLE_WITHOUT_SUIT, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src))
|
||||
organ_owner.remove_traits(list(TRAIT_BASIC_HEALTH_HUD_VISIBLE, TRAIT_NO_MINDSWAP, TRAIT_CORPSELOCKED), REF(src))
|
||||
UnregisterSignal(organ_owner, list(COMSIG_LIVING_HEALTH_UPDATE, COMSIG_CLICK, COMSIG_MOB_GET_STATUS_TAB_ITEMS, COMSIG_MOB_MIND_BEFORE_MIDROUND_ROLL, COMSIG_QDELETING, COMSIG_LIVING_PRE_WABBAJACKED))
|
||||
|
||||
var/obj/item/implant/radio/radio = radio_weakref.resolve()
|
||||
|
||||
@@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(command_strings, list(
|
||||
var/list/current_pathed_turfs = list()
|
||||
|
||||
///The type of data HUD the bot uses. Diagnostic by default.
|
||||
var/data_hud_type = DATA_HUD_DIAGNOSTIC
|
||||
var/data_hud_type = TRAIT_DIAGNOSTIC_HUD
|
||||
/// If true we will allow ghosts to control this mob
|
||||
var/can_be_possessed = FALSE
|
||||
/// Message to display upon possession
|
||||
@@ -139,8 +139,7 @@ GLOBAL_LIST_INIT(command_strings, list(
|
||||
|
||||
//If a bot has its own HUD (for player bots), provide it.
|
||||
if(!isnull(data_hud_type))
|
||||
var/datum/atom_hud/datahud = GLOB.huds[data_hud_type]
|
||||
datahud.show_to(src)
|
||||
ADD_TRAIT(src, data_hud_type, INNATE_TRAIT)
|
||||
|
||||
if(mapload && is_station_level(z) && (bot_mode_flags & BOT_MODE_CAN_BE_SAPIENT) && (bot_mode_flags & BOT_MODE_ROUNDSTART_POSSESSION))
|
||||
enable_possession(mapload = mapload)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
bot_mode_flags = BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED | BOT_MODE_CAN_BE_SAPIENT | BOT_MODE_AUTOPATROL | BOT_MODE_ROUNDSTART_POSSESSION
|
||||
hackables = "sound control systems"
|
||||
path_image_color = "#FF69B4"
|
||||
data_hud_type = DATA_HUD_SECURITY_BASIC
|
||||
data_hud_type = TRAIT_SECURITY_HUD_ID_ONLY
|
||||
additional_access = /datum/id_trim/job/clown
|
||||
possessed_message = "You are a honkbot! Make sure the crew are having a great time!"
|
||||
///our voicelines
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
radio_key = /obj/item/encryptionkey/headset_med
|
||||
radio_channel = RADIO_CHANNEL_MEDICAL
|
||||
bot_type = MED_BOT
|
||||
data_hud_type = DATA_HUD_MEDICAL_ADVANCED
|
||||
data_hud_type = TRAIT_MEDICAL_HUD
|
||||
hackables = "health processor circuits"
|
||||
possessed_message = "You are a medbot! Ensure good health among the crew to the best of your ability!"
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
radio_key = /obj/item/encryptionkey/headset_service
|
||||
radio_channel = RADIO_CHANNEL_SERVICE
|
||||
bot_type = VIBE_BOT
|
||||
data_hud_type = DATA_HUD_DIAGNOSTIC
|
||||
data_hud_type = TRAIT_DIAGNOSTIC_HUD
|
||||
path_image_color = "#2cac12"
|
||||
possessed_message = "You are a vibebot! Maintain the station's vibes to the best of your ability!"
|
||||
|
||||
|
||||
@@ -30,14 +30,11 @@
|
||||
can_repair = TRUE
|
||||
can_repair_self = TRUE
|
||||
smashes_walls = TRUE
|
||||
///The health HUD applied to this mob.
|
||||
var/health_hud = DATA_HUD_MEDICAL_ADVANCED
|
||||
|
||||
/mob/living/basic/construct/artificer/Initialize(mapload)
|
||||
. = ..()
|
||||
AddElement(/datum/element/ai_retaliate)
|
||||
var/datum/atom_hud/datahud = GLOB.huds[health_hud]
|
||||
datahud.show_to(src)
|
||||
ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT)
|
||||
|
||||
/// Hostile NPC version. Heals nearby constructs and cult structures, avoids targets that aren't extremely hurt.
|
||||
/mob/living/basic/construct/artificer/hostile
|
||||
|
||||
@@ -27,8 +27,7 @@
|
||||
after_healed = CALLBACK(src, PROC_REF(after_healed)),\
|
||||
)
|
||||
|
||||
var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medsensor.show_to(src)
|
||||
ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT)
|
||||
|
||||
var/datum/action/cooldown/mob_cooldown/guardian_bluespace_beacon/teleport = new(src)
|
||||
teleport.Grant(src)
|
||||
|
||||
@@ -48,13 +48,11 @@
|
||||
/mob/living/basic/lightgeist/Initialize(mapload)
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT)
|
||||
ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT)
|
||||
|
||||
remove_verb(src, /mob/living/verb/pulled)
|
||||
remove_verb(src, /mob/verb/me_verb)
|
||||
|
||||
var/datum/atom_hud/medical_sensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medical_sensor.show_to(src)
|
||||
|
||||
AddElement(/datum/element/simple_flying)
|
||||
AddComponent(\
|
||||
/datum/component/healing_touch,\
|
||||
|
||||
@@ -169,8 +169,6 @@
|
||||
web_speed = 0.25
|
||||
web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer
|
||||
menu_description = "Avarage speed spider able to heal other spiders and itself together with a fast web laying capability, has low damage and health."
|
||||
///The health HUD applied to the mob.
|
||||
var/health_hud = DATA_HUD_MEDICAL_ADVANCED
|
||||
|
||||
///Used in the caves away mission.
|
||||
/mob/living/basic/spider/giant/nurse/away_caves
|
||||
@@ -179,8 +177,7 @@
|
||||
|
||||
/mob/living/basic/spider/giant/nurse/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/atom_hud/datahud = GLOB.huds[health_hud]
|
||||
datahud.show_to(src)
|
||||
ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT)
|
||||
|
||||
AddComponent(/datum/component/healing_touch,\
|
||||
heal_brute = 10,\
|
||||
|
||||
+1
-4
@@ -92,13 +92,10 @@
|
||||
speed = 0.7
|
||||
web_speed = 0.5
|
||||
web_type = /datum/action/cooldown/mob_cooldown/lay_web/sealer
|
||||
///The health HUD applied to the mob.
|
||||
var/health_hud = DATA_HUD_MEDICAL_ADVANCED
|
||||
|
||||
/mob/living/basic/spider/growing/young/nurse/Initialize(mapload)
|
||||
. = ..()
|
||||
var/datum/atom_hud/datahud = GLOB.huds[health_hud]
|
||||
datahud.show_to(src)
|
||||
ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT)
|
||||
|
||||
AddComponent(/datum/component/healing_touch,\
|
||||
heal_brute = 15,\
|
||||
|
||||
@@ -118,15 +118,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list(
|
||||
return
|
||||
|
||||
to_chat(source, span_notice("[user] is trying to adjust your [jumpsuit.name]'s sensor."))
|
||||
if(!do_after(user, jumpsuit.strip_delay * 0.5, source)) // takes the same amount of time as adjusting it
|
||||
if(!do_after(user, jumpsuit.strip_delay * 0.5, source) || !jumpsuit.set_sensor_mode(new_mode)) // takes the same amount of time as adjusting it
|
||||
source.balloon_alert(user, "failed!")
|
||||
return
|
||||
source.balloon_alert(user, "changed sensors")
|
||||
jumpsuit.sensor_mode = new_mode
|
||||
to_chat(source, span_notice("[user] successfully adjusted your [jumpsuit.name]'s sensor."))
|
||||
if(ishuman(source))
|
||||
var/mob/living/carbon/human/humano = source
|
||||
humano.update_suit_sensors()
|
||||
|
||||
/datum/strippable_item/mob_item_slot/jumpsuit/proc/do_strip_accessory(atom/source, mob/user, obj/item/clothing/under/jumpsuit)
|
||||
var/list/accessory_choices = list()
|
||||
|
||||
@@ -185,7 +185,6 @@
|
||||
if(w_uniform)
|
||||
return
|
||||
w_uniform = equipping
|
||||
update_suit_sensors()
|
||||
update_worn_undersuit()
|
||||
if(ITEM_SLOT_LPOCKET)
|
||||
l_store = equipping
|
||||
@@ -227,7 +226,6 @@
|
||||
update_worn_oversuit()
|
||||
else if(item_dropping == w_uniform)
|
||||
w_uniform = null
|
||||
update_suit_sensors()
|
||||
if(!QDELETED(src))
|
||||
update_worn_undersuit()
|
||||
if(invdrop)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
id = SPECIES_ABDUCTOR
|
||||
sexes = FALSE
|
||||
inherent_traits = list(
|
||||
TRAIT_ABDUCTOR_HUD,
|
||||
TRAIT_CHUNKYFINGERS_IGNORE_BATON,
|
||||
TRAIT_NEVER_WOUNDED,
|
||||
TRAIT_NOBLOOD,
|
||||
@@ -32,16 +33,6 @@
|
||||
return "Abductors do not need to breathe, eat, do not have blood, a heart, stomach, or lungs and cannot be infected by human viruses. \
|
||||
Their hardy physique prevents their skin from being wounded or dismembered, but their chunky tridactyl hands make it hard to operate human equipment."
|
||||
|
||||
/datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load, regenerate_icons)
|
||||
. = ..()
|
||||
var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR]
|
||||
abductor_hud.show_to(C)
|
||||
|
||||
/datum/species/abductor/on_species_loss(mob/living/carbon/C)
|
||||
. = ..()
|
||||
var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR]
|
||||
abductor_hud.hide_from(C)
|
||||
|
||||
/datum/species/abductor/get_species_description()
|
||||
return "Abductors, colloquially known as \"Greys\" (or \"Grays\"), \
|
||||
are, three fingered, pale skinned inquisitive aliens who can't communicate well to the average crew-member."
|
||||
|
||||
@@ -70,6 +70,10 @@
|
||||
|
||||
RegisterSignal(src, COMSIG_MOVABLE_EDIT_UNIQUE_IMMERSE_OVERLAY, PROC_REF(edit_immerse_overlay))
|
||||
|
||||
RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_BASIC_HEALTH_HUD_VISIBLE), PROC_REF(add_to_basic_health_hud))
|
||||
RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_BASIC_HEALTH_HUD_VISIBLE), PROC_REF(remove_from_basic_health_hud))
|
||||
|
||||
|
||||
/// Called when [TRAIT_KNOCKEDOUT] is added to the mob.
|
||||
/mob/living/proc/on_knockedout_trait_gain(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
@@ -297,3 +301,15 @@
|
||||
/mob/living/proc/on_hearing_regain()
|
||||
SIGNAL_HANDLER
|
||||
refresh_looping_ambience()
|
||||
|
||||
/// When gaining [TRAIT_BASIC_HEALTH_HUD_VISIBLE], add to the basic health hud
|
||||
/mob/living/proc/add_to_basic_health_hud(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
var/datum/atom_hud/data/human/medical/basic/hud = GLOB.huds[DATA_HUD_MEDICAL_BASIC]
|
||||
hud.add_atom_to_hud(src)
|
||||
|
||||
/// When losing [TRAIT_BASIC_HEALTH_HUD_VISIBLE], remove from the basic health hud
|
||||
/mob/living/proc/remove_from_basic_health_hud(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
var/datum/atom_hud/data/human/medical/basic/hud = GLOB.huds[DATA_HUD_MEDICAL_BASIC]
|
||||
hud.remove_atom_from_hud(src)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
can_buckle_to = FALSE
|
||||
|
||||
silicon_huds = list(DATA_HUD_MEDICAL_BASIC, DATA_HUD_SECURITY_BASIC, DATA_HUD_DIAGNOSTIC, DATA_HUD_BOT_PATH)
|
||||
silicon_huds = list(TRAIT_MEDICAL_HUD_SENSOR_ONLY, TRAIT_SECURITY_HUD_ID_ONLY, TRAIT_DIAGNOSTIC_HUD, TRAIT_BOT_PATH_HUD)
|
||||
radio = /obj/item/radio/headset/silicon/ai
|
||||
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
///Are our siliconHUDs on? TRUE for yes, FALSE for no.
|
||||
var/sensors_on = TRUE
|
||||
var/list/silicon_huds = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_SECURITY_ADVANCED, DATA_HUD_DIAGNOSTIC)
|
||||
var/list/silicon_huds = list(TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD, TRAIT_DIAGNOSTIC_HUD)
|
||||
|
||||
var/law_change_counter = 0
|
||||
var/obj/machinery/camera/silicon/builtInCamera
|
||||
@@ -417,15 +417,16 @@
|
||||
/mob/living/silicon/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units
|
||||
return -10
|
||||
|
||||
/// Innate, toggleable silicon HUDs
|
||||
#define SILICON_HUD_TRAIT "silicon_hud"
|
||||
|
||||
/mob/living/silicon/proc/remove_sensors()
|
||||
for (var/hud_type in silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type]
|
||||
silicon_hud.hide_from(src)
|
||||
remove_traits(silicon_huds, SILICON_HUD_TRAIT)
|
||||
|
||||
/mob/living/silicon/proc/add_sensors()
|
||||
for (var/hud_type in silicon_huds)
|
||||
var/datum/atom_hud/silicon_hud = GLOB.huds[hud_type]
|
||||
silicon_hud.show_to(src)
|
||||
add_traits(silicon_huds, SILICON_HUD_TRAIT)
|
||||
|
||||
#undef SILICON_HUD_TRAIT
|
||||
|
||||
/mob/living/silicon/proc/toggle_sensors()
|
||||
if(incapacitated)
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
var/turf/nearest_beacon_loc
|
||||
|
||||
///The type of data HUD the bot uses. Diagnostic by default.
|
||||
var/data_hud_type = DATA_HUD_DIAGNOSTIC
|
||||
var/data_hud_type = TRAIT_DIAGNOSTIC_HUD
|
||||
var/datum/atom_hud/data/bot_path/private/path_hud
|
||||
var/path_image_icon = 'icons/mob/silicon/aibots.dmi'
|
||||
var/path_image_icon_state = "path_indicator"
|
||||
@@ -191,8 +191,7 @@
|
||||
|
||||
//If a bot has its own HUD (for player bots), provide it.
|
||||
if(!isnull(data_hud_type))
|
||||
var/datum/atom_hud/datahud = GLOB.huds[data_hud_type]
|
||||
datahud.show_to(src)
|
||||
ADD_TRAIT(src, data_hud_type, INNATE_TRAIT)
|
||||
if(path_hud)
|
||||
path_hud.add_atom_to_hud(src)
|
||||
path_hud.show_to(src)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
radio_channel = RADIO_CHANNEL_SECURITY //Security channel
|
||||
bot_type = SEC_BOT
|
||||
bot_mode_flags = ~BOT_MODE_CAN_BE_SAPIENT
|
||||
data_hud_type = DATA_HUD_SECURITY_ADVANCED
|
||||
data_hud_type = TRAIT_SECURITY_HUD
|
||||
hackables = "target identification systems"
|
||||
path_image_color = COLOR_RED
|
||||
possessed_message = "You are a securitron! Guard the station to the best of your ability!"
|
||||
|
||||
+33
-2
@@ -1665,13 +1665,44 @@
|
||||
for(var/hud_trait in GLOB.trait_to_hud)
|
||||
RegisterSignal(src, SIGNAL_ADDTRAIT(hud_trait), PROC_REF(hud_trait_enabled))
|
||||
RegisterSignal(src, SIGNAL_REMOVETRAIT(hud_trait), PROC_REF(hud_trait_disabled))
|
||||
for(var/hud_trait in GLOB.trait_blockers_to_hud)
|
||||
RegisterSignal(src, SIGNAL_ADDTRAIT(hud_trait), PROC_REF(hud_trait_blocker_gained))
|
||||
RegisterSignal(src, SIGNAL_REMOVETRAIT(hud_trait), PROC_REF(hud_trait_blocker_lost))
|
||||
|
||||
/mob/proc/hud_trait_enabled(datum/source, new_trait)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/blocker, blocked_traits in GLOB.trait_blockers_to_hud)
|
||||
if(HAS_TRAIT(src, blocker) && (new_trait in blocked_traits))
|
||||
return
|
||||
|
||||
var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[new_trait]]
|
||||
datahud.show_to(src)
|
||||
|
||||
/mob/proc/hud_trait_disabled(datum/source, new_trait)
|
||||
/mob/proc/hud_trait_disabled(datum/source, lost_trait)
|
||||
SIGNAL_HANDLER
|
||||
var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[new_trait]]
|
||||
|
||||
for(var/blocker, blocked_traits in GLOB.trait_blockers_to_hud)
|
||||
if(HAS_TRAIT(src, blocker) && (lost_trait in blocked_traits))
|
||||
return // it may seem counterintuitive to check for blockers on trait removal, the blocker now has total reign over whether the hud should come back
|
||||
|
||||
var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[lost_trait]]
|
||||
datahud.hide_from(src)
|
||||
|
||||
/mob/proc/hud_trait_blocker_gained(datum/source, new_trait)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/trait in GLOB.trait_blockers_to_hud[new_trait])
|
||||
if(!HAS_TRAIT(src, trait))
|
||||
continue
|
||||
var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[trait]]
|
||||
datahud.hide_from(src)
|
||||
|
||||
/mob/proc/hud_trait_blocker_lost(datum/source, new_trait)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/trait in GLOB.trait_blockers_to_hud[new_trait])
|
||||
if(!HAS_TRAIT(src, trait))
|
||||
continue
|
||||
var/datum/atom_hud/datahud = GLOB.huds[GLOB.trait_to_hud[trait]]
|
||||
datahud.show_to(src)
|
||||
|
||||
@@ -344,8 +344,7 @@
|
||||
// Or on crew monitors
|
||||
var/obj/item/clothing/under/sensor_clothes = spawned_human.w_uniform
|
||||
if(istype(sensor_clothes))
|
||||
sensor_clothes.sensor_mode = SENSOR_OFF
|
||||
spawned_human.update_suit_sensors()
|
||||
sensor_clothes.set_sensor_mode(SENSOR_OFF)
|
||||
|
||||
//don't use this in subtypes, just add 1000 brute yourself. that being said, this is a type that has 1000 brute. it doesn't really have a home anywhere else, it just needs to exist
|
||||
/obj/effect/mob_spawn/corpse/human/damaged
|
||||
|
||||
@@ -59,12 +59,8 @@
|
||||
var/master_name
|
||||
/// DNA string for owner verification
|
||||
var/master_dna
|
||||
/// Toggles whether the Medical HUD is active or not
|
||||
var/medHUD = FALSE
|
||||
/// Used as currency to purchase different abilities
|
||||
var/ram = 100
|
||||
/// Toggles whether the Security HUD is active or not
|
||||
var/secHUD = FALSE
|
||||
/// The current leash to the owner
|
||||
var/datum/component/leash/leash
|
||||
|
||||
|
||||
@@ -219,6 +219,9 @@
|
||||
stack_trace("Invalid mode passed to host scan: [mode || "null"]")
|
||||
return FALSE
|
||||
|
||||
/// Huds from PAI software
|
||||
#define PAI_HUD_TRAIT "pai_hud"
|
||||
|
||||
/**
|
||||
* Proc that toggles any active huds based on the option.
|
||||
*
|
||||
@@ -227,18 +230,16 @@
|
||||
/mob/living/silicon/pai/proc/toggle_hud(mode)
|
||||
if(isnull(mode))
|
||||
return FALSE
|
||||
var/datum/atom_hud/hud
|
||||
var/hud_on
|
||||
if(mode == PAI_TOGGLE_MEDICAL_HUD)
|
||||
hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED]
|
||||
medHUD = !medHUD
|
||||
hud_on = medHUD
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_MEDICAL_HUD, PAI_HUD_TRAIT))
|
||||
REMOVE_TRAIT(src, TRAIT_MEDICAL_HUD, PAI_HUD_TRAIT)
|
||||
else
|
||||
ADD_TRAIT(src, TRAIT_MEDICAL_HUD, PAI_HUD_TRAIT)
|
||||
if(mode == PAI_TOGGLE_SECURITY_HUD)
|
||||
hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
|
||||
secHUD = !secHUD
|
||||
hud_on = secHUD
|
||||
if(hud_on)
|
||||
hud.show_to(src)
|
||||
else
|
||||
hud.hide_from(src)
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_SECURITY_HUD, PAI_HUD_TRAIT))
|
||||
REMOVE_TRAIT(src, TRAIT_SECURITY_HUD, PAI_HUD_TRAIT)
|
||||
else
|
||||
ADD_TRAIT(src, TRAIT_SECURITY_HUD, PAI_HUD_TRAIT)
|
||||
return TRUE
|
||||
|
||||
#undef PAI_HUD_TRAIT
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
#include "holder_loving.dm"
|
||||
#include "holidays.dm"
|
||||
#include "holofan_placement.dm"
|
||||
#include "huds.dm"
|
||||
#include "hulk.dm"
|
||||
#include "human_through_recycler.dm"
|
||||
#include "hunger_curse.dm"
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/// Tests huds are applied and removed correctly when relevant traits are added/removed
|
||||
/datum/unit_test/huds
|
||||
|
||||
/datum/unit_test/huds/Run()
|
||||
var/datum/atom_hud/testhud = GLOB.huds[GLOB.trait_to_hud[TRAIT_SECURITY_HUD]]
|
||||
var/mob/living/carbon/human/consistent/dummy = allocate(__IMPLIED_TYPE__)
|
||||
|
||||
ADD_TRAIT(dummy, TRAIT_SECURITY_HUD, TRAIT_SOURCE_UNIT_TESTS)
|
||||
TEST_ASSERT(!!testhud.hud_users_all_z_levels[dummy], "HUD not applied when trait of HUD was added")
|
||||
|
||||
ADD_TRAIT(dummy, TRAIT_BLOCK_SECHUD, TRAIT_SOURCE_UNIT_TESTS)
|
||||
TEST_ASSERT(!testhud.hud_users_all_z_levels[dummy], "HUD not removed when trait blocking HUD was added")
|
||||
|
||||
REMOVE_TRAIT(dummy, TRAIT_BLOCK_SECHUD, TRAIT_SOURCE_UNIT_TESTS)
|
||||
TEST_ASSERT(!!testhud.hud_users_all_z_levels[dummy], "HUD not reapplied when trait blocking HUD was removed")
|
||||
|
||||
REMOVE_TRAIT(dummy, TRAIT_SECURITY_HUD, TRAIT_SOURCE_UNIT_TESTS)
|
||||
TEST_ASSERT(!testhud.hud_users_all_z_levels[dummy], "HUD not removed when trait of HUD was removed")
|
||||
@@ -14,15 +14,16 @@
|
||||
|
||||
/obj/vehicle/sealed/mecha/odysseus/moved_inside(mob/living/carbon/human/human)
|
||||
. = ..()
|
||||
if(. && !HAS_TRAIT(human, TRAIT_MEDICAL_HUD))
|
||||
ADD_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
|
||||
if(!.)
|
||||
return
|
||||
ADD_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
|
||||
|
||||
/obj/vehicle/sealed/mecha/odysseus/remove_occupant(mob/living/carbon/human/human)
|
||||
if(isliving(human) && HAS_TRAIT_FROM(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT))
|
||||
REMOVE_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
|
||||
REMOVE_TRAIT(human, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
|
||||
return ..()
|
||||
|
||||
/obj/vehicle/sealed/mecha/odysseus/mmi_moved_inside(obj/item/mmi/MMI, mob/user)
|
||||
. = ..()
|
||||
if(. && !isnull(MMI.brainmob) && !HAS_TRAIT(MMI.brainmob, TRAIT_MEDICAL_HUD))
|
||||
ADD_TRAIT(MMI.brainmob, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
|
||||
if(!. || isnull(MMI.brainmob))
|
||||
return
|
||||
ADD_TRAIT(MMI.brainmob, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)
|
||||
|
||||
Reference in New Issue
Block a user