diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index abde9774c12..698ecc1e21a 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -44,10 +44,14 @@ /// If this camera doesnt add to camera chunks. Used by camera bugs. var/non_chunking_camera = FALSE -/obj/machinery/camera/Initialize(mapload, should_add_to_cameranet = TRUE) +/obj/machinery/camera/Initialize(mapload, should_add_to_cameranet = TRUE, obj/item/camera_assembly/use_assembly = null) . = ..() wires = new(src) - assembly = new(src) + if(istype(use_assembly)) + assembly = use_assembly + else + assembly = new(src) + apply_upgrades() assembly.state = 4 assembly.anchored = TRUE assembly.update_icon() @@ -69,7 +73,7 @@ /obj/machinery/camera/proc/create_prox_monitor() if(!proximity_monitor) - proximity_monitor = new(src, 1) + proximity_monitor = new(src, CAMERA_VIEW_DISTANCE) RegisterSignal(proximity_monitor, COMSIG_PARENT_QDELETING, PROC_REF(proximity_deleted)) /obj/machinery/camera/Moved(atom/OldLoc, Dir, Forced) @@ -103,7 +107,6 @@ else . += SPAN_NOTICE("[src]'s internal wires are disconnected, but it can be cut free.") - /obj/machinery/camera/emp_act(severity) if(!status) return @@ -142,8 +145,8 @@ ..() /obj/machinery/camera/item_interaction(mob/living/user, obj/item/used, list/modifiers) - var/msg = SPAN_NOTICE("You attach [used] into the assembly inner circuits.") - var/msg2 = SPAN_NOTICE("The camera already has that upgrade!") + var/attach_msg = SPAN_NOTICE("You attach [used] to the inner circuits of [src].") + var/reject_msg = SPAN_WARNING("[src] already has that upgrade!") if(istype(used, /obj/item/stack/sheet/mineral/plasma) && panel_open) if(!user.canUnEquip(used, FALSE)) @@ -151,22 +154,24 @@ return ITEM_INTERACT_COMPLETE if(!isEmpProof()) var/obj/item/stack/sheet/mineral/plasma/P = used + if(!P.use(1)) + to_chat(user, SPAN_WARNING("You need at least one sheet of plasma to add EMP shielding to [src]!")) + return ITEM_INTERACT_COMPLETE upgradeEmpProof() - to_chat(user, "[msg]") - P.use(1) + to_chat(user, attach_msg) return ITEM_INTERACT_COMPLETE else - to_chat(user, "[msg2]") + to_chat(user, reject_msg) else if(istype(used, /obj/item/assembly/prox_sensor) && panel_open) if(!user.canUnEquip(used, FALSE)) to_chat(user, SPAN_WARNING("[used] is stuck to your hand!")) return ITEM_INTERACT_COMPLETE if(!isMotion()) upgradeMotion() - to_chat(user, "[msg]") + to_chat(user, attach_msg) qdel(used) else - to_chat(user, "[msg2]") + to_chat(user, reject_msg) return ITEM_INTERACT_COMPLETE @@ -242,8 +247,10 @@ return WELDER_ATTEMPT_WELD_MESSAGE if(I.use_tool(src, user, 100, volume = I.tool_volume)) - visible_message(SPAN_WARNING("[user] unwelds [src], leaving it as just a frame bolted to the wall."), - SPAN_WARNING("You unweld [src], leaving it as just a frame bolted to the wall")) + visible_message( + SPAN_WARNING("[user] unwelds [src], leaving it as just a frame bolted to the wall."), + SPAN_WARNING("You unweld [src], leaving it as just a frame bolted to the wall.") + ) deconstruct(TRUE) /obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) @@ -339,10 +346,10 @@ /obj/machinery/camera/proc/can_use() if(!status) - return 0 + return FALSE if(stat & EMPED) - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/camera/proc/can_see() var/list/see = null @@ -453,7 +460,6 @@ GLOB.cameranet.update_portable_camera(src, prev_turf) prev_turf = get_turf(src) - /obj/machinery/camera/toxins // cameras to be used in toxins c_tag = "Research Toxins Test Chamber East"; c_tag = "Bomb Test Site"; diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 98c476229c5..2fc4cc9514b 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -12,12 +12,12 @@ icon_state = "cameracase" w_class = WEIGHT_CLASS_SMALL materials = list(MAT_METAL = 400, MAT_GLASS = 250) + new_attack_chain = TRUE // Motion, EMP-Proof var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma) var/list/upgrades = list() var/state = ASSEMBLY_UNBUILT - /obj/item/camera_assembly/Destroy() QDEL_LIST_CONTENTS(upgrades) return ..() @@ -35,29 +35,49 @@ . += SPAN_NOTICE("The camera assembly is wired, but the maintenence panel needs to be screwed shut.") . += SPAN_NOTICE("Upgrades can be added to the camera assembly, and removed with a crowbar.") -/obj/item/camera_assembly/attackby__legacy__attackchain(obj/item/I, mob/living/user, params) - if(state == ASSEMBLY_WELDED && iscoil(I)) - var/obj/item/stack/cable_coil/C = I - if(C.use(2)) - to_chat(user, SPAN_NOTICE("You add wires to the assembly.")) - playsound(loc, I.usesound, 50, 1) - state = ASSEMBLY_WIRED - else +/obj/item/camera_assembly/item_interaction(mob/living/user, obj/item/used, list/modifiers) + if(state == ASSEMBLY_WELDED && iscoil(used)) + var/obj/item/stack/cable_coil/cables = used + if(!cables.use(2)) to_chat(user, SPAN_WARNING("You need 2 coils of wire to wire the assembly.")) - return + return ITEM_INTERACT_COMPLETE + + to_chat(user, SPAN_NOTICE("You add wires to the assembly.")) + playsound(loc, used.usesound, 50, 1) + state = ASSEMBLY_WIRED + add_fingerprint(user) + return ITEM_INTERACT_COMPLETE // Upgrades! - else if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already. - if(!user.drop_item_to_ground(I)) - to_chat(user, SPAN_WARNING("[I] is stuck!")) - return - to_chat(user, SPAN_NOTICE("You attach [I] into the assembly inner circuits.")) - upgrades += I - user.drop_item() - I.loc = src - return - else - return ..() + if(is_type_in_list(used, upgrades)) + to_chat(user, SPAN_WARNING("The assembly already has that upgrade!")) + return ITEM_INTERACT_COMPLETE + + if(!is_type_in_list(used, possible_upgrades)) + return NONE + + if(istype(used, /obj/item/stack/sheet/mineral/plasma)) + var/obj/item/stack/sheet/mineral/plasma/old_stack = used + var/obj/item/new_stack = old_stack.split(user, 1) + if(!new_stack) + to_chat(user, SPAN_WARNING("You need at least one sheet of plasma to add EMP shielding to [src]!")) + return ITEM_INTERACT_COMPLETE + + to_chat(user, SPAN_NOTICE("You attach [used] to the inner circuits of [src].")) + new_stack.forceMove(src) + upgrades += new_stack + add_fingerprint(user) + return ITEM_INTERACT_COMPLETE + + if(!user.drop_item_to_ground(used)) + to_chat(user, SPAN_WARNING("[used] is stuck to your hand!")) + return ITEM_INTERACT_COMPLETE + + to_chat(user, SPAN_NOTICE("You attach [used] to the inner circuits of [src].")) + upgrades += used + add_fingerprint(user) + used.forceMove(src) + return ITEM_INTERACT_COMPLETE /obj/item/camera_assembly/crowbar_act(mob/user, obj/item/I) if(!length(upgrades)) @@ -69,7 +89,7 @@ if(U) to_chat(user, SPAN_NOTICE("You detach an upgrade from the assembly.")) playsound(loc, I.usesound, 50, 1) - U.loc = get_turf(src) + U.forceMove(get_turf(src)) upgrades -= U /obj/item/camera_assembly/screwdriver_act(mob/user, obj/item/I) @@ -82,13 +102,13 @@ var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13")) if(!input) state = ASSEMBLY_WIRED - to_chat(usr, SPAN_WARNING("No input found please hang up and try your call again.")) + to_chat(usr, SPAN_WARNING("No input found. Please hang up and try your call again.")) return var/list/tempnetwork = splittext(input, ",") if(length(tempnetwork) < 1) state = ASSEMBLY_WIRED - to_chat(usr, SPAN_WARNING("No network found please hang up and try your call again.")) + to_chat(usr, SPAN_WARNING("No network found. Please hang up and try your call again.")) return var/area/camera_area = get_area(src) @@ -97,14 +117,11 @@ state = ASSEMBLY_BUILT var/list/network_list = uniquelist(tempnetwork) var/list/visible_networks = difflist(network_list, GLOB.restricted_camera_networks) - var/obj/machinery/camera/C = new(loc, length(visible_networks) > 0) - loc = C - C.assembly = src + var/obj/machinery/camera/C = new(loc, length(visible_networks) > 0, src) + forceMove(C) C.auto_turn() - C.network = network_list - C.c_tag = input for(var/i = 5; i >= 0; i -= 1) @@ -116,7 +133,6 @@ if(confirm == "Yes") break - /obj/item/camera_assembly/wirecutter_act(mob/user, obj/item/I) if(state != ASSEMBLY_WIRED) return @@ -181,7 +197,6 @@ new /obj/item/stack/sheet/metal(loc) qdel(src) - #undef ASSEMBLY_UNBUILT #undef ASSEMBLY_WRENCHED #undef ASSEMBLY_WELDED diff --git a/code/game/machinery/camera/camera_presets.dm b/code/game/machinery/camera/camera_presets.dm index d03d4965aa9..5dbff44bfe5 100644 --- a/code/game/machinery/camera/camera_presets.dm +++ b/code/game/machinery/camera/camera_presets.dm @@ -139,26 +139,34 @@ // UPGRADE PROCS /obj/machinery/camera/proc/upgradeEmpProof() + if(isEmpProof()) + return assembly.upgrades.Add(new /obj/item/stack/sheet/mineral/plasma(assembly)) - setPowerUsage() + apply_upgrades() /obj/machinery/camera/proc/upgradeXRay() + if(isXRay()) + return assembly.upgrades.Add(new /obj/item/analyzer(assembly)) - setPowerUsage() - //Update what it can see. - GLOB.cameranet.update_visibility(src, 0) + apply_upgrades() // If you are upgrading Motion, and it isn't in the camera's New(), add it to the machines list. /obj/machinery/camera/proc/upgradeMotion() if(isMotion()) return - if(name == initial(name)) - name = "motion-sensitive security camera" assembly.upgrades.Add(new /obj/item/assembly/prox_sensor(assembly)) - proximity_monitor = new(src, CAMERA_VIEW_DISTANCE) + apply_upgrades() + +/obj/machinery/camera/proc/apply_upgrades() setPowerUsage() - // Add it to machines that process - START_PROCESSING(SSmachines, src) + if(isMotion()) + if(name == initial(name)) + name = "motion-sensitive security camera" + set_area_motion(get_area(src)) + if(!isprocessing) + START_PROCESSING(SSmachines, src) + if(isXRay()) + GLOB.cameranet.update_visibility(src, 0) /obj/machinery/camera/proc/setPowerUsage() var/mult = 1 diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index ea5c57edc0b..9f101c3ccd4 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -1,9 +1,9 @@ /mob/living/silicon/ai/proc/InvalidTurf(turf/T as turf) if(!T) - return 1 + return TRUE if(!is_level_reachable(T.z)) - return 1 - return 0 + return TRUE + return FALSE /mob/living/silicon/ai/proc/get_camera_list() @@ -38,7 +38,7 @@ return if(!camera || camera == "Cancel") - return 0 + return FALSE var/obj/machinery/camera/C = track.cameras[camera] src.eyeobj.set_loc(C) @@ -67,11 +67,6 @@ if(!M.can_track(usr)) continue - // Human check - var/human = 0 - if(ishuman(M)) - human = 1 - var/name = M.name if(name in track.names) track.namecounts[name]++ @@ -79,7 +74,7 @@ else track.names.Add(name) track.namecounts[name] = 1 - if(human) + if(ishuman(M)) track.humans[name] = M else track.others[name] = M @@ -172,14 +167,14 @@ /proc/near_camera(mob/living/M) if(!isturf(M.loc)) - return 0 + return FALSE if(isrobot(M)) var/mob/living/silicon/robot/R = M if(!(R.camera && R.camera.can_use()) && !GLOB.cameranet.check_camera_vis(M)) - return 0 + return FALSE else if(!GLOB.cameranet.check_camera_vis(M)) - return 0 - return 1 + return FALSE + return TRUE /obj/machinery/camera/attack_ai(mob/living/silicon/ai/user) if(!istype(user))