From 60b47e2bd59b6e3e495abaf0a812db47e70e4f63 Mon Sep 17 00:00:00 2001 From: Sealed101 <75863639+Sealed101@users.noreply.github.com> Date: Wed, 30 Nov 2022 00:21:23 +0300 Subject: [PATCH] Mech camera (#71392) ## About The Pull Request This PR implements a new add-on for mechs that functions as a ~~EMP-proof~~ borg security camera. Unlocked in Basic Robotics Research node. Mechs with a camera installed will have a unique diagnostic HUD blip. ![image](https://user-images.githubusercontent.com/75863639/202909177-f2badafc-2429-495f-a281-fcaad95837fb.png) Getting EMPd temporarily sets the camera's view range to 1. ![image](https://user-images.githubusercontent.com/75863639/203862438-cfcdc442-3aa6-4468-83bb-b4ccad8dfa2e.png) ## Why It's Good For The Game Bodycam footage of the mech in action; AIs piloting a mech with this add-on can actually see what's happening around the mech, much like following a borg. ## Changelog :cl: add: robotics now has access to a mech camera add-on, which installs a security camera into the mech. bodycam footage from the big leagues! qol: cyborg cameras should be more active with updating static when moving (ideally down from 2.5 seconds to 0.5 between updates), make sure to report any jank if you happen on some /:cl: Co-authored-by: Time-Green --- code/__DEFINES/atom_hud.dm | 2 ++ code/game/data_huds.dm | 15 ++++++-- code/game/machinery/camera/presets.dm | 33 ++++++++++++++++++ code/game/machinery/computer/camera.dm | 31 ++++++++-------- .../living/silicon/ai/freelook/cameranet.dm | 20 +++++++---- .../mob/living/silicon/ai/freelook/chunk.dm | 11 ++++-- .../mob/living/silicon/silicon_movement.dm | 32 +++++++++-------- .../file_system/programs/secureye.dm | 17 +++++---- .../designs/mechfabricator_designs.dm | 28 +++++++++++++++ code/modules/research/techweb/all_nodes.dm | 1 + code/modules/vehicles/mecha/_mecha.dm | 9 ++++- .../mecha/equipment/tools/other_tools.dm | 18 ++++++++++ code/modules/vehicles/mecha/mecha_defense.dm | 7 ++++ code/modules/vehicles/mecha/mecha_movement.dm | 28 +++++++++++++++ code/modules/vehicles/mecha/mecha_ui.dm | 4 +++ icons/mecha/mecha_equipment.dmi | Bin 22356 -> 22717 bytes icons/mob/huds/hud.dmi | Bin 9524 -> 9270 bytes 17 files changed, 207 insertions(+), 49 deletions(-) diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index cd47fdde438..a2804c06abe 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -45,6 +45,8 @@ #define ANTAG_HUD "23" // for fans to identify pins #define FAN_HUD "24" +/// Mech camera HUD +#define DIAG_CAMERA_HUD "25" //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 281bfb1dd1d..6ef13c5bcd8 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -55,10 +55,10 @@ /datum/atom_hud/data/diagnostic /datum/atom_hud/data/diagnostic/basic - hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD) + hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD) /datum/atom_hud/data/diagnostic/advanced - hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD) + hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD) /datum/atom_hud/data/bot_path // This hud exists so the bot can see itself, that's all @@ -421,7 +421,6 @@ Diagnostic HUDs! else holder.icon_state = "hudnobatt" - /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat() var/image/holder = hud_list[DIAG_STAT_HUD] var/icon/I = icon(icon, icon_state, dir) @@ -447,6 +446,16 @@ Diagnostic HUDs! new_icon_state = "hudtracking" holder.icon_state = new_icon_state +///Shows inbuilt camera on the mech; if the camera's view range was affected by an EMP, shows a red blip while it's affected +/obj/vehicle/sealed/mecha/proc/diag_hud_set_camera() + var/image/holder = hud_list[DIAG_CAMERA_HUD] + var/icon/I = icon(icon, icon_state, dir) + holder.pixel_y = I.Height() - world.icon_size + if(chassis_camera.is_emp_scrambled) + holder.icon_state = "hudcamera_empd" + return + holder.icon_state = "hudcamera" + /*~~~~~~~~~ Bots! ~~~~~~~~~~*/ diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 5119b17c284..2d9a2a221b4 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -66,6 +66,39 @@ c_tag = "[format_text(camera_area.name)] #[number]" +///The internal camera object for exosuits, applied by the camera upgrade +/obj/machinery/camera/exosuit + c_tag = "Exosuit: unspecified" + desc = "This camera belongs in a mecha. If you see this, tell a coder!" + network = list("ss13", "rd") + short_range = 1 //used when the camera gets EMPd + ///Number of the camera and thus the name of the mech + var/number = 0 + ///Currently used name of the mech + var/current_name = null + ///Whether the camera was recently affected by an EMP and is thus unfocused, shortening view_range + var/is_emp_scrambled = FALSE + +///Restore the camera's view default view range after an EMP +/obj/machinery/camera/exosuit/proc/emp_refocus(obj/vehicle/sealed/mecha/our_chassis) + is_emp_scrambled = FALSE + setViewRange(initial(view_range)) + our_chassis.diag_hud_set_camera() + +///Updates the c_tag of the mech camera while preventing duplicate c_tag usage due to having mechs with the same name +/obj/machinery/camera/exosuit/proc/update_c_tag(obj/vehicle/sealed/mecha/mech) + //List of all used mech names + var/static/list/existing_mech_names = list() + //Name of the mech passed with this proc. We use format_text to wipe away stuff like `\initial` to prevent c_tag from erroring out + var/mech_name = format_text(mech.name) + + if(current_name && current_name != mech_name) //decrease by 1 to preserve correct naming numeration + existing_mech_names[current_name] -= 1 + number = existing_mech_names[mech_name] + 1 + existing_mech_names[mech_name] = number + + c_tag = "Exosuit: [mech_name] #[number]" + current_name = mech_name // UPGRADE PROCS diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 0d9c9579852..73f6169d632 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -131,24 +131,25 @@ var/list/visible_turfs = list() - // Is this camera located in or attached to a living thing? If so, assume the camera's loc is the living thing. - var/cam_location = isliving(active_camera.loc) ? active_camera.loc : active_camera + // Get the camera's turf to correctly gather what's visible from it's turf, in case it's located in a moving object (borgs / mechs) + var/new_cam_turf = get_turf(active_camera) // If we're not forcing an update for some reason and the cameras are in the same location, // we don't need to update anything. // Most security cameras will end here as they're not moving. - var/newturf = get_turf(cam_location) - if(last_camera_turf == newturf) + if(last_camera_turf == new_cam_turf) return // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. - last_camera_turf = get_turf(cam_location) + last_camera_turf = new_cam_turf - var/list/visible_things = active_camera.isXRay() ? range(active_camera.view_range, cam_location) : view(active_camera.view_range, cam_location) + //Here we gather what's visible from the camera's POV based on its view_range and xray modifier if present + var/list/visible_things = active_camera.isXRay() ? range(active_camera.view_range, new_cam_turf) : view(active_camera.view_range, new_cam_turf) for(var/turf/visible_turf in visible_things) visible_turfs += visible_turf + //Get coordinates for a rectangle area that contains the turfs we see so we can then clear away the static in the resulting rectangle area var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 var/size_y = bbox[4] - bbox[2] + 1 @@ -179,21 +180,23 @@ // Returns the list of cameras accessible from this computer /obj/machinery/computer/security/proc/get_available_cameras() var/list/L = list() - for (var/obj/machinery/camera/C as anything in GLOB.cameranet.cameras) - if((is_away_level(z) || is_away_level(C.z)) && (C.z != z))//if on away mission, can only receive feed from same z_level cameras + for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) + //Get the camera's turf in case it's inside something like a borg + var/turf/camera_turf = get_turf(cam) + if((is_away_level(z) || is_away_level(camera_turf.z)) && (camera_turf.z != z))//if on away mission, can only receive feed from same z_level cameras continue - L.Add(C) + L.Add(cam) var/list/D = list() - for(var/obj/machinery/camera/C in L) - if(!C.network) + for(var/obj/machinery/camera/cam in L) + if(!cam.network) stack_trace("Camera in a cameranet has no camera network") continue - if(!(islist(C.network))) + if(!(islist(cam.network))) stack_trace("Camera in a cameranet has a non-list camera network") continue - var/list/tempnetwork = C.network & network + var/list/tempnetwork = cam.network & network if(tempnetwork.len) - D["[C.c_tag]"] = C + D["[cam.c_tag]"] = cam return D // SECURITY MONITORS diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 87f0d6f7f75..27920dc2513 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -67,7 +67,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) for(var/mob/camera/ai_eye/eye as anything in moved_eyes) var/list/visibleChunks = list() - ///Get the eye's turf in case it's located in an object like a mecha + //Get the eye's turf in case it's located in an object like a mecha var/turf/eye_turf = get_turf(eye) if(eye.loc) var/static_range = eye.static_visibility_range @@ -110,10 +110,14 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) if(c.can_use()) majorChunkChange(c, 1) -/// Used for Cyborg cameras. Since portable cameras can be in ANY chunk. -/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/c) - if(c.can_use()) - majorChunkChange(c, 1) +/** + * Used for Cyborg/mecha cameras. Since portable cameras can be in ANY chunk. + * update_delay_buffer is passed all the way to hasChanged() from their camera updates on movement + * to change the time between static updates. +*/ +/datum/cameranet/proc/updatePortableCamera(obj/machinery/camera/updating_camera, update_delay_buffer) + if(updating_camera.can_use()) + majorChunkChange(updating_camera, 1, update_delay_buffer) /** * Never access this proc directly!!!! @@ -121,8 +125,10 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) * It will also add the atom to the cameras list if you set the choice to 1. * Setting the choice to 0 will remove the camera from the chunks. * If you want to update the chunks around an object, without adding/removing a camera, use choice 2. + * update_delay_buffer is passed all the way to hasChanged() from portable camera updates on movement + * to change the time between static updates. */ -/datum/cameranet/proc/majorChunkChange(atom/c, choice) +/datum/cameranet/proc/majorChunkChange(atom/c, choice, update_delay_buffer) if(QDELETED(c) && choice == 1) CRASH("Tried to add a qdeleting camera to the net") @@ -142,7 +148,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) else if(choice == 1) // You can't have the same camera in the list twice. chunk.cameras["[T.z]"] |= c - chunk.hasChanged() + chunk.hasChanged(update_delay_buffer = update_delay_buffer) /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) diff --git a/code/modules/mob/living/silicon/ai/freelook/chunk.dm b/code/modules/mob/living/silicon/ai/freelook/chunk.dm index c5549116fde..7d3b192721b 100644 --- a/code/modules/mob/living/silicon/ai/freelook/chunk.dm +++ b/code/modules/mob/living/silicon/ai/freelook/chunk.dm @@ -56,10 +56,13 @@ /** * Updates the chunk, makes sure that it doesn't update too much. If the chunk isn't being watched it will * instead be flagged to update the next time an AI Eye moves near it. + * update_delay_buffer is used for cameras that are moving around, which are cyborg inbuilt cameras and + * mecha onboard cameras. This buffer should be usually lower than UPDATE_BUFFER_TIME because + * otherwise a moving camera can run out of its own view before updating static. */ -/datum/camerachunk/proc/hasChanged(update_now = 0) +/datum/camerachunk/proc/hasChanged(update_now = 0, update_delay_buffer = UPDATE_BUFFER_TIME) if(seenby.len || update_now) - addtimer(CALLBACK(src, PROC_REF(update)), UPDATE_BUFFER_TIME, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(update)), update_delay_buffer, TIMER_UNIQUE) else changed = TRUE @@ -145,6 +148,10 @@ if(sillycone.builtInCamera?.can_use()) local_cameras += sillycone.builtInCamera + for(var/obj/vehicle/sealed/mecha/mech in urange(CHUNK_SIZE, locate(x + (CHUNK_SIZE / 2), y + (CHUNK_SIZE / 2), z_level))) + if(mech.chassis_camera?.can_use()) + local_cameras += mech.chassis_camera + cameras["[z_level]"] = local_cameras var/image/mirror_from = GLOB.cameranet.obscured_images[GET_Z_PLANE_OFFSET(z_level) + 1] diff --git a/code/modules/mob/living/silicon/silicon_movement.dm b/code/modules/mob/living/silicon/silicon_movement.dm index d225ccf9c16..0ea6ece169c 100644 --- a/code/modules/mob/living/silicon/silicon_movement.dm +++ b/code/modules/mob/living/silicon/silicon_movement.dm @@ -1,22 +1,24 @@ +//We only call a camera static update if we have successfully moved and the camera is present and working /mob/living/silicon/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - update_camera_location(old_loc) + if(builtInCamera?.can_use()) + update_camera_location(old_loc) -/mob/living/silicon/forceMove(atom/destination) - . = ..() - //Only bother updating the camera if we actually managed to move - if(.) - update_camera_location(destination) - -/mob/living/silicon/proc/do_camera_update(oldLoc) - if(!QDELETED(builtInCamera) && oldLoc != get_turf(src)) - GLOB.cameranet.updatePortableCamera(builtInCamera) - updating = FALSE - -#define SILICON_CAMERA_BUFFER 10 /mob/living/silicon/proc/update_camera_location(oldLoc) oldLoc = get_turf(oldLoc) - if(!QDELETED(builtInCamera) && !updating && oldLoc != get_turf(src)) + if(!updating && oldLoc != get_turf(src)) updating = TRUE - addtimer(CALLBACK(src, PROC_REF(do_camera_update), oldLoc), SILICON_CAMERA_BUFFER) + do_camera_update(oldLoc) + +///The static update delay on movement of the camera in a borg we use +#define SILICON_CAMERA_BUFFER 0.5 SECONDS + +/** + * The actual update - also passes our unique update buffer. This makes our static update faster than stationary cameras, + * helping us to avoid running out of the camera's FoV. +*/ +/mob/living/silicon/proc/do_camera_update(oldLoc) + if(oldLoc != get_turf(src)) + GLOB.cameranet.updatePortableCamera(builtInCamera, SILICON_CAMERA_BUFFER) + updating = FALSE #undef SILICON_CAMERA_BUFFER diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 44a1262ab5e..71cdeb9eb9c 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -137,24 +137,25 @@ var/list/visible_turfs = list() - // Is this camera located in or attached to a living thing? If so, assume the camera's loc is the living thing. - var/cam_location = isliving(active_camera.loc) ? active_camera.loc : active_camera + // Get the camera's turf to correctly gather what's visible from it's turf, in case it's located in a moving object (borgs / mechs) + var/new_cam_turf = get_turf(active_camera) // If we're not forcing an update for some reason and the cameras are in the same location, // we don't need to update anything. // Most security cameras will end here as they're not moving. - var/newturf = get_turf(cam_location) - if(last_camera_turf == newturf) + if(last_camera_turf == new_cam_turf) return // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. - last_camera_turf = get_turf(cam_location) + last_camera_turf = new_cam_turf - var/list/visible_things = active_camera.isXRay() ? range(active_camera.view_range, cam_location) : view(active_camera.view_range, cam_location) + //Here we gather what's visible from the camera's POV based on its view_range and xray modifier if present + var/list/visible_things = active_camera.isXRay() ? range(active_camera.view_range, new_cam_turf) : view(active_camera.view_range, new_cam_turf) for(var/turf/visible_turf in visible_things) visible_turfs += visible_turf + //Get coordinates for a rectangle area that contains the turfs we see so we can then clear away the static in the resulting rectangle area var/list/bbox = get_bbox_of_atoms(visible_turfs) var/size_x = bbox[3] - bbox[1] + 1 var/size_y = bbox[4] - bbox[2] + 1 @@ -172,7 +173,9 @@ /datum/computer_file/program/secureye/proc/get_available_cameras() var/list/L = list() for (var/obj/machinery/camera/cam as anything in GLOB.cameranet.cameras) - if(!is_station_level(cam.z))//Only show station cameras. + //Get the camera's turf in case it's inside something like a borg + var/turf/camera_turf = get_turf(cam) + if(!is_station_level(camera_turf.z))//Only show station cameras. continue L.Add(cam) var/list/camlist = list() diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index b856c5ba68d..f4a333e2cb5 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1315,6 +1315,34 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE +/datum/design/mecha_camera + name = "Exosuit External Camera Kit" + desc = "A durable CCTV camera designed for exosuit operations." + id = "mecha_camera" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/camera_kit + materials = list(/datum/material/iron = 1000, /datum/material/glass = 500, /datum/material/plasma = 200, /datum/material/titanium = 200) + construction_time = 50 + category = list( + RND_CATEGORY_MECHFAB_EQUIPMENT, + RND_CATEGORY_MECHFAB_RIPLEY, + RND_CATEGORY_MECHFAB_GYGAX, + RND_CATEGORY_MECHFAB_DURAND, + RND_CATEGORY_MECHFAB_HONK, + RND_CATEGORY_MECHFAB_PHAZON, + RND_CATEGORY_MECHFAB_CLARKE + ) + category = list( + RND_CATEGORY_MECHFAB_EQUIPMENT + RND_SUBCATEGORY_MECHFAB_EQUIPMENT_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_RIPLEY + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_GYGAX + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_DURAND + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_HONK + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_PHAZON + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES, + RND_CATEGORY_MECHFAB_CLARKE + RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + /datum/design/synthetic_flash name = "Flash" desc = "When a problem arises, SCIENCE is the solution." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 2c57e7deb7c..6d272dd1bc5 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -866,6 +866,7 @@ prereq_ids = list("base") design_ids = list( "paicard", + "mecha_camera" ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index b835eb2f55e..c239b3c2bd9 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -33,7 +33,7 @@ light_on = FALSE light_range = 8 generic_canpass = FALSE - hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) + hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD, DIAG_CAMERA_HUD) mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. var/normal_step_energy_drain = 10 @@ -84,7 +84,12 @@ ///Special version of the radio, which is unsellable var/obj/item/radio/mech/radio + ///List of installed remote tracking beacons, including AI control beacons var/list/trackers = list() + ///Camera installed into the mech + var/obj/machinery/camera/exosuit/chassis_camera + ///Portable camera camerachunk update + var/updating = FALSE var/max_temperature = 25000 @@ -281,6 +286,8 @@ QDEL_NULL(spark_system) QDEL_NULL(smoke_system) QDEL_NULL(ui_view) + QDEL_NULL(trackers) + QDEL_NULL(chassis_camera) GLOB.mechas_list -= src //global mech list for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index 437cf648a16..2b80ca48ea0 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -510,3 +510,21 @@ icon_state = initial(icon_state) if(!locate(/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay) in mech.contents) //if no others exist mech.mech_type &= ~EXOSUIT_MODULE_CONCEALED_WEP_BAY + +/obj/item/mecha_parts/camera_kit + name = "exosuit-mounted camera" + desc = "A security camera meant for exosuit-mounted surveillance-on-the-go." + icon = 'icons/mecha/mecha_equipment.dmi' + icon_state = "mecha_camera" + w_class = WEIGHT_CLASS_SMALL + +/obj/item/mecha_parts/camera_kit/try_attach_part(mob/user, obj/vehicle/sealed/mecha/mech, attach_right) + if(mech.chassis_camera) + balloon_alert(user, "already has a camera!") + return FALSE + + . = ..() + + mech.chassis_camera = new /obj/machinery/camera/exosuit (mech) + mech.chassis_camera.update_c_tag(mech) + mech.diag_hud_set_camera() diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index ef3d33fa8df..fedbefaf7c5 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -168,6 +168,13 @@ take_damage(30 / severity, BURN, ENERGY, 1) log_message("EMP detected", LOG_MECHA, color="red") + //Mess with the focus of the inbuilt camera if present + if(chassis_camera && !chassis_camera.is_emp_scrambled) + chassis_camera.setViewRange(chassis_camera.short_range) + chassis_camera.is_emp_scrambled = TRUE + diag_hud_set_camera() + addtimer(CALLBACK(chassis_camera, TYPE_PROC_REF(/obj/machinery/camera/exosuit, emp_refocus), src), 10 SECONDS / severity) + if(!equipment_disabled && LAZYLEN(occupants)) //prevent spamming this message with back-to-back EMPs to_chat(occupants, span_warning("Error -- Connection to equipment control unit has been lost.")) addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/mecha, restore_equipment)), 3 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index d36693bc49f..d1513d4b3ee 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -148,3 +148,31 @@ var/mob/mob_obstacle = obstacle if(mob_obstacle.move_resist <= move_force) step(obstacle, dir) + +//Following procs are camera static update related and are basically ripped off of code\modules\mob\living\silicon\silicon_movement.dm + +//We only call a camera static update if we have successfully moved and have a camera installed +/obj/vehicle/sealed/mecha/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if(chassis_camera) + update_camera_location(old_loc) + +/obj/vehicle/sealed/mecha/proc/update_camera_location(oldLoc) + oldLoc = get_turf(oldLoc) + if(!updating && oldLoc != get_turf(src)) + updating = TRUE + do_camera_update(oldLoc) + +///The static update delay on movement of the camera in a mech we use +#define MECH_CAMERA_BUFFER 0.5 SECONDS + +/** + * The actual update - also passes our unique update buffer. This makes our static update faster than stationary cameras, + * helping us to avoid running out of the camera's FoV. An EMPd mecha with a lowered view_range on its camera can still + * sometimes run out into static before updating, however. +*/ +/obj/vehicle/sealed/mecha/proc/do_camera_update(oldLoc) + if(oldLoc != get_turf(src)) + GLOB.cameranet.updatePortableCamera(chassis_camera, MECH_CAMERA_BUFFER) + updating = FALSE +#undef MECH_CAMERA_BUFFER diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 5a38b944a86..b8bb8402ab3 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -240,7 +240,11 @@ if(is_ic_filtered(userinput) || is_soft_ic_filtered(userinput)) tgui_alert(usr, "You cannot set a name that contains a word prohibited in IC chat!") return + if(userinput == format_text(name)) //default mecha names may have improper span artefacts in their name, so we format the name + to_chat(usr, span_notice("You rename [name] to... well, [userinput].")) + return name = userinput + chassis_camera.update_c_tag(src) if("toggle_safety") set_safety(usr) return diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index ad53c49a5b2b5e4d46c31438dbb91fe142352828..18d884df2ac21e3be9310f9e73887bb0b6ba702f 100644 GIT binary patch delta 22070 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