From 4d44d47a594002e9fe92b4ec5dbc52c271162fc9 Mon Sep 17 00:00:00 2001 From: mistyLuminescence <32139558+mistyLuminescence@users.noreply.github.com> Date: Fri, 1 Dec 2017 22:00:49 +0000 Subject: [PATCH] Mobile Camera Pods (#4330) * Adds tactical cameras! * Adds MCP crate * Destroy the tac-cams! * Updates description * Removes MCP box from Armory * we can't actually get MCPs any more --- code/game/objects/items/devices/spy_bug.dm | 255 +++++++++++++----- .../objects/items/weapons/storage/boxes.dm | 11 + .../items/weapons/storage/uplink_kits.dm | 14 +- icons/obj/grenade.dmi | Bin 3746 -> 4027 bytes 4 files changed, 201 insertions(+), 79 deletions(-) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index d05289e2cb..159134f83c 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -1,115 +1,196 @@ -/obj/item/device/spy_bug - name = "bug" - desc = "" // Nothing to see here +/obj/item/device/camerabug + name = "mobile camera pod" + desc = "A camera pod used by tactical operators. Must be linked to a camera scanner unit." + icon = 'icons/obj/grenade.dmi' + icon_state = "camgrenade" + item_state = "empgrenade" + flags = CONDUCT + w_class = ITEMSIZE_SMALL + force = 0 + throwforce = 5.0 + throw_range = 15 + throw_speed = 3 + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) + var/obj/item/device/bug_monitor/linkedmonitor + var/brokentype = /obj/item/brokenbug + +// var/obj/item/device/radio/bug/radio + var/obj/machinery/camera/bug/camera + +/obj/item/device/camerabug/New() + ..() +// radio = new(src) + camera = new(src) + +/obj/item/device/camerabug/attack_self(mob/user) + if(user.a_intent == I_HURT) + to_chat(user, "You crush the [src] under your foot, breaking it.") + visible_message("[user.name] crushes the [src] under their foot, breaking it!") + new brokentype(get_turf(src)) + spawn(0) + qdel(src) +/* else + user.set_machine(radio) + radio.interact(user) +*/ +/obj/item/device/camerabug/verb/reset() + set name = "Reset camera bug" + set category = "Object" + if(linkedmonitor) + linkedmonitor.unpair(src) + linkedmonitor = null + qdel(camera) + camera = new(src) + to_chat(usr, "You turn the [src] off and on again, delinking it from any monitors.") + +/obj/item/brokenbug + name = "broken mobile camera pod" + desc = "A camera pod formerly used by tactical operators. The lens is smashed, and the circuits are damaged beyond repair." + icon = 'icons/obj/grenade.dmi' + icon_state = "camgrenadebroken" + item_state = "empgrenade" + flags = CONDUCT + force = 5.0 + w_class = ITEMSIZE_SMALL + throwforce = 5.0 + throw_range = 15 + throw_speed = 3 + origin_tech = list(TECH_ENGINEERING = 1) + +/obj/item/brokenbug/spy + name = "broken bug" + desc = "" //Even when it's broken it's inconspicuous icon = 'icons/obj/weapons.dmi' icon_state = "eshield0" item_state = "nothing" layer = TURF_LAYER+0.2 - - flags = CONDUCT - force = 5.0 w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS + origin_tech = list(TECH_ENGINEERING = 1, TECH_ILLEGAL = 3) //crush it and you lose the data + flags = CONDUCT + force = 0 throwforce = 5.0 throw_range = 15 throw_speed = 3 +/obj/item/device/camerabug/spy + name = "bug" + desc = "" //Nothing to see here + icon = 'icons/obj/weapons.dmi' + icon_state = "eshield0" + item_state = "nothing" + layer = TURF_LAYER+0.2 + w_class = ITEMSIZE_TINY + slot_flags = SLOT_EARS origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1, TECH_ILLEGAL = 3) - var/obj/item/device/radio/spy/radio - var/obj/machinery/camera/spy/camera - -/obj/item/device/spy_bug/New() - ..() - radio = new(src) - camera = new(src) - -/obj/item/device/spy_bug/examine(mob/user) +/obj/item/device/camerabug/examine(mob/user) . = ..(user, 0) if(.) - user << "It's a tiny camera, microphone, and transmission device in a happy union." - user << "Needs to be both configured and brought in contact with monitor device to be fully functional." + to_chat(user, "It has a tiny camera inside. Needs to be both configured and brought in contact with monitor device to be fully functional.") -/obj/item/device/spy_bug/attack_self(mob/user) - radio.attack_self(user) - -/obj/item/device/spy_bug/attackby(obj/W as obj, mob/living/user as mob) - if(istype(W, /obj/item/device/spy_monitor)) - var/obj/item/device/spy_monitor/SM = W - SM.pair(src, user) +/obj/item/device/camerabug/attackby(obj/item/W as obj, mob/living/user as mob) + if(istype(W, /obj/item/device/bug_monitor)) + var/obj/item/device/bug_monitor/SM = W + if(!linkedmonitor) + to_chat(user, "\The [src] has been paired with \the [SM].") + SM.pair(src) + linkedmonitor = SM + else if (linkedmonitor == SM) + to_chat(user, "\The [src] has been unpaired from \the [SM].") + linkedmonitor.unpair(src) + linkedmonitor = null + else + to_chat(user, "Error: The device is linked to another monitor.") else + if(W.force >= 5) + visible_message("\The [src] lens shatters!") + new brokentype(get_turf(src)) + if(linkedmonitor) + linkedmonitor.unpair(src) + linkedmonitor = null + spawn(0) + qdel(src) ..() -/obj/item/device/spy_bug/hear_talk(mob/M, var/msg, verb, datum/language/speaking) +/obj/item/device/camerabug/bullet_act() + visible_message("The [src] lens shatters!") + new brokentype(get_turf(src)) + if(linkedmonitor) + linkedmonitor.unpair(src) + linkedmonitor = null + spawn(0) + qdel(src) + +/obj/item/device/camerabug/Destroy() + if(linkedmonitor) + linkedmonitor.unpair(src) + linkedmonitor = null + ..() +/* +/obj/item/device/camerabug/hear_talk(mob/M, var/msg, verb, datum/language/speaking) radio.hear_talk(M, msg, speaking) - - -/obj/item/device/spy_monitor - name = "\improper PDA" - desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." - icon = 'icons/obj/pda.dmi' - icon_state = "pda" +*/ +/obj/item/device/bug_monitor + name = "mobile camera pod monitor" + desc = "A portable camera console designed to work with mobile camera pods." + icon = 'icons/obj/device.dmi' + icon_state = "forensic0" item_state = "electronic" - - w_class = ITEMSIZE_SMALL - - origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1, TECH_ILLEGAL = 3) + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) var/operating = 0 - var/obj/item/device/radio/spy/radio - var/obj/machinery/camera/spy/selected_camera - var/list/obj/machinery/camera/spy/cameras = new() - -/obj/item/device/spy_monitor/New() +// var/obj/item/device/radio/bug/radio + var/obj/machinery/camera/bug/selected_camera + var/list/obj/machinery/camera/bug/cameras = new() +/* +/obj/item/device/bug_monitor/New() radio = new(src) - -/obj/item/device/spy_monitor/examine(mob/user) - . = ..(user, 1) - if(.) - user << "The time '12:00' is blinking in the corner of the screen and \the [src] looks very cheaply made." - -/obj/item/device/spy_monitor/attack_self(mob/user) +*/ +/obj/item/device/bug_monitor/attack_self(mob/user) if(operating) return - radio.attack_self(user) +// radio.attack_self(user) view_cameras(user) -/obj/item/device/spy_monitor/attackby(obj/W as obj, mob/living/user as mob) - if(istype(W, /obj/item/device/spy_bug)) - pair(W, user) +/obj/item/device/bug_monitor/attackby(obj/item/W as obj, mob/living/user as mob) + if(istype(W, /obj/item/device/camerabug)) + W.attackby(src, user) else return ..() -/obj/item/device/spy_monitor/proc/pair(var/obj/item/device/spy_bug/SB, var/mob/living/user) +/obj/item/device/bug_monitor/proc/unpair(var/obj/item/device/camerabug/SB) if(SB.camera in cameras) - user << "\The [SB] has been unpaired from \the [src]." cameras -= SB.camera - else - user << "\The [SB] has been paired with \the [src]." - cameras += SB.camera -/obj/item/device/spy_monitor/proc/view_cameras(mob/user) +/obj/item/device/bug_monitor/proc/pair(var/obj/item/device/camerabug/SB) + cameras += SB.camera + +/obj/item/device/bug_monitor/proc/view_cameras(mob/user) if(!can_use_cam(user)) return selected_camera = cameras[1] + user.reset_view(selected_camera) view_camera(user) operating = 1 while(selected_camera && Adjacent(user)) - selected_camera = input("Select camera bug to view.") as null|anything in cameras + selected_camera = input("Select camera to view.") as null|anything in cameras selected_camera = null operating = 0 -/obj/item/device/spy_monitor/proc/view_camera(mob/user) +/obj/item/device/bug_monitor/proc/view_camera(mob/user) spawn(0) while(selected_camera && Adjacent(user)) var/turf/T = get_turf(selected_camera) if(!T || !is_on_same_plane_or_station(T.z, user.z) || !selected_camera.can_use()) user.unset_machine() user.reset_view(null) - user << "[selected_camera] unavailable." + to_chat(user, "Link to [selected_camera] has been lost.") + src.unpair(selected_camera.loc) sleep(90) else user.set_machine(selected_camera) @@ -118,37 +199,67 @@ user.unset_machine() user.reset_view(null) -/obj/item/device/spy_monitor/proc/can_use_cam(mob/user) +/obj/item/device/bug_monitor/proc/can_use_cam(mob/user) if(operating) return if(!cameras.len) - user << "No paired cameras detected!" - user << "Bring a bug in contact with this device to pair the camera." + to_chat(user, "No paired cameras detected!") + to_chat(user, "Bring a camera in contact with this device to pair the camera.") return return 1 - -/obj/item/device/spy_monitor/hear_talk(mob/M, var/msg, verb, datum/language/speaking) +/* +/obj/item/device/bug_monitor/hear_talk(mob/M, var/msg, verb, datum/language/speaking) return radio.hear_talk(M, msg, speaking) +*/ +/obj/item/device/bug_monitor/spy + name = "\improper PDA" + desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge." + icon = 'icons/obj/pda.dmi' + icon_state = "pda" + item_state = "electronic" + origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1, TECH_ILLEGAL = 3) +/obj/item/device/bug_monitor/spy/examine(mob/user) + . = ..(user, 1) + if(.) + to_chat(user, "The time '12:00' is blinking in the corner of the screen and \the [src] looks very cheaply made.") -/obj/machinery/camera/spy - // These cheap toys are accessible from the mercenary camera console as well +/obj/machinery/camera/bug/check_eye(var/mob/user as mob) + return 0 + +/obj/machinery/camera/bug + network = list(NETWORK_SECURITY) + +/obj/machinery/camera/bug/New() + ..() + name = "Camera #[rand(1000,9999)]" + c_tag = name + +/obj/machinery/camera/bug/spy + // These cheap toys are accessible from the mercenary camera console as well - only the antag ones though! network = list(NETWORK_MERCENARY) -/obj/machinery/camera/spy/New() +/obj/machinery/camera/bug/spy/New() ..() name = "DV-136ZB #[rand(1000,9999)]" c_tag = name -/obj/machinery/camera/spy/check_eye(var/mob/user as mob) - return 0 +/* //These were originally supposed to have radios in them. Doesn't work. +/obj/item/device/radio/bug + listening = 0 //turn it on first + frequency = 1359 //sec comms + broadcasting = 0 + canhear_range = 1 + name = "camera bug device" + icon_state = "syn_cypherkey" -/obj/item/device/radio/spy +/obj/item/device/radio/bug/spy listening = 0 frequency = 1473 broadcasting = 0 canhear_range = 1 name = "spy device" icon_state = "syn_cypherkey" + */ \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index c33e26d809..b5f41aeccc 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -379,6 +379,17 @@ new /obj/item/weapon/implanter(src) new /obj/item/weapon/implantpad(src) +/obj/item/weapon/storage/box/camerabug + name = "mobile camera pod box" + desc = "A box containing some mobile camera pods." + icon_state = "pda" + +/obj/item/weapon/storage/box/camerabug/New() + ..() + for(var/i = 1 to 6) + new /obj/item/device/camerabug(src) + new /obj/item/device/bug_monitor(src) + /obj/item/weapon/storage/box/rxglasses name = "box of prescription glasses" desc = "This box contains nerd glasses." diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index cd3aca0f37..825ce8bdea 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -159,13 +159,13 @@ /obj/item/weapon/storage/box/syndie_kit/spy/New() ..() - new /obj/item/device/spy_bug(src) - new /obj/item/device/spy_bug(src) - new /obj/item/device/spy_bug(src) - new /obj/item/device/spy_bug(src) - new /obj/item/device/spy_bug(src) - new /obj/item/device/spy_bug(src) - new /obj/item/device/spy_monitor(src) + new /obj/item/device/camerabug/spy(src) + new /obj/item/device/camerabug/spy(src) + new /obj/item/device/camerabug/spy(src) + new /obj/item/device/camerabug/spy(src) + new /obj/item/device/camerabug/spy(src) + new /obj/item/device/camerabug/spy(src) + new /obj/item/device/bug_monitor/spy(src) /obj/item/weapon/storage/box/syndie_kit/g9mm name = "\improper Smooth operator" diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index ee56e733e335c9f3da19f3f4c9aea4544747dba5..bcd64a33feb5dbdf93808d56dc066df6517f0739 100644 GIT binary patch delta 3944 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 delta 3632 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 Q@3#XuA9Hhfel#Hc|09UE2><{9