From 3103f9c413fe9eea35360c369bf806d30669fc7b Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Tue, 14 Apr 2026 03:58:40 +0200 Subject: [PATCH] Adds a Tactical IFF Visor and slightly refactors eye rendering (#95547) ## About The Pull Request A new cybernetic eye implant, the tactical IFF visor, has been added to the game, available in the combat implants research node. Its main features are a cool LED display, dynamic color correction to make distinguishing important objects easier, and inbuilt IFF systems capable of distinguishing and highlighting allies and potential threats. They also give flash/welding protection and mild night-vision capabilities. However, this comes at a downside of making the user completely unable to distinguish appearances or voices, or even examine others. Everyone will simply show up as Unknown and be completely covered in static, bar the threat assessment outline. Examining will only display their threat status according to threat settings in the visor. The parameters for threat assessment (both ID access and security flag-based), as well as the visor display, can be configured by the user at any time. When emagged, the visor will instead completely hide and mute all mobs except the user themselves, leaving them completely "alone" on the station. Deathsquads get an unmodifiable version, configured to treat anyone but CentCom personnel as hostiles. Settings can also be adjusted before installation with a multitool, and locked using a screwdriver, preventing users from accessing them when installed. --- Eye rendering has been slightly refactored in order to support the monovisor, as well as to get rid of duplicate code (and missing features) on dismembered heads. Also moth eyes once again should block emissives properly. ## Why It's Good For The Game New content for both gameplay and roleplay, and fits deathsquad's purpose very well. --- .../signals/signals_mob/signals_mob_main.dm | 2 +- code/__DEFINES/mobs.dm | 3 + code/__DEFINES/say.dm | 2 + code/datums/brain_damage/special.dm | 2 +- code/datums/components/security_vision.dm | 2 +- code/game/say.dm | 2 +- .../blood_worm/blood_worm_text_feedback.dm | 2 +- code/modules/clothing/head/jobs.dm | 2 +- code/modules/clothing/outfits/ert.dm | 3 + .../living/carbon/human/human_update_icons.dm | 18 +- code/modules/mob/living/living_say.dm | 7 +- code/modules/mob/mob.dm | 5 +- .../research/designs/medical_designs.dm | 19 + .../research/techweb/nodes/cyborg_nodes.dm | 1 + code/modules/surgery/bodyparts/head.dm | 29 +- .../surgery/organs/internal/eyes/_eyes.dm | 653 +----------- .../organs/internal/eyes/eyes_augments.dm | 965 ++++++++++++++++++ .../organs/internal/eyes/eyes_species.dm | 113 ++ icons/mob/human/human_eyes.dmi | Bin 3149 -> 3491 bytes icons/obj/medical/organs/organs.dmi | Bin 58932 -> 50469 bytes tgstation.dme | 2 + .../tgui/interfaces/TacVisorEyesMenu.tsx | 75 ++ 22 files changed, 1240 insertions(+), 667 deletions(-) create mode 100644 code/modules/surgery/organs/internal/eyes/eyes_augments.dm create mode 100644 code/modules/surgery/organs/internal/eyes/eyes_species.dm create mode 100644 tgui/packages/tgui/interfaces/TacVisorEyesMenu.tsx diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index c26c80a652f..b3b6acefd23 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -120,7 +120,7 @@ #define COMSIG_MOB_ATTACK_ALIEN "mob_attack_alien" ///from base of /mob/throw_item(): (atom/target) #define COMSIG_MOB_THROW "mob_throw" -///from base of /mob/verb/examinate(): (atom/target, list/examine_strings) +///from base of /mob/verb/examinate(): (atom/target, list/examine_strings, list/examine_overrides) #define COMSIG_MOB_EXAMINING "mob_examining" ///from base of /mob/verb/examinate(): (atom/target) #define COMSIG_MOB_EXAMINATE "mob_examinate" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7deeeee743d..2e7a1894898 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -608,6 +608,9 @@ /// If you yawn while someone nearby has examined you within this time frame, it will force them to yawn as well. Tradecraft! #define YAWN_PROPAGATION_EXAMINE_WINDOW (2 SECONDS) +// Priorities for examine overrides +#define EXAMINE_OVERRIDE_PRIORITY_IFF 1 + /// How far away you can be to make eye contact with someone while examining #define EYE_CONTACT_RANGE 5 diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index d1da7ea0976..9b8496f22fd 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -73,6 +73,8 @@ #define MODE_CUSTOM_SAY_ERASE_INPUT "erase_input" /// Message is being relayed through another object #define MODE_RELAY "relayed" +/// Override the mob's name +#define MODE_SPEAKER_NAME_OVERRIDE "speaker_name_override" //Spans. Robot speech, italics, etc. Applied in compose_message(). #define SPAN_ROBOT "robot" diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index e4e6847011f..469a5b90562 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -701,7 +701,7 @@ to_chat(owner, span_warning("Should I really leave it here?")) owner.add_mood_event("fireaxe", /datum/mood_event/axe_neutral) -/datum/brain_trauma/special/axedoration/proc/on_examine(mob/source, atom/target, list/examine_strings) +/datum/brain_trauma/special/axedoration/proc/on_examine(mob/source, atom/target, list/examine_strings, list/examine_overrides) SIGNAL_HANDLER if(!istype(target, /obj/item/fireaxe)) return diff --git a/code/datums/components/security_vision.dm b/code/datums/components/security_vision.dm index 5c2b88fffd3..f26b7121d8e 100644 --- a/code/datums/components/security_vision.dm +++ b/code/datums/components/security_vision.dm @@ -19,7 +19,7 @@ UnregisterSignal(parent, COMSIG_MOB_EXAMINING) /// When we examine something, check if we have any extra data to add -/datum/component/security_vision/proc/on_examining(mob/source, atom/target, list/examine_strings) +/datum/component/security_vision/proc/on_examining(mob/source, atom/target, list/examine_strings, list/examine_overrides) SIGNAL_HANDLER if (!isliving(target)) return diff --git a/code/game/say.dm b/code/game/say.dm index 7199fe3e377..4413e353400 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -149,7 +149,7 @@ GLOBAL_LIST_INIT(freqtospan, list( //Radio freq/name display var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq, radio_freq_name)]\] " : "" //Speaker name - var/namepart = speaker.get_message_voice(visible_name) + var/namepart = message_mods[MODE_SPEAKER_NAME_OVERRIDE] || speaker.get_message_voice(visible_name) //End name span. var/endspanpart = "" diff --git a/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm b/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm index 5be1c9c46c3..d11dc64ce83 100644 --- a/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm +++ b/code/modules/antagonists/blood_worm/blood_worm_text_feedback.dm @@ -4,7 +4,7 @@ /mob/living/basic/blood_worm/examining(atom/target, list/result) add_special_examining_messages(target, result) -/mob/living/basic/blood_worm/proc/on_host_examining(datum/source, atom/target, list/examine_strings) +/mob/living/basic/blood_worm/proc/on_host_examining(datum/source, atom/target, list/examine_strings, list/examine_overrides) SIGNAL_HANDLER add_special_examining_messages(target, examine_strings) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index b7dc17cce85..f83b70bfa2f 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -713,7 +713,7 @@ . = ..() UnregisterSignal(user, COMSIG_MOB_EXAMINING_MORE) -/obj/item/clothing/head/utility/head_mirror/proc/examining(mob/living/examiner, atom/examining, list/examine_list) +/obj/item/clothing/head/utility/head_mirror/proc/examining(mob/living/examiner, atom/examining, list/examine_list, list/examine_overrides) SIGNAL_HANDLER if(!ishuman(examining) || examining == examiner || examiner.is_blind() || !examiner.Adjacent(examining)) return diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index e9440c2e32c..02bbb550363 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -457,6 +457,9 @@ ) /datum/outfit/centcom/death_commando/post_equip(mob/living/carbon/human/squaddie, visuals_only = FALSE) + var/obj/item/organ/eyes/robotic/tacvisor/deathsquad/visor = new() + visor.Insert(squaddie, movement_flags = DELETE_IF_REPLACED) + if(visuals_only) return diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index c55a85b9de8..20a79e80217 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -898,15 +898,19 @@ generate/load female uniform sprites matching all previously decided variables remove_overlay(EYES_LAYER) if(HAS_TRAIT(src, TRAIT_HUSK) || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) return - var/obj/item/bodypart/head/noggin = get_bodypart(BODY_ZONE_HEAD) - if(!(noggin?.head_flags & HEAD_EYESPRITES)) - return + // eyes (missing eye sprites get handled by the head itself, but sadly we have to do this stupid shit here, for now) var/obj/item/organ/eyes/eye_organ = get_organ_slot(ORGAN_SLOT_EYES) - if(eye_organ) - eye_organ.refresh(call_update = FALSE) - overlays_standing[EYES_LAYER] = eye_organ.generate_body_overlay(src) - apply_overlay(EYES_LAYER) + if (!eye_organ) + return + + var/obj/item/bodypart/head/noggin = get_bodypart(deprecise_zone(eye_organ.zone)) // Futureproofing for HARS/weird species + if(istype(noggin) && !(noggin?.head_flags & HEAD_EYESPRITES)) + return + + eye_organ.refresh(call_update = FALSE) + overlays_standing[EYES_LAYER] = eye_organ.generate_body_overlay(src, noggin) + apply_overlay(EYES_LAYER) /// Updates face (as of now, only eye) offsets /mob/living/carbon/human/update_face_offset() diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 6c332091709..6926d6abe99 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -296,6 +296,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/dist = get_dist(speaker, src) - message_range if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) raw_message = stars(raw_message) + var/speaker_name = span_name("[message_mods[MODE_SPEAKER_NAME_OVERRIDE] || speaker]") if(message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(src, TRAIT_GOOD_HEARING)) // Too far away and don't have good hearing, you can't hear anything if(is_blind() || HAS_TRAIT(speaker, TRAIT_INVISIBLE_MAN)) // Can't see them speak either @@ -305,7 +306,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( // But we can still see them speak if(speaker_is_signing) - deaf_message = "[span_name("[speaker]")] [speaker.get_default_say_verb()] something, but the motions are too subtle to make out from afar." + deaf_message = "[speaker_name] [speaker.get_default_say_verb()] something, but the motions are too subtle to make out from afar." else if(!HAS_TRAIT(src, TRAIT_DEAF)) // If we can't hear we want to continue to the default deaf message if(isliving(speaker)) var/mob/living/living_speaker = speaker @@ -313,7 +314,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(mouth_hidden && !HAS_TRAIT(src, TRAIT_SEE_MASK_WHISPER)) // Can't see them speak if their mouth is covered or hidden, unless we're an empath return FALSE - deaf_message = "[span_name("[speaker]")] [speaker.verb_whisper] something, but you are too far away to hear [speaker.p_them()]." + deaf_message = "[speaker_name] [speaker.verb_whisper] something, but you are too far away to hear [speaker.p_them()]." if(deaf_message) deaf_type = MSG_VISUAL @@ -353,7 +354,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(speaker != src) if(!radio_freq) //These checks have to be separate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. - deaf_message = "[span_name("[speaker]")] [speaker.get_default_say_verb()] something but you cannot hear [speaker.p_them()]." + deaf_message = "[speaker_name] [speaker.get_default_say_verb()] something but you cannot hear [speaker.p_them()]." deaf_type = MSG_VISUAL else deaf_message = span_notice("You can't hear yourself!") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4d746c9fdf6..d8285681d95 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -589,7 +589,10 @@ var/list/result = examinify.examine(src) var/atom_title = examinify.examine_title(src, thats = TRUE) examining(examinify, result) - SEND_SIGNAL(src, COMSIG_MOB_EXAMINING, examinify, result) + var/alist/overrides = alist() + SEND_SIGNAL(src, COMSIG_MOB_EXAMINING, examinify, result, overrides) + if (length(overrides)) + result = overrides[max(overrides)] if(removes_double_click) result += span_notice("You can examine [examinify] closer...") result_combined = (atom_title ? fieldset_block("[atom_title].", jointext(result, "
"), "boxed_message") : boxed_message(jointext(result, "
"))) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index bcc98287e24..b46ce807541 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -581,6 +581,25 @@ id = "ci-thermals-moth" build_path = /obj/item/organ/eyes/robotic/thermals/moth +/datum/design/cyberimp_tacvisor + name = "Tactical IFF Visor" + desc = "A sick IFF visor with an inbuilt LED display. May critically overload the user's prefrontal cortex." + id = "ci-tacvisor" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 6 SECONDS + materials = list( + /datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/glass = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4, + /datum/material/gold = SMALL_MATERIAL_AMOUNT * 6, + /datum/material/plasma = HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/organ/eyes/robotic/tacvisor + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_ORGANS_COMBAT + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + /datum/design/cyberimp_antidrop name = "Anti-Drop Implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index fee377af77c..66da933c1ae 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -183,6 +183,7 @@ "ci-reviver", "ci-antidrop", "ci-antistun", + "ci-tacvisor", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) announce_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_MEDICAL) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 9487373d2cc..ce5e8c669e8 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -222,32 +222,9 @@ . += no_eyes return - if(!eyes.eye_icon_state || !(head_flags & HEAD_EYESPRITES)) - return - - // This is a bit of copy/paste code from eyes.dm:generate_body_overlay - var/image/eye_left = image(eyes.eye_icon, "[eyes.eye_icon_state]_l", -EYES_LAYER, SOUTH) - var/image/eye_right = image(eyes.eye_icon, "[eyes.eye_icon_state]_r", -EYES_LAYER, SOUTH) - if(head_flags & HEAD_EYECOLOR) - if(eyes.eye_color_left) - eye_left.color = eyes.eye_color_left - if(eyes.eye_color_right) - eye_right.color = eyes.eye_color_right - - var/list/emissive_overlays = eyes.get_emissive_overlays(eye_left, eye_right, src) - if(length(emissive_overlays)) - eye_left.overlays += image(emissive_overlays[1], dir = SOUTH) - eye_right.overlays += image(emissive_overlays[2], dir = SOUTH) - else if(blocks_emissive != EMISSIVE_BLOCK_NONE) - eye_left.overlays += image(emissive_blocker(eye_left.icon, eye_left.icon_state, src, alpha = eye_left.alpha), dir = SOUTH) - eye_right.overlays += image(emissive_blocker(eye_right.icon, eye_right.icon_state, src, alpha = eye_right.alpha), dir = SOUTH) - - if(worn_face_offset) - worn_face_offset.apply_offset(eye_left) - worn_face_offset.apply_offset(eye_right) - - . += eye_left - . += eye_right + if(head_flags & HEAD_EYESPRITES) + for (var/mutable_appearance/overlay as anything in eyes.generate_body_overlay(null, src)) + . += image(overlay, dir = SOUTH) /obj/item/bodypart/head/get_voice(add_id_name) return "The head of [get_face_name()]" diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index b6152e8b0ce..64285ea5afc 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -286,45 +286,46 @@ return ..() || (owner.stat != DEAD && !HAS_TRAIT(owner, TRAIT_KNOCKEDOUT) && (owner.is_blind() || owner.is_nearsighted())) /// This proc generates a list of overlays that the eye should be displayed using for the given parent -/obj/item/organ/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent) - if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/eyes) != src) - CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.") - +/obj/item/organ/eyes/proc/generate_body_overlay(mob/living/carbon/human/parent, obj/item/bodypart/limb) if(isnull(eye_icon_state)) return list() - var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -EYES_LAYER, parent) - var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -EYES_LAYER, parent) + var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -EYES_LAYER, parent || limb) + var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -EYES_LAYER, parent || limb) var/list/overlays = list(eye_left, eye_right) - if(!(parent.obscured_slots & HIDEEYES)) - overlays += get_emissive_overlays(eye_left, eye_right, parent) + if(!(parent?.obscured_slots & HIDEEYES)) + overlays += get_emissive_overlays(eye_left, eye_right, parent || limb) - var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) - - if(!my_head) + if(!limb) return overlays - if(my_head.head_flags & HEAD_EYECOLOR) - eye_right.color = parent.get_right_eye_color() - eye_left.color = parent.get_left_eye_color() - var/list/eyelids = setup_eyelids(eye_left, eye_right, parent) - if (LAZYLEN(eyelids)) - overlays += eyelids + // Futureproofing for HARS/weird species + var/obj/item/bodypart/head/head = astype(limb, /obj/item/bodypart/head) + if(head?.head_flags & HEAD_EYECOLOR) + if (parent) + eye_right.color = parent.get_right_eye_color() + eye_left.color = parent.get_left_eye_color() + var/list/eyelids = setup_eyelids(eye_left, eye_right, parent) + if (LAZYLEN(eyelids)) + overlays += eyelids + else + eye_right.color = eye_color_right + eye_left.color = eye_color_left if (scarring & RIGHT_EYE_SCAR) - var/mutable_appearance/right_scar = mutable_appearance('icons/mob/human/human_eyes.dmi', "eye_scar_right", -EYES_LAYER, parent) - right_scar.color = my_head.draw_color + var/mutable_appearance/right_scar = mutable_appearance('icons/mob/human/human_eyes.dmi', "eye_scar_right", -EYES_LAYER, parent || limb) + right_scar.color = limb.draw_color overlays += right_scar if (scarring & LEFT_EYE_SCAR) - var/mutable_appearance/left_scar = mutable_appearance('icons/mob/human/human_eyes.dmi', "eye_scar_left", -EYES_LAYER, parent) - left_scar.color = my_head.draw_color + var/mutable_appearance/left_scar = mutable_appearance('icons/mob/human/human_eyes.dmi', "eye_scar_left", -EYES_LAYER, parent || limb) + left_scar.color = limb.draw_color overlays += left_scar - if(my_head.worn_face_offset) + if(head?.worn_face_offset) for (var/mutable_appearance/overlay as anything in overlays) - my_head.worn_face_offset.apply_offset(overlay) + head.worn_face_offset.apply_offset(overlay) return overlays @@ -336,9 +337,14 @@ emissive_effect = EMISSIVE_BLOOM else if((owner && HAS_TRAIT(owner, TRAIT_REFLECTIVE_EYES)) || (TRAIT_REFLECTIVE_EYES in organ_traits)) emissive_effect = EMISSIVE_SPECULAR + if(emissive_effect) return_list += emissive_appearance(eye_left.icon, eye_left.icon_state, spokesman, -EYES_LAYER, alpha = eye_left.alpha, effect_type = emissive_effect) return_list += emissive_appearance(eye_right.icon, eye_right.icon_state, spokesman, -EYES_LAYER, alpha = eye_right.alpha, effect_type = emissive_effect) + else + return_list += emissive_blocker(eye_left.icon, eye_left.icon_state, spokesman, -EYES_LAYER, alpha = eye_left.alpha) + return_list += emissive_blocker(eye_right.icon, eye_right.icon_state, spokesman, -EYES_LAYER, alpha = eye_right.alpha) + return return_list /obj/item/organ/eyes/update_overlays() @@ -606,604 +612,3 @@ #undef NIGHTVISION_LIGHT_LOW #undef NIGHTVISION_LIGHT_MID #undef NIGHTVISION_LIGHT_HIG - -/obj/item/organ/eyes/night_vision/mushroom - name = "fung-eye" - desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." - low_light_cutoff = list(0, 15, 20) - medium_light_cutoff = list(0, 20, 35) - high_light_cutoff = list(0, 40, 50) - pupils_name = "photosensory openings" - penlight_message = "are attached to fungal stalks" - -/obj/item/organ/eyes/zombie - name = "undead eyes" - desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." - color_cutoffs = list(25, 35, 5) - penlight_message = "are rotten and decayed!" - -/obj/item/organ/eyes/zombie/penlight_examine(mob/living/viewer, obj/item/examtool) - return span_danger("[owner.p_Their()] eyes [penlight_message]") - -/obj/item/organ/eyes/alien - name = "alien eyes" - desc = "It turned out they had them after all!" - sight_flags = SEE_MOBS - color_cutoffs = list(25, 5, 42) - -/obj/item/organ/eyes/golem - name = "resonating crystal" - desc = "Golems somehow measure external light levels and detect nearby ore using this sensitive mineral lattice." - icon_state = "adamantine_cords" - eye_icon_state = null - blink_animation = FALSE - iris_overlay = null - color = COLOR_GOLEM_GRAY - visual = FALSE - organ_flags = ORGAN_MINERAL - color_cutoffs = list(10, 15, 5) - actions_types = list(/datum/action/cooldown/golem_ore_sight) - penlight_message = "glimmer, their crystaline structure refracting light inwards" - pupils_name = "lensing gems" ///given it says these are a "mineral lattice" that collects light i assume they work like artifical ruby laser foci - -/// Send an ore detection pulse on a cooldown -/datum/action/cooldown/golem_ore_sight - name = "Ore Resonance" - desc = "Causes nearby ores to vibrate, revealing their location." - button_icon = 'icons/obj/devices/scanner.dmi' - button_icon_state = "manual_mining" - check_flags = AB_CHECK_CONSCIOUS - cooldown_time = 10 SECONDS - -/datum/action/cooldown/golem_ore_sight/Activate(atom/target) - . = ..() - mineral_scan_pulse(get_turf(target), scanner = target) - -///Robotic - -/obj/item/organ/eyes/robotic - name = "robotic eyes" - desc = "Your vision is augmented." - icon_state = "eyes_cyber" - organ_flags = ORGAN_ROBOTIC - failing_desc = "seems to be broken." - pupils_name = "apertures" - penlight_message = "are cybernetic, click-whirring as they refocus" - -/obj/item/organ/eyes/robotic/emp_act(severity) - . = ..() - if((. & EMP_PROTECT_SELF) || !owner) - return - if(prob(10 * severity)) - return - to_chat(owner, span_warning("Static obfuscates your vision!")) - owner.flash_act(visual = 1) - -/obj/item/organ/eyes/robotic/basic - name = "basic robotic eyes" - desc = "A pair of basic cybernetic eyes that restore vision, but at some vulnerability to light." - icon_state = "eyes_cyber_basic" - iris_overlay = null - eye_color_left = "#2f3032" - eye_color_right = "#2f3032" - flash_protect = FLASH_PROTECTION_SENSITIVE - penlight_message = "are low grade cybernetics, poorly compensating for the light" - -/obj/item/organ/eyes/robotic/basic/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(prob(10 * severity)) - apply_organ_damage(20 * severity) - to_chat(owner, span_warning("Your eyes start to fizzle in their sockets!")) - do_sparks(2, TRUE, owner) - owner.emote("scream") - -/obj/item/organ/eyes/robotic/xray - name = "x-ray eyes" - desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." - icon_state = "eyes_cyber_xray" - iris_overlay = null - eye_color_left = "#3cb8a5" - eye_color_right = "#3cb8a5" - sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - flash_protect = FLASH_PROTECTION_SENSITIVE - organ_traits = list(TRAIT_XRAY_VISION) - penlight_message = "are replaced by small radiation emitters and detectors" - -/obj/item/organ/eyes/robotic/thermals - name = "thermal eyes" - desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." - icon_state = "eyes_cyber_thermal" - iris_overlay = null - eye_color_left = "#ce2525" - eye_color_right = "#ce2525" - // We're gonna downshift green and blue a bit so darkness looks yellow - color_cutoffs = list(25, 8, 5) - sight_flags = SEE_MOBS - flash_protect = FLASH_PROTECTION_SENSITIVE - pupils_name = "slit aperatures" - penlight_message = "are cybernetic, with vertically slit metalic lenses." - -/obj/item/organ/eyes/robotic/flashlight - name = "flashlight eyes" - desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" - icon_state = "flashlight_eyes" - eye_color_left = "#fee5a3" - eye_color_right = "#fee5a3" - iris_overlay = null - flash_protect = FLASH_PROTECTION_WELDER - tint = INFINITY - custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.9) - var/obj/item/flashlight/eyelight/eye - light_reactive = FALSE - pupils_name = "flashlights" - penlight_message = "are actually two flashlights taped together. ...why" - -/obj/item/organ/eyes/robotic/flashlight/Initialize(mapload) - . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) - -/obj/item/organ/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim) - . = ..() - if(!eye) - eye = new /obj/item/flashlight/eyelight() - eye.set_light_on(TRUE) - eye.forceMove(victim) - eye.update_brightness(victim) - victim.become_blind(FLASHLIGHT_EYES) - -/obj/item/organ/eyes/robotic/flashlight/on_mob_remove(mob/living/carbon/victim) - . = ..() - eye.set_light_on(FALSE) - eye.update_brightness(victim) - eye.forceMove(src) - victim.cure_blind(FLASHLIGHT_EYES) - -// Welding shield implant -/obj/item/organ/eyes/robotic/shield - name = "shielded robotic eyes" - desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." - icon_state = "eyes_cyber_shield" - iris_overlay = null - eye_color_left = "#353845" - eye_color_right = "#353845" - flash_protect = FLASH_PROTECTION_WELDER - pupils_name = "flash shields" - penlight_message = "have polarized cybernetic lenses, blocking bright lights" - -/obj/item/organ/eyes/robotic/shield/Initialize(mapload) - . = ..() - AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) - -#define MATCH_LIGHT_COLOR 1 -#define USE_CUSTOM_COLOR 0 -#define UPDATE_LIGHT 0 -#define UPDATE_EYES_LEFT 1 -#define UPDATE_EYES_RIGHT 2 - -/obj/item/organ/eyes/robotic/glow - name = "high luminosity eyes" - desc = "Special glowing eyes, used by snowflakes who want to be special." - icon_state = "eyes_cyber_glow" - iris_overlay = "eyes_cyber_glow_iris" - eye_color_left = "#19191a" - eye_color_right = "#19191a" - actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle) - var/max_light_beam_distance = 5 - var/obj/item/flashlight/eyelight/glow/eye - /// base icon state for eye overlays - var/base_eye_state = "eyes_glow_gs" - /// Whether or not to match the eye color to the light or use a custom selection - var/eye_color_mode = USE_CUSTOM_COLOR - /// The selected color for the light beam itself - var/light_color_string = "#ffffff" - /// The custom selected eye color for the left eye. Defaults to the mob's natural eye color - var/left_eye_color_string - /// The custom selected eye color for the right eye. Defaults to the mob's natural eye color - var/right_eye_color_string - penlight_message = "shine back with cybernetic LEDs" - -/obj/item/organ/eyes/robotic/glow/Initialize(mapload) - . = ..() - eye = new /obj/item/flashlight/eyelight/glow - -/obj/item/organ/eyes/robotic/glow/Destroy() - . = ..() - deactivate(close_ui = TRUE) - QDEL_NULL(eye) - -/obj/item/organ/eyes/robotic/glow/emp_act(severity) - . = ..() - if(!eye.light_on || . & EMP_PROTECT_SELF) - return - deactivate(close_ui = TRUE) - -/// Set the initial color of the eyes on insert to be the mob's previous eye color. -/obj/item/organ/eyes/robotic/glow/on_mob_insert(mob/living/carbon/eye_recipient, special = FALSE, movement_flags) - . = ..() - left_eye_color_string = eye_color_left - right_eye_color_string = eye_color_right - update_mob_eye_color(eye_recipient) - deactivate(close_ui = TRUE) - eye.forceMove(eye_recipient) - -/obj/item/organ/eyes/robotic/glow/on_mob_remove(mob/living/carbon/eye_owner) - deactivate(eye_owner, close_ui = TRUE) - if(!QDELETED(eye)) - eye.forceMove(src) - return ..() - -/obj/item/organ/eyes/robotic/glow/ui_state(mob/user) - return GLOB.default_state - -/obj/item/organ/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state) - if(!QDELETED(owner)) - if(owner == user) - return min( - ui_status_user_is_abled(user, src), - ui_status_only_living(user), - ) - else return UI_CLOSE - return ..() - -/obj/item/organ/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "HighLuminosityEyesMenu") - ui.autoupdate = FALSE - ui.open() - -/obj/item/organ/eyes/robotic/glow/ui_data(mob/user) - var/list/data = list() - - data["eyeColor"] = list( - mode = eye_color_mode, - hasOwner = owner ? TRUE : FALSE, - left = left_eye_color_string, - right = right_eye_color_string, - ) - data["lightColor"] = light_color_string - data["range"] = eye.light_range - - return data - -/obj/item/organ/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return - - switch(action) - if("set_range") - var/new_range = params["new_range"] - set_beam_range(new_range) - return TRUE - if("pick_color") - var/new_color = tgui_color_picker( - usr, - "Choose eye color color:", - "High Luminosity Eyes Menu", - light_color_string - ) - if(new_color) - var/to_update = params["to_update"] - set_beam_color(new_color, to_update) - return TRUE - if("enter_color") - var/new_color = LOWER_TEXT(params["new_color"]) - var/to_update = params["to_update"] - set_beam_color(new_color, to_update, sanitize = TRUE) - return TRUE - if("random_color") - var/to_update = params["to_update"] - randomize_color(to_update) - return TRUE - if("toggle_eye_color") - toggle_eye_color_mode() - return TRUE - -/obj/item/organ/eyes/robotic/glow/ui_action_click(mob/user, action) - if(istype(action, /datum/action/item_action/organ_action/toggle)) - toggle_active() - else if(istype(action, /datum/action/item_action/organ_action/use)) - ui_interact(user) - -/** - * Activates the light - * - * Turns on the attached flashlight object, updates the mob overlay to be added. - */ -/obj/item/organ/eyes/robotic/glow/proc/activate() - if(eye.light_range) - eye.set_light_on(TRUE) - else - eye.light_on = TRUE // at range 0 we are just going to make the eyes glow emissively, no light overlay - update_mob_eye_color() - -/** - * Deactivates the light - * - * Turns off the attached flashlight object, closes UIs, updates the mob overlay to be removed. - * Arguments: - * * mob/living/carbon/eye_owner - the mob who the eyes belong to - * * close_ui - whether or not to close the ui - */ -/obj/item/organ/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) - if(close_ui) - SStgui.close_uis(src) - eye.set_light_on(FALSE) - update_mob_eye_color(eye_owner) - -/** - * Randomizes the light color - * - * Picks a random color and sets the beam color to that - * Arguments: - * * to_update - whether we are setting the color for the light beam itself, or the individual eyes - */ -/obj/item/organ/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) - var/new_color = "#" - for(var/i in 1 to 3) - new_color += num2hex(rand(0, 255), 2) - set_beam_color(new_color, to_update) - -/** - * Setter function for the light's range - * - * Sets the light range of the attached flashlight object - * Includes some 'unique' logic to accomodate for some quirks of the lighting system - * Arguments: - * * new_range - the new range to set - */ -/obj/item/organ/eyes/robotic/glow/proc/set_beam_range(new_range) - var/old_light_range = eye.light_range - if(old_light_range == 0 && new_range > 0 && eye.light_on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only) - eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work. - eye.set_light_on(TRUE) - eye.set_light_range(clamp(new_range, 0, max_light_beam_distance)) - -/** - * Setter function for the light's color - * - * Sets the light color of the attached flashlight object. Sets the eye color vars of this eye organ as well and then updates the mob's eye color. - * Arguments: - * * newcolor - the new color hex string to set - * * to_update - whether we are setting the color for the light beam itself, or the individual eyes - * * sanitize - whether the hex string should be sanitized - */ -/obj/item/organ/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) - var/newcolor_string - if(sanitize) - newcolor_string = sanitize_hexcolor(newcolor) - else - newcolor_string = newcolor - switch(to_update) - if(UPDATE_LIGHT) - light_color_string = newcolor_string - eye.set_light_color(newcolor_string) - if(UPDATE_EYES_LEFT) - left_eye_color_string = newcolor_string - if(UPDATE_EYES_RIGHT) - right_eye_color_string = newcolor_string - - update_mob_eye_color() - -/** - * Toggle the attached flashlight object on or off - */ -/obj/item/organ/eyes/robotic/glow/proc/toggle_active() - if(eye.light_on) - deactivate() - else - activate() - -/** - * Toggles for the eye color mode - * - * Toggles the eye color mode on or off and then calls an update on the mob's eye color - */ -/obj/item/organ/eyes/robotic/glow/proc/toggle_eye_color_mode() - eye_color_mode = !eye_color_mode - update_mob_eye_color() - -/** - * Updates the mob eye color - * - * Updates the eye color to reflect on the mob's body if it's possible to do so - * Arguments: - * * mob/living/carbon/eye_owner - the mob to update the eye color appearance of - */ -/obj/item/organ/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) - switch(eye_color_mode) - if(MATCH_LIGHT_COLOR) - eye_color_left = light_color_string - eye_color_right = light_color_string - if(USE_CUSTOM_COLOR) - eye_color_left = left_eye_color_string - eye_color_right = right_eye_color_string - - if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. - return - - var/obj/item/bodypart/head/head = eye_owner.get_bodypart(BODY_ZONE_HEAD) //if we have eyes we definently have a head anyway - var/previous_flags = head.head_flags - head.head_flags |= HEAD_EYECOLOR - - ///enabling and disabling the TRAIT_LUMINESCENT_EYES trait already calls handle_eyes(), in that case, let's skip that call - var/skip_call = FALSE - if(!eye.light_on) - eye_icon_state = initial(eye_icon_state) - skip_call = HAS_TRAIT_FROM_ONLY(eye_owner, TRAIT_LUMINESCENT_EYES, REF(src)) - remove_organ_trait(TRAIT_LUMINESCENT_EYES) - else - skip_call = !HAS_TRAIT(eye_owner, TRAIT_LUMINESCENT_EYES) - add_organ_trait(TRAIT_LUMINESCENT_EYES) - eye_icon_state = base_eye_state - - if(!skip_call && ishuman(eye_owner)) - var/mob/living/carbon/human/humie = eye_owner - humie.update_eyes() - - head.head_flags = previous_flags - -#undef MATCH_LIGHT_COLOR -#undef USE_CUSTOM_COLOR -#undef UPDATE_LIGHT -#undef UPDATE_EYES_LEFT -#undef UPDATE_EYES_RIGHT - -/obj/item/organ/eyes/moth - name = "moth eyes" - desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision." - icon_state = "eyes_moth" - eye_icon_state = "motheyes" - blink_animation = FALSE - iris_overlay = null - flash_protect = FLASH_PROTECTION_SENSITIVE - pupils_name = "ommatidia" //yes i know compound eyes have no pupils shut up - penlight_message = "are bulbous and insectoid" - -/obj/item/organ/eyes/robotic/moth - name = "robotic moth eyes" - desc = "Your vision is augmented. Much like actual moth eyes, very sensitive to bright lights." - icon_state = "eyes_moth_cyber" - eye_icon_state = "motheyes_cyber" - flash_protect = FLASH_PROTECTION_SENSITIVE - pupils_name = "aperture clusters" - penlight_message = "are metal hemispheres, resembling insect eyes" - -/obj/item/organ/eyes/robotic/basic/moth - name = "basic robotic moth eyes" - icon_state = "eyes_moth_cyber_basic" - eye_icon_state = "motheyes_white" - eye_color_left = "#65686f" - eye_color_right = "#65686f" - blink_animation = FALSE - flash_protect = FLASH_PROTECTION_SENSITIVE - pupils_name = "aperture clusters" - penlight_message = "are metal hemispheres, resembling insect eyes" - -/obj/item/organ/eyes/robotic/xray/moth - name = "moth x-ray eyes" - desc = "These cybernetic imitation moth eyes will give you X-ray vision. Blinking is futile. Much like actual moth eyes, very sensitive to bright lights." - icon_state = "eyes_moth_cyber_xray" - eye_icon_state = "motheyes_white" - eye_color_left = "#3c4e52" - eye_color_right = "#3c4e52" - blink_animation = FALSE - flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE - pupils_name = "aperture clusters" - -/obj/item/organ/eyes/robotic/shield/moth - name = "shielded robotic moth eyes" - icon_state = "eyes_moth_cyber_shield" - eye_icon_state = "motheyes_white" - eye_color_left = "#353845" - eye_color_right = "#353845" - blink_animation = FALSE - pupils_name = "aperture clusters" - penlight_message = "have shutters, protecting insectoid compound eyes." - -/obj/item/organ/eyes/robotic/glow/moth - name = "high luminosity moth eyes" - desc = "Special glowing eyes, to be one with the lamp. Much like actual moth eyes, very sensitive to bright lights." - icon_state = "eyes_moth_cyber_glow" - eye_icon_state = "motheyes_cyber" - iris_overlay = "eyes_moth_cyber_glow_iris" - blink_animation = FALSE - base_eye_state = "eyes_mothglow" - flash_protect = FLASH_PROTECTION_SENSITIVE - penlight_message = "are bulbous clusters of LEDs and cameras" - pupils_name = "aperture clusters" - -/obj/item/organ/eyes/robotic/thermals/moth - name = "thermal moth eyes" - icon_state = "eyes_moth_cyber_thermal" - eye_icon_state = "motheyes_white" - eye_color_left = "#901f38" - eye_color_right = "#901f38" - blink_animation = FALSE - flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE - pupils_name = "sensor clusters" - penlight_message = "are two clustered hemispheres of thermal sensors" - -/obj/item/organ/eyes/ghost - name = "ghost eyes" - desc = "Despite lacking pupils, these can see pretty well." - icon_state = "eyes-ghost" - blink_animation = FALSE - movement_type = PHASING - organ_flags = parent_type::organ_flags | ORGAN_GHOST - -/obj/item/organ/eyes/snail - name = "snail eyes" - desc = "These eyes seem to have a large range, but might be cumbersome with glasses." - icon_state = "eyes_snail" - eye_icon_state = "snail_eyes" - blink_animation = FALSE - pupils_name = "eyestalks" //many species of snails can retract their eyes into their face! (my lame science excuse for not having better writing here) - penlight_message = "are sat upon retractable tentacles" - -/obj/item/organ/eyes/jelly - name = "jelly eyes" - desc = "These eyes are made of a soft jelly. Unlike all other eyes, though, there are three of them." - icon_state = "eyes_jelly" - eye_icon_state = "jelleyes" - blink_animation = FALSE - iris_overlay = null - pupils_name = "lensing bubbles" //imagine a water lens physics demo but with goo. thats how these work. - penlight_message = "are three bubbles of refractive jelly" - -/obj/item/organ/eyes/lizard - name = "reptile eyes" - desc = "A pair of reptile eyes with thin vertical slits for pupils." - icon_state = "lizard_eyes" - synchronized_blinking = FALSE - pupils_name = "slit pupils" - penlight_message = "have vertically slit pupils and tinted whites" - -/obj/item/organ/eyes/night_vision/maintenance_adapted - name = "adapted eyes" - desc = "These red eyes look like two foggy marbles. They give off a particularly worrying glow in the dark." - icon_state = "eyes_adapted" - eye_color_left = "#f74a4d" - eye_color_right = "#f74a4d" - eye_icon_state = "eyes_glow" - iris_overlay = null - organ_traits = list(TRAIT_UNNATURAL_RED_GLOWY_EYES, TRAIT_LUMINESCENT_EYES) - flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE - low_light_cutoff = list(5, 12, 20) - medium_light_cutoff = list(15, 20, 30) - high_light_cutoff = list(30, 35, 50) - penlight_message = "glow a foggy red, sizzling under the light!" - -/obj/item/organ/eyes/night_vision/maintenance_adapted/penlight_examine(mob/living/viewer, obj/item/examtool) - if(!owner.is_blind()) - to_chat(owner, span_danger("Your eyes sizzle agonizingly as light is shone on them!")) - apply_organ_damage(20 * examtool.light_power) //that's 0.5 lightpower for a penlight, so one penlight shining is equivalent to two seconds in a lit area - return span_danger("[owner.p_Their()] eyes [penlight_message]") - -/obj/item/organ/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick) - if(owner.get_eye_protection() <= FLASH_PROTECTION_SENSITIVE && !owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=0.5)) //we allow a little more than usual so we can produce light from the adapted eyes - to_chat(owner, span_danger("Your eyes! They burn in the light!")) - apply_organ_damage(10) //blind quickly - playsound(owner, 'sound/machines/grill/grillsizzle.ogg', 50) - else - apply_organ_damage(-10) //heal quickly - . = ..() - -/obj/item/organ/eyes/pod - name = "pod eyes" - desc = "Strangest salad you've ever seen." - icon_state = "eyes_pod" - eye_color_left = "#375846" - eye_color_right = "#375846" - iris_overlay = null - foodtype_flags = PODPERSON_ORGAN_FOODTYPES - penlight_message = "are green and plant-like" - -/obj/item/organ/eyes/felinid - name = "felinid eyes" - desc = "A pair of highly reflective eyes with slit pupils, like those of a cat." - pupils_name = "slit pupils" - penlight_message = "shine under the pearly light" diff --git a/code/modules/surgery/organs/internal/eyes/eyes_augments.dm b/code/modules/surgery/organs/internal/eyes/eyes_augments.dm new file mode 100644 index 00000000000..276b8437b88 --- /dev/null +++ b/code/modules/surgery/organs/internal/eyes/eyes_augments.dm @@ -0,0 +1,965 @@ +/obj/item/organ/eyes/robotic + name = "robotic eyes" + desc = "Your vision is augmented." + icon_state = "eyes_cyber" + organ_flags = ORGAN_ROBOTIC + failing_desc = "seems to be broken." + pupils_name = "apertures" + penlight_message = "are cybernetic, click-whirring as they refocus" + +/obj/item/organ/eyes/robotic/emp_act(severity) + . = ..() + if((. & EMP_PROTECT_SELF) || !owner) + return + if(prob(10 * severity)) + return + to_chat(owner, span_warning("Static obfuscates your vision!")) + owner.flash_act(visual = 1) + +/obj/item/organ/eyes/robotic/basic + name = "basic robotic eyes" + desc = "A pair of basic cybernetic eyes that restore vision, but at some vulnerability to light." + icon_state = "eyes_cyber_basic" + iris_overlay = null + eye_color_left = "#2f3032" + eye_color_right = "#2f3032" + flash_protect = FLASH_PROTECTION_SENSITIVE + penlight_message = "are low grade cybernetics, poorly compensating for the light" + +/obj/item/organ/eyes/robotic/basic/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(prob(10 * severity)) + apply_organ_damage(20 * severity) + to_chat(owner, span_warning("Your eyes start to fizzle in their sockets!")) + do_sparks(2, TRUE, owner) + owner.emote("scream") + +/obj/item/organ/eyes/robotic/xray + name = "x-ray eyes" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + icon_state = "eyes_cyber_xray" + iris_overlay = null + eye_color_left = "#3cb8a5" + eye_color_right = "#3cb8a5" + sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + flash_protect = FLASH_PROTECTION_SENSITIVE + organ_traits = list(TRAIT_XRAY_VISION) + penlight_message = "are replaced by small radiation emitters and detectors" + +/obj/item/organ/eyes/robotic/thermals + name = "thermal eyes" + desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." + icon_state = "eyes_cyber_thermal" + iris_overlay = null + eye_color_left = "#ce2525" + eye_color_right = "#ce2525" + // We're gonna downshift green and blue a bit so darkness looks yellow + color_cutoffs = list(25, 8, 5) + sight_flags = SEE_MOBS + flash_protect = FLASH_PROTECTION_SENSITIVE + pupils_name = "slit aperatures" + penlight_message = "are cybernetic, with vertically slit metalic lenses." + +/obj/item/organ/eyes/robotic/flashlight + name = "flashlight eyes" + desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" + icon_state = "flashlight_eyes" + eye_color_left = "#fee5a3" + eye_color_right = "#fee5a3" + iris_overlay = null + flash_protect = FLASH_PROTECTION_WELDER + tint = INFINITY + custom_materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 2.5, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 1.9) + var/obj/item/flashlight/eyelight/eye + light_reactive = FALSE + pupils_name = "flashlights" + penlight_message = "are actually two flashlights taped together. ...why" + +/obj/item/organ/eyes/robotic/flashlight/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + +/obj/item/organ/eyes/robotic/flashlight/on_mob_insert(mob/living/carbon/victim) + . = ..() + if(!eye) + eye = new /obj/item/flashlight/eyelight() + eye.set_light_on(TRUE) + eye.forceMove(victim) + eye.update_brightness(victim) + victim.become_blind(FLASHLIGHT_EYES) + +/obj/item/organ/eyes/robotic/flashlight/on_mob_remove(mob/living/carbon/victim) + . = ..() + eye.set_light_on(FALSE) + eye.update_brightness(victim) + eye.forceMove(src) + victim.cure_blind(FLASHLIGHT_EYES) + +// Welding shield implant +/obj/item/organ/eyes/robotic/shield + name = "shielded robotic eyes" + desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." + icon_state = "eyes_cyber_shield" + iris_overlay = null + eye_color_left = "#353845" + eye_color_right = "#353845" + flash_protect = FLASH_PROTECTION_WELDER + pupils_name = "flash shields" + penlight_message = "have polarized cybernetic lenses, blocking bright lights" + +/obj/item/organ/eyes/robotic/shield/Initialize(mapload) + . = ..() + AddElement(/datum/element/empprotection, EMP_PROTECT_ALL) + +#define MATCH_LIGHT_COLOR 1 +#define USE_CUSTOM_COLOR 0 +#define UPDATE_LIGHT 0 +#define UPDATE_EYES_LEFT 1 +#define UPDATE_EYES_RIGHT 2 + +/obj/item/organ/eyes/robotic/glow + name = "high luminosity eyes" + desc = "Special glowing eyes, used by snowflakes who want to be special." + icon_state = "eyes_cyber_glow" + iris_overlay = "eyes_cyber_glow_iris" + eye_color_left = "#19191a" + eye_color_right = "#19191a" + actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle) + var/max_light_beam_distance = 5 + var/obj/item/flashlight/eyelight/glow/eye + /// base icon state for eye overlays + var/base_eye_state = "eyes_glow_gs" + /// Whether or not to match the eye color to the light or use a custom selection + var/eye_color_mode = USE_CUSTOM_COLOR + /// The selected color for the light beam itself + var/light_color_string = "#ffffff" + /// The custom selected eye color for the left eye. Defaults to the mob's natural eye color + var/left_eye_color_string + /// The custom selected eye color for the right eye. Defaults to the mob's natural eye color + var/right_eye_color_string + penlight_message = "shine back with cybernetic LEDs" + +/obj/item/organ/eyes/robotic/glow/Initialize(mapload) + . = ..() + eye = new /obj/item/flashlight/eyelight/glow + +/obj/item/organ/eyes/robotic/glow/Destroy() + . = ..() + deactivate(close_ui = TRUE) + QDEL_NULL(eye) + +/obj/item/organ/eyes/robotic/glow/emp_act(severity) + . = ..() + if(!eye.light_on || . & EMP_PROTECT_SELF) + return + deactivate(close_ui = TRUE) + +/// Set the initial color of the eyes on insert to be the mob's previous eye color. +/obj/item/organ/eyes/robotic/glow/on_mob_insert(mob/living/carbon/eye_recipient, special = FALSE, movement_flags) + . = ..() + left_eye_color_string = eye_color_left + right_eye_color_string = eye_color_right + update_mob_eye_color(eye_recipient) + deactivate(close_ui = TRUE) + eye.forceMove(eye_recipient) + +/obj/item/organ/eyes/robotic/glow/on_mob_remove(mob/living/carbon/eye_owner) + deactivate(eye_owner, close_ui = TRUE) + if(!QDELETED(eye)) + eye.forceMove(src) + return ..() + +/obj/item/organ/eyes/robotic/glow/ui_state(mob/user) + return GLOB.default_state + +/obj/item/organ/eyes/robotic/glow/ui_status(mob/user, datum/ui_state/state) + if(!QDELETED(owner)) + if(owner == user) + return min( + ui_status_user_is_abled(user, src), + ui_status_only_living(user), + ) + else return UI_CLOSE + return ..() + +/obj/item/organ/eyes/robotic/glow/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "HighLuminosityEyesMenu") + ui.autoupdate = FALSE + ui.open() + +/obj/item/organ/eyes/robotic/glow/ui_data(mob/user) + var/list/data = list() + + data["eyeColor"] = list( + mode = eye_color_mode, + hasOwner = owner ? TRUE : FALSE, + left = left_eye_color_string, + right = right_eye_color_string, + ) + data["lightColor"] = light_color_string + data["range"] = eye.light_range + + return data + +/obj/item/organ/eyes/robotic/glow/ui_act(action, list/params, datum/tgui/ui) + . = ..() + if(.) + return + + switch(action) + if("set_range") + var/new_range = params["new_range"] + set_beam_range(new_range) + return TRUE + if("pick_color") + var/new_color = tgui_color_picker( + usr, + "Choose eye color color:", + "High Luminosity Eyes Menu", + light_color_string + ) + if(new_color) + var/to_update = params["to_update"] + set_beam_color(new_color, to_update) + return TRUE + if("enter_color") + var/new_color = LOWER_TEXT(params["new_color"]) + var/to_update = params["to_update"] + set_beam_color(new_color, to_update, sanitize = TRUE) + return TRUE + if("random_color") + var/to_update = params["to_update"] + randomize_color(to_update) + return TRUE + if("toggle_eye_color") + toggle_eye_color_mode() + return TRUE + +/obj/item/organ/eyes/robotic/glow/ui_action_click(mob/user, action) + if(istype(action, /datum/action/item_action/organ_action/toggle)) + toggle_active() + else if(istype(action, /datum/action/item_action/organ_action/use)) + ui_interact(user) + +/** + * Activates the light + * + * Turns on the attached flashlight object, updates the mob overlay to be added. + */ +/obj/item/organ/eyes/robotic/glow/proc/activate() + if(eye.light_range) + eye.set_light_on(TRUE) + else + eye.light_on = TRUE // at range 0 we are just going to make the eyes glow emissively, no light overlay + update_mob_eye_color() + +/** + * Deactivates the light + * + * Turns off the attached flashlight object, closes UIs, updates the mob overlay to be removed. + * Arguments: + * * mob/living/carbon/eye_owner - the mob who the eyes belong to + * * close_ui - whether or not to close the ui + */ +/obj/item/organ/eyes/robotic/glow/proc/deactivate(mob/living/carbon/eye_owner = owner, close_ui = FALSE) + if(close_ui) + SStgui.close_uis(src) + eye.set_light_on(FALSE) + update_mob_eye_color(eye_owner) + +/** + * Randomizes the light color + * + * Picks a random color and sets the beam color to that + * Arguments: + * * to_update - whether we are setting the color for the light beam itself, or the individual eyes + */ +/obj/item/organ/eyes/robotic/glow/proc/randomize_color(to_update = UPDATE_LIGHT) + var/new_color = "#" + for(var/i in 1 to 3) + new_color += num2hex(rand(0, 255), 2) + set_beam_color(new_color, to_update) + +/** + * Setter function for the light's range + * + * Sets the light range of the attached flashlight object + * Includes some 'unique' logic to accomodate for some quirks of the lighting system + * Arguments: + * * new_range - the new range to set + */ +/obj/item/organ/eyes/robotic/glow/proc/set_beam_range(new_range) + var/old_light_range = eye.light_range + if(old_light_range == 0 && new_range > 0 && eye.light_on) // turn bring back the light overlay if we were previously at 0 (aka emissive eyes only) + eye.light_on = FALSE // this is stupid, but this has to be FALSE for set_light_on() to work. + eye.set_light_on(TRUE) + eye.set_light_range(clamp(new_range, 0, max_light_beam_distance)) + +/** + * Setter function for the light's color + * + * Sets the light color of the attached flashlight object. Sets the eye color vars of this eye organ as well and then updates the mob's eye color. + * Arguments: + * * newcolor - the new color hex string to set + * * to_update - whether we are setting the color for the light beam itself, or the individual eyes + * * sanitize - whether the hex string should be sanitized + */ +/obj/item/organ/eyes/robotic/glow/proc/set_beam_color(newcolor, to_update = UPDATE_LIGHT, sanitize = FALSE) + var/newcolor_string + if(sanitize) + newcolor_string = sanitize_hexcolor(newcolor) + else + newcolor_string = newcolor + switch(to_update) + if(UPDATE_LIGHT) + light_color_string = newcolor_string + eye.set_light_color(newcolor_string) + if(UPDATE_EYES_LEFT) + left_eye_color_string = newcolor_string + if(UPDATE_EYES_RIGHT) + right_eye_color_string = newcolor_string + + update_mob_eye_color() + +/** + * Toggle the attached flashlight object on or off + */ +/obj/item/organ/eyes/robotic/glow/proc/toggle_active() + if(eye.light_on) + deactivate() + else + activate() + +/** + * Toggles for the eye color mode + * + * Toggles the eye color mode on or off and then calls an update on the mob's eye color + */ +/obj/item/organ/eyes/robotic/glow/proc/toggle_eye_color_mode() + eye_color_mode = !eye_color_mode + update_mob_eye_color() + +/** + * Updates the mob eye color + * + * Updates the eye color to reflect on the mob's body if it's possible to do so + * Arguments: + * * mob/living/carbon/eye_owner - the mob to update the eye color appearance of + */ +/obj/item/organ/eyes/robotic/glow/proc/update_mob_eye_color(mob/living/carbon/eye_owner = owner) + switch(eye_color_mode) + if(MATCH_LIGHT_COLOR) + eye_color_left = light_color_string + eye_color_right = light_color_string + if(USE_CUSTOM_COLOR) + eye_color_left = left_eye_color_string + eye_color_right = right_eye_color_string + + if(QDELETED(eye_owner) || !ishuman(eye_owner)) //Other carbon mobs don't have eye color. + return + + var/obj/item/bodypart/head/head = eye_owner.get_bodypart(BODY_ZONE_HEAD) //if we have eyes we definently have a head anyway + var/previous_flags = head.head_flags + head.head_flags |= HEAD_EYECOLOR + + ///enabling and disabling the TRAIT_LUMINESCENT_EYES trait already calls handle_eyes(), in that case, let's skip that call + var/skip_call = FALSE + if(!eye.light_on) + eye_icon_state = initial(eye_icon_state) + skip_call = HAS_TRAIT_FROM_ONLY(eye_owner, TRAIT_LUMINESCENT_EYES, REF(src)) + remove_organ_trait(TRAIT_LUMINESCENT_EYES) + else + skip_call = !HAS_TRAIT(eye_owner, TRAIT_LUMINESCENT_EYES) + add_organ_trait(TRAIT_LUMINESCENT_EYES) + eye_icon_state = base_eye_state + + if(!skip_call && ishuman(eye_owner)) + var/mob/living/carbon/human/humie = eye_owner + humie.update_eyes() + + head.head_flags = previous_flags + +#undef MATCH_LIGHT_COLOR +#undef USE_CUSTOM_COLOR +#undef UPDATE_LIGHT +#undef UPDATE_EYES_LEFT +#undef UPDATE_EYES_RIGHT + +// Moth variations + +/obj/item/organ/eyes/robotic/moth + name = "robotic moth eyes" + desc = "Your vision is augmented. Much like actual moth eyes, very sensitive to bright lights." + icon_state = "eyes_moth_cyber" + eye_icon_state = "motheyes_cyber" + flash_protect = FLASH_PROTECTION_SENSITIVE + pupils_name = "aperture clusters" + penlight_message = "are metal hemispheres, resembling insect eyes" + +/obj/item/organ/eyes/robotic/basic/moth + name = "basic robotic moth eyes" + icon_state = "eyes_moth_cyber_basic" + eye_icon_state = "motheyes_white" + eye_color_left = "#65686f" + eye_color_right = "#65686f" + blink_animation = FALSE + flash_protect = FLASH_PROTECTION_SENSITIVE + pupils_name = "aperture clusters" + penlight_message = "are metal hemispheres, resembling insect eyes" + +/obj/item/organ/eyes/robotic/xray/moth + name = "moth x-ray eyes" + desc = "These cybernetic imitation moth eyes will give you X-ray vision. Blinking is futile. Much like actual moth eyes, very sensitive to bright lights." + icon_state = "eyes_moth_cyber_xray" + eye_icon_state = "motheyes_white" + eye_color_left = "#3c4e52" + eye_color_right = "#3c4e52" + blink_animation = FALSE + flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE + pupils_name = "aperture clusters" + +/obj/item/organ/eyes/robotic/shield/moth + name = "shielded robotic moth eyes" + icon_state = "eyes_moth_cyber_shield" + eye_icon_state = "motheyes_white" + eye_color_left = "#353845" + eye_color_right = "#353845" + blink_animation = FALSE + pupils_name = "aperture clusters" + penlight_message = "have shutters, protecting insectoid compound eyes." + +/obj/item/organ/eyes/robotic/glow/moth + name = "high luminosity moth eyes" + desc = "Special glowing eyes, to be one with the lamp. Much like actual moth eyes, very sensitive to bright lights." + icon_state = "eyes_moth_cyber_glow" + eye_icon_state = "motheyes_cyber" + iris_overlay = "eyes_moth_cyber_glow_iris" + blink_animation = FALSE + base_eye_state = "eyes_mothglow" + flash_protect = FLASH_PROTECTION_SENSITIVE + penlight_message = "are bulbous clusters of LEDs and cameras" + pupils_name = "aperture clusters" + +/obj/item/organ/eyes/robotic/thermals/moth + name = "thermal moth eyes" + icon_state = "eyes_moth_cyber_thermal" + eye_icon_state = "motheyes_white" + eye_color_left = "#901f38" + eye_color_right = "#901f38" + blink_animation = FALSE + flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE + pupils_name = "sensor clusters" + penlight_message = "are two clustered hemispheres of thermal sensors" + +// Chaplain's special boy +/obj/item/organ/eyes/night_vision/maintenance_adapted + name = "adapted eyes" + desc = "These red eyes look like two foggy marbles. They give off a particularly worrying glow in the dark." + icon_state = "eyes_adapted" + eye_color_left = "#f74a4d" + eye_color_right = "#f74a4d" + eye_icon_state = "eyes_glow" + iris_overlay = null + organ_traits = list(TRAIT_UNNATURAL_RED_GLOWY_EYES, TRAIT_LUMINESCENT_EYES) + flash_protect = FLASH_PROTECTION_HYPER_SENSITIVE + low_light_cutoff = list(5, 12, 20) + medium_light_cutoff = list(15, 20, 30) + high_light_cutoff = list(30, 35, 50) + penlight_message = "glow a foggy red, sizzling under the light!" + +/obj/item/organ/eyes/night_vision/maintenance_adapted/penlight_examine(mob/living/viewer, obj/item/examtool) + if(!owner.is_blind()) + to_chat(owner, span_danger("Your eyes sizzle agonizingly as light is shone on them!")) + apply_organ_damage(20 * examtool.light_power) //that's 0.5 lightpower for a penlight, so one penlight shining is equivalent to two seconds in a lit area + return span_danger("[owner.p_Their()] eyes [penlight_message]") + +/obj/item/organ/eyes/night_vision/maintenance_adapted/on_life(seconds_per_tick) + if(owner.get_eye_protection() <= FLASH_PROTECTION_SENSITIVE && !owner.is_blind() && isturf(owner.loc) && owner.has_light_nearby(light_amount=0.5)) //we allow a little more than usual so we can produce light from the adapted eyes + to_chat(owner, span_danger("Your eyes! They burn in the light!")) + apply_organ_damage(10) //blind quickly + playsound(owner, 'sound/machines/grill/grillsizzle.ogg', 50) + else + apply_organ_damage(-10) //heal quickly + return ..() + +#define VISOR_DISPLAY_CROSS "Cross" +#define VISOR_DISPLAY_EYES "Eyes" +#define VISOR_DISPLAY_LINE "Line" + +#define IFF_HOSTILE 1 +#define IFF_NEUTRAL 2 +#define IFF_FRIENDLY 3 + +#define IFF_FACTION_NONE "None" +#define IFF_FACTION_SYNDICATE "Syndicate" +#define IFF_FACTION_CREW "Crew" +#define IFF_FACTION_SEC_COMMAND "Security & Command" +#define IFF_FACTION_CENTCOM "CentCom" +#define IFF_FACTION_EVERYONE "Non-Allies" + +/obj/item/organ/eyes/robotic/tacvisor + name = "tactical EFF visor" + desc = "A failed attempt at integrating IFF systems directly into soldiers' prefrontal cortex, this complex sensor array has proved to be impractical as the additional load impared the user's ability to recognize people's appearances or voices. The screen is there just for intimidation." + icon_state = "eyes_tacvisor" + eye_icon_state = "eyes_tacvisor" + blink_animation = FALSE + no_glasses = TRUE + iris_overlay = null + eye_color_left = COLOR_WHITE + eye_color_right = COLOR_WHITE + flash_protect = FLASH_PROTECTION_WELDER + lighting_cutoff = LIGHTING_CUTOFF_MEDIUM + pupils_name = "faceplate" + penlight_message = "are a wide reinforced faceplate with an inbuilt screen and a multitude of combat sensors" + light_reactive = FALSE + actions_types = list(/datum/action/item_action/organ_action/use) + /// Used to detect when unmasked mobs enter range + var/datum/proximity_monitor/tacvisor/proximity_monitor + /// List of mob refs -> their overlays + var/list/mob_overlays = list() + /// List of mobs in our direct view range who we need to update dynamically + var/list/direct_view_tracking = list() + /// Current visual displayed on the screen + var/visor_display = VISOR_DISPLAY_CROSS + /// Allied faction highlight + var/friendly_faction = IFF_FACTION_SEC_COMMAND + /// Hostile faction highlight + var/hostile_faction = IFF_FACTION_NONE + /// Threat flags for hostile detection, if any are chosen + var/threat_flags = JUDGE_IDCHECK | JUDGE_WEAPONCHECK | JUDGE_RECORDCHECK + /// Can the user change the parameters? + var/user_controls = TRUE + + /// Valid options for friendly factions + var/static/list/valid_friendly_factions = list( + IFF_FACTION_NONE, + IFF_FACTION_CREW, + IFF_FACTION_SEC_COMMAND, + IFF_FACTION_CENTCOM, + IFF_FACTION_SYNDICATE, + ) + /// Valid options for hostile factions + var/static/list/valid_hostile_factions = list( + IFF_FACTION_NONE, + IFF_FACTION_CREW, + IFF_FACTION_SEC_COMMAND, + IFF_FACTION_CENTCOM, + IFF_FACTION_SYNDICATE, + IFF_FACTION_EVERYONE, + ) + /// Threat flags and their tooltips + var/static/list/threat_flag_options = list( + "Valid ID" = JUDGE_IDCHECK, + "Weapon Permit" = JUDGE_WEAPONCHECK, + "Security Status" = JUDGE_RECORDCHECK, + ) + +/obj/item/organ/eyes/robotic/tacvisor/generate_body_overlay(mob/living/carbon/human/parent, obj/item/bodypart/limb) + var/mutable_appearance/visor_overlay = mutable_appearance(eye_icon, eye_icon_state, -EYES_LAYER, parent || limb) + var/list/eye_overlays = list(visor_overlay) + + if (parent && parent.appears_alive() && !HAS_TRAIT(parent, TRAIT_KNOCKEDOUT)) + var/mutable_appearance/display_overlay = mutable_appearance(eye_icon, "[eye_icon_state]_[LOWER_TEXT(visor_display)]", -EYES_LAYER, parent) + eye_overlays += display_overlay + if(!(parent.obscured_slots & HIDEEYES)) + eye_overlays += emissive_appearance(eye_icon, "[eye_icon_state]_[LOWER_TEXT(visor_display)]", parent, -EYES_LAYER) + + if(!limb) + return eye_overlays + + var/obj/item/bodypart/head/head = astype(limb, /obj/item/bodypart/head) + if(head?.worn_face_offset) + for (var/mutable_appearance/overlay as anything in eye_overlays) + head?.worn_face_offset.apply_offset(overlay) + + return eye_overlays + +// Hides and mutes all people on the screen +/obj/item/organ/eyes/robotic/tacvisor/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + balloon_alert(user, "perceptual scanners overriden") + return TRUE + +/obj/item/organ/eyes/robotic/tacvisor/on_mob_insert(mob/living/carbon/receiver, special, movement_flags) + . = ..() + receiver.add_client_colour(/datum/client_colour/tacvisor, REF(src)) + receiver.apply_status_effect(/datum/status_effect/grouped/see_no_names, REF(src)) + proximity_monitor = new(receiver, 9) + proximity_monitor.owner = src + + RegisterSignal(receiver, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(on_login)) + RegisterSignal(receiver, COMSIG_MOVABLE_PRE_HEAR, PROC_REF(on_hear)) + RegisterSignal(receiver, COMSIG_MOB_EXAMINING, PROC_REF(on_examine)) + if (receiver.client) + create_illusions(receiver) + +/obj/item/organ/eyes/robotic/tacvisor/on_mob_remove(mob/living/carbon/organ_owner, special, movement_flags) + . = ..() + UnregisterSignal(organ_owner, list(COMSIG_MOB_CLIENT_LOGIN, COMSIG_MOVABLE_PRE_HEAR, COMSIG_MOB_EXAMINING)) + organ_owner.remove_client_colour(REF(src)) + organ_owner.remove_status_effect(/datum/status_effect/grouped/see_no_names, REF(src)) + QDEL_NULL(proximity_monitor) + organ_owner.client?.images -= assoc_to_values(mob_overlays) + for (var/mob/living/thing as anything in mob_overlays) + UnregisterSignal(thing, list( + COMSIG_MOVABLE_Z_CHANGED, + COMSIG_QDELETING, + COMSIG_ATOM_UPDATE_APPEARANCE, + COMSIG_LIVING_POST_UPDATE_TRANSFORM, + COMSIG_MOB_EQUIPPED_ITEM, + COMSIG_MOB_UNEQUIPPED_ITEM, + COMSIG_LIVING_UPDATE_OFFSETS, + )) + mob_overlays.Cut() + direct_view_tracking.Cut() + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_hear(datum/source, list/hearing_args) + SIGNAL_HANDLER + + if (hearing_args[HEARING_SPEAKER] == owner || !isliving(hearing_args[HEARING_SPEAKER])) + return + + if (obj_flags & EMAGGED) + return COMSIG_MOVABLE_CANCEL_HEARING + + var/list/message_mods = hearing_args[HEARING_MESSAGE_MODE] + message_mods[MODE_SPEAKER_NAME_OVERRIDE] = "Unknown" + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_login(mob/living/source, client/user_client) + SIGNAL_HANDLER + + if (!length(mob_overlays)) + create_illusions(source) + else + user_client.images |= assoc_to_values(mob_overlays) + +/obj/item/organ/eyes/robotic/tacvisor/proc/create_illusions(mob/living/user) + for(var/mob/living/target as anything in ((obj_flags & EMAGGED) ? GLOB.mob_living_list : GLOB.carbon_list)) + if (target == user) + continue + + if (get_dist(user, target) <= proximity_monitor.current_range) + on_entered(target) + else + refresh_overlay(target) + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_mob_delete(mob/living/source) + SIGNAL_HANDLER + owner.client?.images -= mob_overlays[source] + mob_overlays -= source + direct_view_tracking -= source + +/obj/item/organ/eyes/robotic/tacvisor/proc/refresh_overlay(mob/living/source) + SIGNAL_HANDLER + + if (mob_overlays[source]) + owner.client?.images -= mob_overlays[source] + else + RegisterSignal(source, COMSIG_QDELETING, PROC_REF(on_mob_delete)) + RegisterSignal(source, COMSIG_ATOM_UPDATE_APPEARANCE, PROC_REF(refresh_overlay)) + RegisterSignal(source, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_z_change)) + // Lying down/being pushed + RegisterSignal(source, COMSIG_LIVING_POST_UPDATE_TRANSFORM, PROC_REF(refresh_overlay)) + RegisterSignal(source, COMSIG_LIVING_UPDATE_OFFSETS, PROC_REF(refresh_overlay)) + + mob_overlays[source] = make_overlay(source) + owner.client?.images |= mob_overlays[source] + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_z_change(mob/living/source) + SIGNAL_HANDLER + var/image/overlay = mob_overlays[source] + SET_PLANE_EXPLICIT(overlay, ABOVE_GAME_PLANE, source) + +/obj/item/organ/eyes/robotic/tacvisor/proc/make_overlay(mob/living/target) + if (obj_flags & EMAGGED) + var/image/overlay_image = image(mutable_appearance('icons/effects/effects.dmi', "nothing"), target) + overlay_image.name = "Unknown" + overlay_image.override = TRUE + overlay_image.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + SET_PLANE_EXPLICIT(overlay_image, ABOVE_GAME_PLANE, target) + return overlay_image + + var/mutable_appearance/appearance_copy = new(target.appearance) + appearance_copy.appearance_flags |= KEEP_APART|KEEP_TOGETHER + var/outline_color = "#FFD500CC" + switch (get_iff_signature(target)) + if (IFF_FRIENDLY) + outline_color = "#0099FFCC" + if (IFF_HOSTILE) + outline_color = "#FF0022CC" + appearance_copy.add_filter("target_lock_outline", 2, outline_filter(1, outline_color)) + var/mutable_appearance/static_effect = mutable_appearance('icons/effects/effects.dmi', "static_base") + static_effect.color = "#373642" + static_effect.blend_mode = BLEND_INSET_OVERLAY + appearance_copy.overlays += static_effect + appearance_copy.override = TRUE + var/image/overlay_image = image(appearance_copy, target) + overlay_image.name = "Unknown" + overlay_image.override = TRUE + SET_PLANE_EXPLICIT(overlay_image, ABOVE_GAME_PLANE, target) + return overlay_image + +/obj/item/organ/eyes/robotic/tacvisor/proc/get_iff_signature(mob/living/target) + . = IFF_NEUTRAL + if (hostile_faction == IFF_FACTION_EVERYONE) + . = IFF_HOSTILE + + if (!istype(target)) + return . + + // This hasn't been used for like, over a decade, but by god will I make it great again + var/lasercolor = null + if (istype(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING), /obj/item/clothing/suit/redtag) || istype(owner.get_item_by_slot(ITEM_SLOT_BELT), /obj/item/gun/energy/laser/redtag) || owner.is_holding_item_of_type(/obj/item/gun/energy/laser/redtag)) + lasercolor = "r" + else if (istype(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING), /obj/item/clothing/suit/bluetag) || istype(owner.get_item_by_slot(ITEM_SLOT_BELT), /obj/item/gun/energy/laser/bluetag) || owner.is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag)) + lasercolor = "b" + + if (threat_flags && target.assess_threat(threat_flags, lasercolor) >= THREAT_ASSESS_DANGEROUS) + return IFF_HOSTILE + + var/obj/item/card/id/idcard = target.get_idcard() + if (!istype(idcard)) + return . + + // Ignores RETA access so we directly access access instead of using the wrapper + if (ACCESS_SYNDICATE in idcard.access) + if (hostile_faction == IFF_FACTION_SYNDICATE) + return IFF_HOSTILE + if (friendly_faction == IFF_FACTION_SYNDICATE) + return IFF_FRIENDLY + + if (istype(idcard.trim, /datum/id_trim/job)) + // Cham cards get a pass + if (hostile_faction == IFF_FACTION_CREW && idcard.trim?.threat_modifier >= 0) + return IFF_HOSTILE + if (friendly_faction == IFF_FACTION_CREW) + return IFF_FRIENDLY + + if ((ACCESS_COMMAND in idcard.access) || (ACCESS_SECURITY in idcard.access)) + if (hostile_faction == IFF_FACTION_SEC_COMMAND) + return IFF_HOSTILE + if (friendly_faction == IFF_FACTION_SEC_COMMAND) + return IFF_FRIENDLY + + if (ACCESS_CENT_GENERAL in idcard.access) + if (hostile_faction == IFF_FACTION_CENTCOM) + return IFF_HOSTILE + if (friendly_faction == IFF_FACTION_CENTCOM) + return IFF_FRIENDLY + + return . + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_examine(mob/source, atom/target, list/examine_strings, list/examine_overrides) + SIGNAL_HANDLER + + if (target == owner || !iscarbon(target) && !(isliving(target) && (obj_flags & EMAGGED))) + return + + var/list/override_strings = list(span_warning("You're struggling to make out any details...")) + + if (!threat_flags && !(obj_flags & EMAGGED)) + examine_overrides[EXAMINE_OVERRIDE_PRIORITY_IFF] = override_strings + return + + var/lasercolor = null + var/mob/living/victim = target + if (istype(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING), /obj/item/clothing/suit/redtag) || istype(owner.get_item_by_slot(ITEM_SLOT_BELT), /obj/item/gun/energy/laser/redtag) || owner.is_holding_item_of_type(/obj/item/gun/energy/laser/redtag)) + lasercolor = "r" + else if (istype(owner.get_item_by_slot(ITEM_SLOT_OCLOTHING), /obj/item/clothing/suit/bluetag) || istype(owner.get_item_by_slot(ITEM_SLOT_BELT), /obj/item/gun/energy/laser/bluetag) || owner.is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag)) + lasercolor = "b" + + var/threat_level = victim.assess_threat(threat_flags, lasercolor) + switch (threat_level) + if (THREAT_ASSESS_MAXIMUM to INFINITY) + override_strings += span_boldwarning("Assessed threat level of [threat_level]! Extreme danger of criminal activity!") + if (THREAT_ASSESS_DANGEROUS to THREAT_ASSESS_MAXIMUM) + override_strings += span_warning("Assessed threat level of [threat_level]. Criminal scum detected!") + if (1 to THREAT_ASSESS_DANGEROUS) + override_strings += span_notice("Assessed threat level of [threat_level]. Probably not dangerous... yet.") + else + override_strings += span_notice("Seems to be a trustworthy individual.") + + examine_overrides[EXAMINE_OVERRIDE_PRIORITY_IFF] = override_strings + +/obj/item/organ/eyes/robotic/tacvisor/ui_state(mob/user) + return GLOB.default_state + +/obj/item/organ/eyes/robotic/tacvisor/ui_status(mob/user, datum/ui_state/state) + if(!QDELETED(owner)) + if(owner == user && user_controls) + return min( + ui_status_user_is_abled(user, src), + ui_status_only_living(user), + ) + return UI_CLOSE + return ..() + +/obj/item/organ/eyes/robotic/tacvisor/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "TacVisorEyesMenu") + ui.open() + +/obj/item/organ/eyes/robotic/tacvisor/ui_data(mob/user) + var/list/data = list() + data["friendlyFaction"] = friendly_faction + data["hostileFaction"] = hostile_faction + data["visorDisplay"] = visor_display + data["threatFlags"] = threat_flags + return data + +/obj/item/organ/eyes/robotic/tacvisor/ui_static_data(mob/user) + var/list/data = list() + data["validFriendlyFactions"] = valid_friendly_factions + data["validHostileFactions"] = valid_hostile_factions + data["visorOptions"] = list(VISOR_DISPLAY_CROSS, VISOR_DISPLAY_EYES, VISOR_DISPLAY_LINE) + data["threatOptions"] = threat_flag_options + return data + +/obj/item/organ/eyes/robotic/tacvisor/ui_act(action, list/params, datum/tgui/ui) + . = ..() + if(.) + return + + switch(action) + if ("set_friendly") + var/chosen_faction = params["faction"] + if (!(chosen_faction in valid_friendly_factions)) + chosen_faction = IFF_FACTION_NONE + friendly_faction = chosen_faction + update_mob_overlays() + + if ("set_hostile") + var/chosen_faction = params["faction"] + if (!(chosen_faction in valid_hostile_factions)) + chosen_faction = IFF_FACTION_NONE + hostile_faction = chosen_faction + update_mob_overlays() + + if ("set_threat_flags") + threat_flags = text2num(params["threat_flags"]) + update_mob_overlays() + + if ("set_display") + visor_display = params["display"] + if (visor_display != VISOR_DISPLAY_EYES && visor_display != VISOR_DISPLAY_LINE && visor_display != VISOR_DISPLAY_CROSS) + visor_display = VISOR_DISPLAY_CROSS + owner?.update_body() + +/obj/item/organ/eyes/robotic/tacvisor/proc/update_mob_overlays() + for (var/mob/living/target as anything in direct_view_tracking) + refresh_overlay(target) + +/obj/item/organ/eyes/robotic/tacvisor/ui_action_click(mob/user, action) + if(istype(action, /datum/action/item_action/organ_action/use) && user_controls) + ui_interact(user) + +/obj/item/organ/eyes/robotic/tacvisor/multitool_act(mob/living/user, obj/item/tool) + ui_interact(user) + return ITEM_INTERACT_SUCCESS + +/obj/item/organ/eyes/robotic/tacvisor/screwdriver_act(mob/living/user, obj/item/tool) + user_controls = !user_controls + balloon_alert(user, "user controls [user_controls ? "enabled" : "disabled"]") + if (user_controls) + add_item_action(/datum/action/item_action/organ_action/use) + else + for(var/datum/action/action as anything in actions) + remove_item_action(action) + return ITEM_INTERACT_SUCCESS + +/obj/item/organ/eyes/robotic/tacvisor/examine(mob/user) + . = ..() + . += span_notice("Its settings can be changed with a [EXAMINE_HINT("multitool")].") + . += span_notice("User configuration switch is currently in the [user_controls ? "on" : "off"] position, and could be flipped wtih a [EXAMINE_HINT("screwdriver")].") + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_entered(mob/living/source) + if (source in direct_view_tracking) + return + + refresh_overlay(source) + direct_view_tracking += source + // Track equipping/unequipping items for threat levels/ID identity + RegisterSignal(source, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(check_equippped_item)) + RegisterSignal(source, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(refresh_overlay)) // Can't see the slot of the dropped item so we need to blanket update + +/obj/item/organ/eyes/robotic/tacvisor/proc/check_equippped_item(mob/living/source, obj/item/equipped_item, slot) + SIGNAL_HANDLER + + // Anywhere where an ID or a gun would count + if (slot & (ITEM_SLOT_BELT | ITEM_SLOT_ID | ITEM_SLOT_HANDS | ITEM_SLOT_BACK)) + refresh_overlay(source) + +/obj/item/organ/eyes/robotic/tacvisor/proc/on_exited(mob/living/source) + if (!(source in direct_view_tracking)) + return + + direct_view_tracking -= source + UnregisterSignal(source, list( + COMSIG_MOB_EQUIPPED_ITEM, + COMSIG_MOB_UNEQUIPPED_ITEM, + )) + +/datum/proximity_monitor/tacvisor + var/obj/item/organ/eyes/robotic/tacvisor/owner + +/datum/proximity_monitor/tacvisor/Destroy() + owner = null + return ..() + +/datum/proximity_monitor/tacvisor/on_moved(atom/movable/source, atom/old_loc) + return + +/datum/proximity_monitor/tacvisor/on_entered(atom/source, atom/movable/arrived, turf/old_loc) + if (arrived != host && (iscarbon(arrived) || isliving(arrived) && (owner.obj_flags & EMAGGED))) + owner.on_entered(arrived) + +/datum/proximity_monitor/tacvisor/on_uncrossed/on_uncrossed(turf/old_location, mob/exited, direction) + if (exited != host && (iscarbon(exited) || isliving(exited) && (owner.obj_flags & EMAGGED)) && get_dist(exited, host) > current_range) + owner.on_exited(exited) + +/datum/proximity_monitor/tacvisor/on_initialized(turf/location, atom/created, init_flags) + if (created != host && (iscarbon(created) || isliving(created) && (owner.obj_flags & EMAGGED))) + owner.on_entered(created) + +/datum/client_colour/tacvisor + priority = CLIENT_COLOR_ORGAN_PRIORITY + +/datum/client_colour/tacvisor/New(mob/owner) + . = ..() + color = color_matrix_filter(list( + 1, 0, 0, + 0, 1.75, 0, + 0, 0, 0.75, + 0, -0.75, 0, + ), COLORSPACE_HSL) + +/obj/item/organ/eyes/robotic/tacvisor/deathsquad + friendly_faction = IFF_FACTION_CENTCOM + hostile_faction = IFF_FACTION_EVERYONE + actions_types = null + user_controls = FALSE + +/obj/item/organ/eyes/robotic/tacvisor/deathsquad/ui_status(mob/user, datum/ui_state/state) + return UI_CLOSE + +#undef VISOR_DISPLAY_CROSS +#undef VISOR_DISPLAY_EYES +#undef VISOR_DISPLAY_LINE + +#undef IFF_HOSTILE +#undef IFF_NEUTRAL +#undef IFF_FRIENDLY + +#undef IFF_FACTION_NONE +#undef IFF_FACTION_SYNDICATE +#undef IFF_FACTION_CREW +#undef IFF_FACTION_SEC_COMMAND +#undef IFF_FACTION_CENTCOM +#undef IFF_FACTION_EVERYONE diff --git a/code/modules/surgery/organs/internal/eyes/eyes_species.dm b/code/modules/surgery/organs/internal/eyes/eyes_species.dm new file mode 100644 index 00000000000..7c3fc298330 --- /dev/null +++ b/code/modules/surgery/organs/internal/eyes/eyes_species.dm @@ -0,0 +1,113 @@ +/obj/item/organ/eyes/night_vision/mushroom + name = "fung-eye" + desc = "While on the outside they look inert and dead, the eyes of mushroom people are actually very advanced." + low_light_cutoff = list(0, 15, 20) + medium_light_cutoff = list(0, 20, 35) + high_light_cutoff = list(0, 40, 50) + pupils_name = "photosensory openings" + penlight_message = "are attached to fungal stalks" + +/obj/item/organ/eyes/zombie + name = "undead eyes" + desc = "Somewhat counterintuitively, these half-rotten eyes actually have superior vision to those of a living human." + color_cutoffs = list(25, 35, 5) + penlight_message = "are rotten and decayed!" + +/obj/item/organ/eyes/zombie/penlight_examine(mob/living/viewer, obj/item/examtool) + return span_danger("[owner.p_Their()] eyes [penlight_message]") + +/obj/item/organ/eyes/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + sight_flags = SEE_MOBS + color_cutoffs = list(25, 5, 42) + +/obj/item/organ/eyes/golem + name = "resonating crystal" + desc = "Golems somehow measure external light levels and detect nearby ore using this sensitive mineral lattice." + icon_state = "adamantine_cords" + eye_icon_state = null + blink_animation = FALSE + iris_overlay = null + color = COLOR_GOLEM_GRAY + visual = FALSE + organ_flags = ORGAN_MINERAL + color_cutoffs = list(10, 15, 5) + actions_types = list(/datum/action/cooldown/golem_ore_sight) + penlight_message = "glimmer, their crystaline structure refracting light inwards" + pupils_name = "lensing gems" // Given it says these are a "mineral lattice" that collects light i assume they work like artifical ruby laser foci + +/// Send an ore detection pulse on a cooldown +/datum/action/cooldown/golem_ore_sight + name = "Ore Resonance" + desc = "Causes nearby ores to vibrate, revealing their location." + button_icon = 'icons/obj/devices/scanner.dmi' + button_icon_state = "manual_mining" + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 10 SECONDS + +/datum/action/cooldown/golem_ore_sight/Activate(atom/target) + . = ..() + mineral_scan_pulse(get_turf(target), scanner = target) + +/obj/item/organ/eyes/moth + name = "moth eyes" + desc = "These eyes seem to have increased sensitivity to bright light, with no improvement to low light vision." + icon_state = "eyes_moth" + eye_icon_state = "motheyes" + blink_animation = FALSE + iris_overlay = null + flash_protect = FLASH_PROTECTION_SENSITIVE + pupils_name = "ommatidia" //yes i know compound eyes have no pupils shut up + penlight_message = "are bulbous and insectoid" + +/obj/item/organ/eyes/ghost + name = "ghost eyes" + desc = "Despite lacking pupils, these can see pretty well." + icon_state = "eyes-ghost" + blink_animation = FALSE + movement_type = PHASING + organ_flags = parent_type::organ_flags | ORGAN_GHOST + +/obj/item/organ/eyes/snail + name = "snail eyes" + desc = "These eyes seem to have a large range, but might be cumbersome with glasses." + icon_state = "eyes_snail" + eye_icon_state = "snail_eyes" + blink_animation = FALSE + pupils_name = "eyestalks" //many species of snails can retract their eyes into their face! (my lame science excuse for not having better writing here) + penlight_message = "are sat upon retractable tentacles" + +/obj/item/organ/eyes/jelly + name = "jelly eyes" + desc = "These eyes are made of a soft jelly. Unlike all other eyes, though, there are three of them." + icon_state = "eyes_jelly" + eye_icon_state = "jelleyes" + blink_animation = FALSE + iris_overlay = null + pupils_name = "lensing bubbles" //imagine a water lens physics demo but with goo. thats how these work. + penlight_message = "are three bubbles of refractive jelly" + +/obj/item/organ/eyes/lizard + name = "reptile eyes" + desc = "A pair of reptile eyes with thin vertical slits for pupils." + icon_state = "lizard_eyes" + synchronized_blinking = FALSE + pupils_name = "slit pupils" + penlight_message = "have vertically slit pupils and tinted whites" + +/obj/item/organ/eyes/pod + name = "pod eyes" + desc = "Strangest salad you've ever seen." + icon_state = "eyes_pod" + eye_color_left = "#375846" + eye_color_right = "#375846" + iris_overlay = null + foodtype_flags = PODPERSON_ORGAN_FOODTYPES + penlight_message = "are green and plant-like" + +/obj/item/organ/eyes/felinid + name = "felinid eyes" + desc = "A pair of highly reflective eyes with slit pupils, like those of a cat." + pupils_name = "slit pupils" + penlight_message = "shine under the pearly light" diff --git a/icons/mob/human/human_eyes.dmi b/icons/mob/human/human_eyes.dmi index 1ed4e37917aff56ecba4115a7d2e361a7bffbee3..9f8b07cdc97e03659fa6602c7b4126fdc21553b4 100644 GIT binary patch literal 3491 zcmcgvX;jl!7XK&g2mOc>(W3YB`ie>*vcZffGiOML4*>OH3UMeI-sbGgD8S5 z5ec>;5LrSXBn6b9BqSgbkw8!&EFnor2us$|&YYfhPCsbR>3nz}?mPG0^Sk$Vw|B+g z*UQ*&vmpQg#s|GU0ssJ1wsLU#x+^z=!ba4Ja479aP@+dv0^)qk*~A!BJOHGE^7C2o z7xx-rml5e>%6|AsN92MbO(4r|F`E zOm7k#ldOF)06L9nMu!t0-v7R!xVmIuwy(@D@ZX+ePd)BFXc}m|8Yj+P z;|O;Bs4$6l(pH|nwcsZH@q^2b=DKZ(y1aa9wT67?#=H=Dzr1iM`QrC5)3p@=@7$B9 ziMG*uE7l(TSij5Kf7fSI*}h)SJiVXcGr4u6G0`r_PtBqNM@mCZ_Ow|-BATXC0%6r< zwfpQP@Ztnv<9&?$9N6wjxrg)c`r}TLwMGHSS=sxi15Rq&vkb^|7>_mqk7Lz zdYS8cdl(6+A^*=XiM-A`adDwq+O%ACq;KVT7@{quVke7+BMp`t zT6o2r9>y4`JB4%x$yY6>Pm=S7Kd;yTOoe{r27Ih<3YdYl-7Wzj(|@?RpOtTKnqS*9sr$Sh7I%zCos;yoIHrQZY29o6X_Gc? zfX5$<{Xsl84P?+t6qPj&%)uIXh${0-_^cpDr2uMYB%l-4xeYZ?g(2{$de&g-ydO+J zb8&?UG>$-(MEgJ3h;wlFCa$1DodE<*aB4x>rZ#}BwmwcD1h#R<0q-Yf`{+Hq-ORql ze?7XbPs=G{A$Iblbs}vWvd4cxK>+t#QGWH$1$9ZZ5i5DJe>t0pRmq3+hO3|Z25APS z)0#zRk{x1eqQmd zR=g@pjs;Iz1*L#}fpd?2v={5>y<2Hr3;9vp$*tfgfgvMtj62)_R z%`r{o^dzEnXLTt(nN`+}2;;+M#+R7OrMXA%K)iceS_gf@H*B|7a1-f{xxpfuvEJ!n zPGe7D97x=znvov$;s8sD1)yfPOa=-$eKY@I;%R-;H>!8!GwQ66!g> z)3%$~e;5BCF>l{ott`-n9_zX%PL0w)^VOqX6`uqFerXx5iT2>Oc1LwK8B^VM$DlBZ%$xXVDFf+e|_)H>;_6`Zg$s14g7O}SG4)*$-?gu?l2UZqI zx~flDeV@lcN=|rIcRMm9K}D{>}lCtU+&vNHPjo#PGbK^1+ z;)cJ)C9P;aQJ7F5BPut9@MCWZm} zre)Zg5i;$fSnk9cClb|0k*kKj$bh#&px^ZycQNVm4g%?>5OOPjRwU-B!e}y*nh|L? z=y@Rcd3?NKyvqPj4yhAH+Q~9>SX|R)Du`?roGD=4Cgpvq?S}hx;Q!?$yLL3sg#v)C z<^9e~#%i{cSUr}TGBS4&e(R=%z_N-q=*ODK%Muhroz1BE*W*;t4pJB0sV-^evdm9R zQ%@exw^r5el_f0?@ia=Mq;xe`lgA^+H+K7`iVb>jeBy;V7h>WMRxZjo^z`LP0-Pq} zTSTGJX!-Js7w6HcC8sE{QiMcg@jP&Eih3~Oa2blHsvf$OC-z3s#suPPpT0n}iq?r+ zw=`-LR%6EZmLXo@Rk^MUQ}(dOvbh*%^we4O=#Lpg);56dNiFjJwE3xd*=So9;Z@Ko z7MClVVB;$ZnSE-N0-Bl%0&m(*)6x6yy7ZT$_rI;(%)}JX{*&d&!jOHXB2d<^*uGoN zn^iB2G^b!wq7TQiCVzSx-TloT7*r*H4CU<*x031~(`l-O^BB2%!+;=Tz7 z(u|i0N1}dIL7q$vgp)DyoO$77)Pn(5dES^1cbCNBawSg_RdmY2B&+<9%#W!&#Tn#e z)Z*7-`CU1(kOW@SRHn2vU-L?DHJ3AJ`bLUY61^(l#xz7MjpyZ(WJ}QDMCm;LWoM;q z9N$sV9c$H25J+LkFBqJj4y!3_SRVwg_-AY@RdgX7#Vz;B^@W>QrBB7Jqb|M6`L>l1 zThp4HRz)TYy7346d~zEyHEQ1)j4EZc1lOEtyDy=@81xhxO(_)9jkA8RxZ2j`RHY~MC|MmP9 VyOFv>E1xgm;8(sL)$S+1`x$&cin0Iz literal 3149 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 F{{j+~bxi;O literal 58932 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 EKUPU3-~a#s diff --git a/tgstation.dme b/tgstation.dme index 7bd506ce5c8..76e3fafc18c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6519,6 +6519,8 @@ #include "code\modules\surgery\organs\internal\cyberimp\augments_internal.dm" #include "code\modules\surgery\organs\internal\ears\_ears.dm" #include "code\modules\surgery\organs\internal\eyes\_eyes.dm" +#include "code\modules\surgery\organs\internal\eyes\eyes_augments.dm" +#include "code\modules\surgery\organs\internal\eyes\eyes_species.dm" #include "code\modules\surgery\organs\internal\heart\_heart.dm" #include "code\modules\surgery\organs\internal\heart\heart_anomalock.dm" #include "code\modules\surgery\organs\internal\heart\heart_ethereal.dm" diff --git a/tgui/packages/tgui/interfaces/TacVisorEyesMenu.tsx b/tgui/packages/tgui/interfaces/TacVisorEyesMenu.tsx new file mode 100644 index 00000000000..4ba29091667 --- /dev/null +++ b/tgui/packages/tgui/interfaces/TacVisorEyesMenu.tsx @@ -0,0 +1,75 @@ +import { Button, Dropdown, LabeledList, Section } from 'tgui-core/components'; +import { useBackend } from '../backend'; +import { Window } from '../layouts'; + +type Data = { + friendlyFaction: string; + hostileFaction: string; + visorDisplay: string; + threatFlags: number; + + validFriendlyFactions: string[]; + validHostileFactions: string[]; + visorOptions: string[]; + threatOptions: Record; +}; + +export const TacVisorEyesMenu = (props) => { + const { act, data } = useBackend(); + const { + friendlyFaction, + hostileFaction, + visorDisplay, + threatFlags, + validFriendlyFactions, + validHostileFactions, + visorOptions, + threatOptions, + } = data; + return ( + + +
+ + + act('set_friendly', { faction: value })} + /> + + + act('set_hostile', { faction: value })} + /> + + + act('set_display', { display: value })} + /> + + +
+
+ {Object.keys(threatOptions).map((option) => ( + + act('set_threat_flags', { + threat_flags: threatFlags ^ threatOptions[option], + }) + } + > + {option} + + ))} +
+
+
+ ); +};