diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index e5d1d70d4a4..59e1a926d84 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,6 +35,28 @@ Possible to do for anyone motivated enough: GLOBAL_LIST_EMPTY(holopads) +/** + * A stationary holopad for projecting hologram and making and receiving holocalls. + * + * Holopads are floor-plane machines similar, in appearance and interactive function, to quantum pads. They can be + * used by crew members to make and answer holocalls, or by the AI to project holograms autonomously. + * + * Holopads are machines which can project a hologram up to `holo_range` tiles away. They do this in one of two modes: + * holocalls, and AI holograms. Holocalls require a user to stand on a holopad, use its menu to select a remote holopad, + * and make a call. Holocalls must be answered by the receiving holopad, or they will fail. Holopads can be configured + * globally to auto-accept instead of failing, with the debug static variable `force_answer_call`. They can also be + * individually configured to auto-accept calls immediately by setting their public mode option (`public_mode`), + * which can be done in-game by using a screwdriver and then a multitool on a holopad. Holocalls will automatically end + * if power goes out, the caller moves off the calling holopad, the caller projects outside the receiving holopad's + * range, the caller is killed or incapacitated, the caller ghosts or disconnects, or the caller is QDELETED. AI + * holograms require the AI to focus on the originating holopad and click on it; no answer is required. If the AI moves + * out of a holopad's range and into the range of another, it will attempt to transfer its hologram to the next holopad. + * Otherwise, AI holograms will stop projecting if power goes out for the originating holopad, the AI clicks on its + * origin holopad, or, like holocalls, if the AI is killed, incapacitated, disconnected, QDELETED, or ghosts. + * Holopads relay speech from the caller made with the :h radio key, and relay all speech on the answering end to the + * caller or AI. + */ + /obj/machinery/hologram/holopad name = "holopad" desc = "It's a floor-mounted device for projecting holographic images." @@ -47,17 +69,29 @@ GLOBAL_LIST_EMPTY(holopads) max_integrity = 300 armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, rad = 0, fire = 50, acid = 0) - var/list/masters = list()//List of living mobs that use the holopad - var/list/holorays = list()//Holoray-mob link. - var/last_request = 0 //to prevent request spam. ~Carn - var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. + /// List of living mobs currently using the holopad + var/list/masters = list() + /// Holoray-mob link. + var/list/holorays = list() + /// Last request time, to prevent request spam. ~Carn + var/last_request = 0 + /// The range, in tiles, that a holopad can project a hologram. + var/holo_range = 5 var/temp = "" - var/list/holo_calls //array of /datum/holocalls - var/datum/holocall/outgoing_call //do not modify the datums only check and call the public procs - var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging + /// A list of holocalls associated with this holopad. + var/list/holo_calls + /// The outgoing holocall currently being processed by this holopad. + var/datum/holocall/outgoing_call + /// Universal debug toggle for whether holopads will automatically answer calls after a few rings. + var/static/force_answer_call = FALSE + /// Toggle for auto-answering calls immediately, set via multitool. + var/public_mode = FALSE + /// The ray effect emanating from this holopad to the produced hologram. var/obj/effect/overlay/holoray/ray + /// Whether or not this holopad is currently ringing, from being called by another pad. var/ringing = FALSE - var/dialling_input = FALSE //The user is currently selecting where to send their call + /// Whether or not the user is currently selecting where to send their call. + var/dialling_input = FALSE /obj/machinery/hologram/holopad/Initialize(mapload) . = ..() @@ -120,6 +154,13 @@ GLOBAL_LIST_EMPTY(holopads) return return ..() +/obj/machinery/hologram/holopad/multitool_act(mob/living/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + public_mode = !public_mode + to_chat(user, "You [public_mode ? "enable" : "disable"] the holopad's public mode setting.") + /obj/machinery/hologram/holopad/screwdriver_act(mob/user, obj/item/I) . = TRUE default_deconstruction_screwdriver(user, "holopad_open", "holopad0", I) @@ -143,6 +184,11 @@ GLOBAL_LIST_EMPTY(holopads) user.set_machine(src) interact(user) +/obj/machinery/hologram/holopad/examine(mob/user) + . = ..() + . += "Its maintenance panel can be screwed [panel_open ? "closed" : "open"]." + . += "Its public mode indicator reads [public_mode ? "on" : "off"]. It can be turned [public_mode ? "off" : "on"] by using a multitool while the maintenance panel is open." + /obj/machinery/hologram/holopad/AltClick(mob/living/carbon/human/user) if(..()) return @@ -300,7 +346,7 @@ GLOBAL_LIST_EMPTY(holopads) continue if(HC.connected_holopad != src) - if(force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) + if((force_answer_call && world.time > (HC.call_start_time + (HOLOPAD_MAX_DIAL_TIME / 2))) || public_mode) HC.Answer(src) break if(outgoing_call)