Adds a notification to silicon/drones being watched (#90471)

## About The Pull Request

Cyborgs now have an alert that shows when someone is watching their
internal camera through a security camera console. SyndEye is excluded
from this as it's spying instead.
Made as an alternative to
https://github.com/tgstation/tgstation/pull/90410 but they also aren't
mutually exclusive, though I have the same fix for borg camera cutting
in this one too.


https://github.com/user-attachments/assets/5dfe92f8-8948-4a80-bb64-cbeaca4f80e0

##### This is part of the same code bounty as
https://github.com/tgstation/tgstation/pull/90410

## Why It's Good For The Game

Pretty much the same reason this PR is an alternative to, it's hard for
borgs to get away with doing antagonist stuff when people are able to
silently watch them at any point from any console or laptop laying
around the station, of which there are many. This hopefully lets borgs
know if someone is watching, to avoid doing anything in front of the
cameras, and to encourage them to get said cameras cut if they plan on
doing anything.

## Changelog

🆑
add: Drones now have internal cameras that shows up on camera consoles
(like Cyborgs)
balance: Cyborgs (and drones) now get a notification when someone is
watching them through a security camera console.
fix: Cutting a Cyborg's camera wire now properly disables it, and
mending it now properly re-enables it.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
This commit is contained in:
John Willard
2025-04-08 17:41:47 -04:00
committed by Shadow-Quill
parent f7f7b5f716
commit 0f9343bbe3
12 changed files with 101 additions and 20 deletions
@@ -30,7 +30,7 @@
// Stuff needed to render the map
var/atom/movable/screen/map_view/camera/cam_screen
///Internal tracker used to find a specific person and keep them on cameras.
///Internal tracker used to find a specific person and keep them on cameras, only used if this is a 'spying' console.
var/datum/trackable/internal_tracker
///Syndicate subtype that has no access restrictions and is available on Syndinet
@@ -52,13 +52,21 @@
)
spying = TRUE
///Human AI subtype that has access to most networks on the station and can't be copied.
/datum/computer_file/program/secureye/human_ai
filename = "Overseer"
filedesc = "OverSeer"
run_access = list(ACCESS_MINISAT)
can_run_on_flags = PROGRAM_PDA
program_flags = PROGRAM_UNIQUE_COPY
network = list("ss13", "mine", "rd", "labor", "ordnance", "minisat")
network = list(
CAMERANET_NETWORK_SS13,
CAMERANET_NETWORK_MINE,
CAMERANET_NETWORK_RD,
CAMERANET_NETWORK_LABOR,
CAMERANET_NETWORK_ORDNANCE,
CAMERANET_NETWORK_MINISAT,
)
spying = TRUE
/datum/computer_file/program/secureye/on_install(datum/computer_file/source, obj/item/modular_computer/computer_installing)
@@ -130,15 +138,21 @@
return
switch(action)
if("switch_camera")
var/obj/machinery/camera/active_camera = camera_ref?.resolve()
if(!spying && active_camera)
active_camera.on_stop_watching(src)
if(!spying)
playsound(computer, SFX_TERMINAL_TYPE, 25, FALSE)
var/obj/machinery/camera/selected_camera = locate(params["camera"]) in GLOB.cameranet.cameras
if(selected_camera)
camera_ref = WEAKREF(selected_camera)
else
camera_ref = null
if(!spying)
playsound(computer, SFX_TERMINAL_TYPE, 25, FALSE)
if(isnull(camera_ref))
return TRUE
if(!spying)
selected_camera.on_start_watching(src)
if(internal_tracker)
internal_tracker.reset_tracking()
@@ -181,6 +195,9 @@
cam_screen.hide_from(user)
// Turn off the console
if(length(concurrent_users) == 0 && is_living)
var/obj/machinery/camera/active_camera = camera_ref?.resolve()
if(!spying && active_camera)
active_camera.on_stop_watching(src)
camera_ref = null
last_camera_turf = null
if(!spying)