diff --git a/baystation12.dme b/baystation12.dme index 2430bdec36f..b1e334041d9 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -549,6 +549,7 @@ #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\taperecorder.dm" #include "code\game\objects\items\devices\traitordevices.dm" diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 4e250cfe18e..0dae7ecc0c8 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -9,6 +9,13 @@ src:Topic(href, href_list) return null +/proc/is_on_same_plane_or_station(var/z1, var/z2) + if(z1 == z2) + return 1 + if((z1 in config.station_levels) && (z2 in config.station_levels)) + return 1 + return 0 + /proc/get_area(O) var/turf/loc = get_turf(O) if(!loc) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 281e4566d2b..03be981c125 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -73,7 +73,6 @@ throw_speed = 4 throw_range = 5 - /obj/item/weapon/cane name = "cane" desc = "A cane used by a true gentlemen. Or a clown." @@ -87,6 +86,46 @@ matter = list("metal" = 50) attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") +/obj/item/weapon/cane/concealed + var/concealed_blade + +/obj/item/weapon/cane/concealed/New() + ..() + concealed_blade = new/obj/item/weapon/butterfly/switchblade(src) + +/obj/item/weapon/cane/concealed/attack_self(mob/user) + if(concealed_blade) + user.visible_message("[user] has unsheathed \a [concealed_blade] from \his [src]!", "You unsheathe \the [concealed_blade] from \the [src].") + // Calling drop/put in hands to properly call item drop/pickup procs + playsound(user.loc, 'sound/weapons/flipblade.ogg', 50, 1) + user.drop_from_inventory(src) + user.put_in_hands(concealed_blade) + user.put_in_hands(src) + concealed_blade = null + update_icon() + else + ..() + +/obj/item/weapon/cane/concealed/attackby(var/obj/item/weapon/butterfly/W, var/mob/user) + if(!src.concealed_blade && istype(W)) + user.visible_message("[user] has sheathed \a [W] into \his [src]!", "You sheathe \the [W] into \the [src].") + user.drop_from_inventory(W) + W.loc = src + src.concealed_blade = W + update_icon() + else + ..() + +/obj/item/weapon/cane/concealed/update_icon() + if(concealed_blade) + name = initial(name) + icon_state = initial(icon_state) + item_state = initial(icon_state) + else + name = "cane shaft" + icon_state = "nullrod" + item_state = "foldcane" + /obj/item/weapon/disk name = "disk" icon = 'icons/obj/items.dmi' diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index fca51edf83e..3f0f8cdd64b 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -33,47 +33,58 @@ var/uplink_uses = 10 var/list/datum/uplink_item/uplink_items = list( "Highly Visible and Dangerous Weapons" = list( - new/datum/uplink_item(/obj/item/weapon/gun/projectile, 6, "Revolver", "RE"), + new/datum/uplink_item(/obj/item/ammo_magazine/mc9mm, 2, "Ammo-9mm", "R9"), new/datum/uplink_item(/obj/item/ammo_magazine/a357, 2, "Ammo-357", "RA"), - new/datum/uplink_item(/obj/item/weapon/gun/energy/crossbow, 5, "Energy Crossbow", "XB"), + new/datum/uplink_item(/obj/item/weapon/storage/box/emps, 3, "5 EMP Grenades", "EM"), new/datum/uplink_item(/obj/item/weapon/melee/energy/sword, 4, "Energy Sword", "ES"), + new/datum/uplink_item(/obj/item/weapon/gun/energy/crossbow, 5, "Energy Crossbow", "XB"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/g9mm, 5, "Silenced 9mm", "S9"), new/datum/uplink_item(/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser, 6, "Exosuit Rigged Laser", "RL"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndicate, 10, "Mercenary Bundle", "BU"), - new/datum/uplink_item(/obj/item/weapon/storage/box/emps, 3, "5 EMP Grenades", "EM") + new/datum/uplink_item(/obj/item/weapon/gun/projectile, 6, "Revolver", "RE"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndicate, 10, "Mercenary Bundle", "BU") ), "Stealthy and Inconspicuous Weapons" = list( - new/datum/uplink_item(/obj/item/weapon/pen/paralysis, 3, "Paralysis Pen", "PP"), new/datum/uplink_item(/obj/item/weapon/soap/syndie, 1, "Subversive Soap", "SP"), - new/datum/uplink_item(/obj/item/weapon/cartridge/syndicate, 3, "Detomatix PDA Cartridge", "DC") + new/datum/uplink_item(/obj/item/weapon/cane/concealed, 2, "Concealed Cane Sword", "CC"), + new/datum/uplink_item(/obj/item/weapon/cartridge/syndicate, 3, "Detomatix PDA Cartridge", "DC"), + new/datum/uplink_item(/obj/item/weapon/pen/paralysis, 3, "Paralysis Pen", "PP"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/cigarette, 4, "Cigarette Kit", "BH") ), "Stealth and Camouflage Items" = list( - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/chameleon, 3, "Chameleon Kit", "CB"), - new/datum/uplink_item(/obj/item/clothing/shoes/syndigaloshes, 2, "No-Slip Shoes", "SH"), new/datum/uplink_item(/obj/item/weapon/card/id/syndicate, 2, "Agent ID card", "AC"), + new/datum/uplink_item(/obj/item/clothing/shoes/syndigaloshes, 2, "No-Slip Shoes", "SH"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/spy, 2, "Bug Kit", "SK"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/chameleon, 3, "Chameleon Kit", "CB"), + new/datum/uplink_item(/obj/item/device/chameleon, 4, "Chameleon-Projector", "CP"), new/datum/uplink_item(/obj/item/clothing/mask/gas/voice, 4, "Voice Changer", "VC"), - new/datum/uplink_item(/obj/item/device/chameleon, 4, "Chameleon-Projector", "CP") + new/datum/uplink_item(/obj/item/weapon/disk/file/cameras/syndicate, 6, "Camera Network Access - Floppy", "SF") ), "Devices and Tools" = list( - new/datum/uplink_item(/obj/item/weapon/card/emag, 3, "Cryptographic Sequencer", "EC"), new/datum/uplink_item(/obj/item/weapon/storage/toolbox/syndicate, 1, "Fully Loaded Toolbox", "ST"), + new/datum/uplink_item(/obj/item/weapon/plastique, 2, "C-4 (Destroys walls)", "C4"), + new/datum/uplink_item(/obj/item/device/encryptionkey/binary, 3, "Binary Translator Key", "BT"), + new/datum/uplink_item(/obj/item/weapon/card/emag, 3, "Cryptographic Sequencer", "EC"), new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/clerical, 3, "Morphic Clerical Kit", "CK"), new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/space, 3, "Space Suit", "SS"), new/datum/uplink_item(/obj/item/clothing/glasses/thermal/syndi, 3, "Thermal Imaging Glasses", "TM"), - new/datum/uplink_item(/obj/item/device/encryptionkey/binary, 3, "Binary Translator Key", "BT"), new/datum/uplink_item(/obj/item/weapon/aiModule/syndicate, 7, "Hacked AI Upload Module", "AI"), - new/datum/uplink_item(/obj/item/weapon/plastique, 2, "C-4 (Destroys walls)", "C4"), new/datum/uplink_item(/obj/item/device/powersink, 5, "Powersink (DANGER!)", "PS",), new/datum/uplink_item(/obj/item/device/radio/beacon/syndicate, 7, "Singularity Beacon (DANGER!)", "SB"), new/datum/uplink_item(/obj/item/weapon/circuitboard/teleporter, 20, "Teleporter Circuit Board", "TP") ), "Implants" = list( new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_freedom, 3, "Freedom Implant", "FI"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI"), + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_compress, 4, "Compressed Matter Implant", "CI"), new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_explosive, 6, "Explosive Implant (DANGER!)", "EI"), - new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_compress, 4, "Compressed Matter Implant", "CI") + new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI") ), + "Health Aids" = list( + new/datum/uplink_item(/obj/item/weapon/storage/box/donkpockets, 1, "Box of Donk-Pockets", "DP"), + new/datum/uplink_item(/obj/item/weapon/storage/firstaid/combat, 5, "Combat medical kit", "CM") + ), "(Pointless) Badassery" = list( - new/datum/uplink_item(/obj/item/toy/syndicateballoon, 10, "For showing that You Are The BOSS (Useless Balloon)", "BS") + new/datum/uplink_item(/obj/item/toy/syndicateballoon, 10, "For showing that You Are The BOSS (Useless Balloon)", "BS"), + new/datum/uplink_item(/obj/item/toy/nanotrasenballoon, 10, "For showing that you love NT SOO much (Useless Balloon)", "NT") ) ) diff --git a/code/game/machinery/computer3/computers/camera.dm b/code/game/machinery/computer3/computers/camera.dm index 9342d2731f8..17f14e0cbfe 100644 --- a/code/game/machinery/computer3/computers/camera.dm +++ b/code/game/machinery/computer3/computers/camera.dm @@ -123,6 +123,12 @@ desc = "Monitors the prison." networks = list("Prison") +/datum/file/camnet_key/syndicate + name = "Camera Network Key" + title = "%!#BUFFER OVERFLOW" + desc = "Connects to security cameras." + networks = list("SS13") + hidden_file = 1 /* @@ -174,7 +180,7 @@ /datum/file/program/security name = "camera monitor" - desc = "Connets to the Nanotrasen Camera Network" + desc = "Connects to the Nanotrasen Camera Network" image = 'icons/ntos/camera.png' active_state = "camera-static" @@ -268,15 +274,19 @@ reset_current() usr.reset_view(null) key = input(usr,"Select a camera network key:", "Key Select", null) as null|anything in computer.list_files(/datum/file/camnet_key) - camera_list = null - update_icon() - computer.update_icon() + select_key(key) if(key) interact() else usr << "The screen turns to static." return +/datum/file/program/security/proc/select_key(var/selected_key) + key = selected_key + camera_list = null + update_icon() + computer.update_icon() + /datum/file/program/security/proc/set_current(var/obj/machinery/camera/C) if(current == C) return @@ -300,3 +310,35 @@ // Atlantis: Required for camnetkeys to work. /datum/file/program/security/hidden hidden_file = 1 + +/* + Camera monitoring program + + Works much as the parent program, except: + * It requires a camera to be found using the proximity network card. + * It begins with all cam-access. +*/ + +/datum/file/program/security/syndicate + name = "camer# moni!%r" + desc = "Cons the Nanotrash Camera Network" + var/special_key = new/datum/file/camnet_key/syndicate + var/camera_conn = null + + interact() + if(!interactable()) + return + + if(!computer.net) + computer.Crash(MISSING_PERIPHERAL) + return + + camera_conn = computer.net.connect_to(/obj/machinery/camera,camera_conn) + + if(!camera_conn) + computer.Crash(NETWORK_FAILURE) + return + + // On interact, override camera key selection + select_key(special_key) + ..() diff --git a/code/game/machinery/computer3/networking.dm b/code/game/machinery/computer3/networking.dm index 4e39da04067..27d77890087 100644 --- a/code/game/machinery/computer3/networking.dm +++ b/code/game/machinery/computer3/networking.dm @@ -169,6 +169,9 @@ if(typekey == null) typekey = /obj/machinery var/list/machines = list() + for(var/obj/O in T) + if(istype(O,typekey)) + machines += O for(var/d in cardinal) var/turf/T2 = get_step(T,d) for(var/obj/O in T2) diff --git a/code/game/machinery/computer3/program_disks.dm b/code/game/machinery/computer3/program_disks.dm index 201fff39392..e9a649499b1 100644 --- a/code/game/machinery/computer3/program_disks.dm +++ b/code/game/machinery/computer3/program_disks.dm @@ -28,6 +28,13 @@ icon_state = "datadisk_arcade" spawn_files = list(/datum/file/program/security) +/obj/item/weapon/disk/file/cameras/syndicate + name = "Camera Viewer" + desc = "A program install disk. A crude skull has been drawn on it and there is a list of items:\nFloppy Drive\nCamera Card\nNetwork Card: Adjacent\nPosition laptop nearby camera, enjoy." + icon = 'icons/obj/stock_parts.dmi' + icon_state = "datadisk_arcade" + spawn_files = list(/datum/file/program/security/syndicate) + /obj/item/weapon/disk/file/card name = "ID Card Modifier" desc = "A program install disk." diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 24c44694f54..93ce1d9eab5 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -115,13 +115,10 @@ listening = !listening && !(wires.IsIndexCut(WIRE_RECEIVE) || wires.IsIndexCut(WIRE_SIGNAL)) /obj/item/device/radio/Topic(href, href_list) - //..() - if (usr.stat || !on) - return - - if (!(issilicon(usr) || (usr.contents.Find(src) || ( in_range(src, usr) && istype(loc, /turf) )))) + if(..() || !on) usr << browse(null, "window=radio") return + usr.set_machine(src) if (href_list["track"]) var/mob/target = locate(href_list["track"]) @@ -152,17 +149,7 @@ else channels[chan_name] |= FREQ_LISTENING - if (!( master )) - if (istype(loc, /mob)) - interact(loc) - else - updateDialog() - else - if (istype(master.loc, /mob)) - interact(master.loc) - else - updateDialog() - add_fingerprint(usr) + interact(usr) /obj/item/device/radio/proc/autosay(var/message, var/from, var/channel) //BS12 EDIT var/datum/radio_frequency/connection = null diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm new file mode 100644 index 00000000000..70e3628f67e --- /dev/null +++ b/code/game/objects/items/devices/spy_bug.dm @@ -0,0 +1,154 @@ +/obj/item/device/spy_bug + name = "bug" + desc = "" // Nothing to see here + icon = 'icons/obj/weapons.dmi' + icon_state = "eshield0" + item_state = "nothing" + layer = TURF_LAYER+0.2 + + flags = CONDUCT + force = 5.0 + w_class = 1.0 + throwforce = 5.0 + throw_range = 15 + throw_speed = 3 + + origin_tech = "programming=1;engineering=1;syndicate=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) + . = ..(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." + +/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) + else + ..() + +/obj/item/device/spy_bug/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" + item_state = "electronic" + + w_class = 2.0 + + origin_tech = "programming=1;engineering=1;syndicate=3" + + 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() + 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) + if(operating) + return + + 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) + else + return ..() + +/obj/item/device/spy_monitor/proc/pair(var/obj/item/device/spy_bug/SB, var/mob/living/user) + 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) + if(!can_use_cam(user)) + return + + selected_camera = cameras[1] + 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 = null + operating = 0 + +/obj/item/device/spy_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." + sleep(90) + else + user.set_machine(selected_camera) + user.reset_view(selected_camera) + sleep(10) + user.unset_machine() + user.reset_view(null) + +/obj/item/device/spy_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." + return + + return 1 + +/obj/item/device/spy_monitor/hear_talk(mob/M, var/msg, verb, datum/language/speaking) + return radio.hear_talk(M, msg, speaking) + + +/obj/machinery/camera/spy + // These cheap toys are accessible from the mercenary camera console as well + network = list("NUKE") + +/obj/machinery/camera/spy/New() + ..() + name = "DV-136ZB #[rand(1000,9999)]" + c_tag = name + cameranet.removeCamera(src) // Sorry, no AI spying. + +/obj/machinery/camera/spy/check_eye(var/mob/user as mob) + return 1 + +/obj/item/device/radio/spy + listening = 0 + frequency = 1473 + broadcasting = 0 + canhear_range = 1 + name = "spy device" + icon_state = "syn_cypherkey" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 8ff441b654e..5ee4532e77a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -98,6 +98,18 @@ icon_state = "syndballoon" item_state = "syndballoon" w_class = 4.0 + +/obj/item/toy/nanotrasenballoon + name = "criminal balloon" + desc = "Across the balloon the following is printed: \"Man, I love NT soooo much. I use only NanoTrasen products. You have NO idea.\"" + throwforce = 0 + throw_speed = 4 + throw_range = 20 + force = 0 + icon = 'icons/obj/weapons.dmi' + icon_state = "ntballoon" + item_state = "ntballoon" + w_class = 4.0 /* * Fake telebeacon diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 9692cacf698..c724319160d 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -323,6 +323,20 @@ new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) + +/obj/item/weapon/storage/box/sinpockets + name = "box of sin-pockets" + desc = "Instructions: Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes." + icon_state = "donk_kit" + + New() + ..() + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) + new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) /obj/item/weapon/storage/box/monkeycubes name = "monkey cube box" diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 6e2eca01c50..e2d45e0fac8 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -109,6 +109,25 @@ new /obj/item/stack/medical/advanced/ointment(src) new /obj/item/stack/medical/splint(src) return + +/obj/item/weapon/storage/firstaid/combat + name = "combat medical kit" + desc = "Contains advanced medical treatments." + icon_state = "bezerk" + item_state = "firstaid-advanced" + +/obj/item/weapon/storage/firstaid/combat/New() + ..() + if (empty) return + new /obj/item/weapon/storage/pill_bottle/bicaridine(src) + new /obj/item/weapon/storage/pill_bottle/dermaline(src) + new /obj/item/weapon/storage/pill_bottle/dexalin_plus(src) + new /obj/item/weapon/storage/pill_bottle/dylovene(src) + new /obj/item/weapon/storage/pill_bottle/tramadol(src) + new /obj/item/weapon/storage/pill_bottle/spaceacillin(src) + new /obj/item/stack/medical/splint(src) + return + /* * Pill Bottles */ @@ -125,20 +144,6 @@ storage_slots = 14 use_sound = null -/obj/item/weapon/storage/pill_bottle/kelotane - name = "bottle of kelotane pills" - desc = "Contains pills used to treat burns." - - New() - ..() - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - new /obj/item/weapon/reagent_containers/pill/kelotane( src ) - /obj/item/weapon/storage/pill_bottle/antitox name = "bottle of Dylovene pills" desc = "Contains pills used to counter toxins." @@ -153,6 +158,62 @@ new /obj/item/weapon/reagent_containers/pill/antitox( src ) new /obj/item/weapon/reagent_containers/pill/antitox( src ) +/obj/item/weapon/storage/pill_bottle/bicaridine + name = "bottle of Bicaridine pills" + desc = "Contains pills used to stabilize the severely injured." + +/obj/item/weapon/storage/pill_bottle/bicaridine/New() + ..() + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + new /obj/item/weapon/reagent_containers/pill/bicaridine(src) + +/obj/item/weapon/storage/pill_bottle/dexalin_plus + name = "bottle of Dexalin Plus pills" + desc = "Contains pills used to treat extreme cases of oxygen deprivation." + +/obj/item/weapon/storage/pill_bottle/dexalin_plus/New() + ..() + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + new /obj/item/weapon/reagent_containers/pill/dexalin_plus(src) + +/obj/item/weapon/storage/pill_bottle/dermaline + name = "bottle of Dermaline pills" + desc = "Contains pills used to treat burn wounds." + +/obj/item/weapon/storage/pill_bottle/dermaline/New() + ..() + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + new /obj/item/weapon/reagent_containers/pill/dermaline(src) + +/obj/item/weapon/storage/pill_bottle/dylovene + name = "bottle of Dylovene pills" + desc = "Contains pills used to treat toxic substances in the blood." + +/obj/item/weapon/storage/pill_bottle/dylovene/New() + ..() + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + new /obj/item/weapon/reagent_containers/pill/dylovene(src) + /obj/item/weapon/storage/pill_bottle/inaprovaline name = "bottle of Inaprovaline pills" desc = "Contains pills used to stabilize patients." @@ -167,8 +228,36 @@ new /obj/item/weapon/reagent_containers/pill/inaprovaline( src ) new /obj/item/weapon/reagent_containers/pill/inaprovaline( src ) +/obj/item/weapon/storage/pill_bottle/kelotane + name = "bottle of kelotane pills" + desc = "Contains pills used to treat burns." + + New() + ..() + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + new /obj/item/weapon/reagent_containers/pill/kelotane( src ) + +/obj/item/weapon/storage/pill_bottle/spaceacillin + name = "bottle of Spaceacillin pills" + desc = "A theta-lactam antibiotic. Effective against many diseases likely to be encountered in space." + +/obj/item/weapon/storage/pill_bottle/spaceacillin/New() + ..() + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + new /obj/item/weapon/reagent_containers/pill/spaceacillin(src) + /obj/item/weapon/storage/pill_bottle/tramadol - name = "bottle of Tramadol Pills" + name = "bottle of Tramadol pills" desc = "Contains pills used to relieve pain." New() diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index fc1d2e2b8a4..aa66b26f12b 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -149,3 +149,71 @@ ..() new /obj/item/weapon/stamp/chameleon(src) new /obj/item/weapon/pen/chameleon(src) + new /obj/item/device/destTagger(src) + new /obj/item/weapon/packageWrap(src) + new /obj/item/weapon/hand_labeler(src) + +/obj/item/weapon/storage/box/syndie_kit/spy + name = "spy kit" + desc = "For when you want to conduct voyeurism from afar." + +/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) + +/obj/item/weapon/storage/box/syndie_kit/g9mm + name = "\improper Smooth operator" + desc = "9mm with silencer kit." + +/obj/item/weapon/storage/box/syndie_kit/g9mm/New() + ..() + new /obj/item/weapon/gun/projectile/pistol(src) + new /obj/item/weapon/silencer(src) + +/obj/item/weapon/storage/box/syndie_kit/cigarette + name = "\improper Tricky smokes" + desc = "Comes with the following brands of cigarettes, in this order: 2xFlash, 2xSmoke, 1xMindBreaker, 1xTricordrazine. Avoid mixing them up." + +/obj/item/weapon/storage/box/syndie_kit/cigarette/New() + ..() + var/obj/item/weapon/storage/fancy/cigarettes/pack + pack = new /obj/item/weapon/storage/fancy/cigarettes(src) + fill_cigarre_package(pack, list("aluminum" = 5, "potassium" = 5, "sulfur" = 5)) + pack.desc += " 'F' has been scribbled on it." + + pack = new /obj/item/weapon/storage/fancy/cigarettes(src) + fill_cigarre_package(pack, list("aluminum" = 5, "potassium" = 5, "sulfur" = 5)) + pack.desc += " 'F' has been scribbled on it." + + pack = new /obj/item/weapon/storage/fancy/cigarettes(src) + fill_cigarre_package(pack, list("potassium" = 5, "sugar" = 5, "phosphorus" = 5)) + pack.desc += " 'S' has been scribbled on it." + + pack = new /obj/item/weapon/storage/fancy/cigarettes(src) + fill_cigarre_package(pack, list("potassium" = 5, "sugar" = 5, "phosphorus" = 5)) + pack.desc += " 'S' has been scribbled on it." + + pack = new /obj/item/weapon/storage/fancy/cigarettes(src) + // Dylovene. Going with 1.5 rather than 1.6666666... + fill_cigarre_package(pack, list("potassium" = 1.5, "nitrogen" = 1.5, "silicon" = 1.5)) + // Mindbreaker + fill_cigarre_package(pack, list("silicon" = 4.5, "hydrogen" = 4.5)) + + pack.desc += " 'MB' has been scribbled on it." + + pack = new /obj/item/weapon/storage/fancy/cigarettes(src) + pack.reagents.add_reagent("tricordrazine", 15 * pack.storage_slots) + pack.desc += " 'T' has been scribbled on it." + + new /obj/item/weapon/flame/lighter/zippo(src) + +/proc/fill_cigarre_package(var/obj/item/weapon/storage/fancy/cigarettes/C, var/list/reagents) + for(var/reagent in reagents) + C.reagents.add_reagent(reagent, reagents[reagent] * C.storage_slots) + diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 56aefbc7188..2774f8822f1 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -166,11 +166,7 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/donkpocket //SPECIAL proc/warm_up(var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked) - being_cooked.warm = 1 - being_cooked.reagents.add_reagent("tricordrazine", 5) - being_cooked.bitesize = 6 - being_cooked.name = "Warm " + being_cooked.name - being_cooked.cooltime() + being_cooked.heat() make_food(var/obj/container as obj) var/obj/item/weapon/reagent_containers/food/snacks/donkpocket/being_cooked = ..(container) warm_up(being_cooked) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 15347c25805..5a86291dd53 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -792,7 +792,7 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/Stat() ..() - if(statpanel("Status")) //not looking at that panel + if(statpanel("MC")) //not looking at that panel if(client && client.holder) stat(null,"Location:\t([x], [y], [z])") @@ -808,6 +808,7 @@ note dizziness decrements automatically in the mob's Life() proc. stat(null,"Obj-[master_controller.objects_cost]\t#[processing_objects.len]") stat(null,"Net-[master_controller.networks_cost]\tPnet-[master_controller.powernets_cost]") stat(null,"NanoUI-[master_controller.nano_cost]\t#[nanomanager.processing_uis.len]") + stat(null,"Events-[master_controller.events_cost]\t#[event_manager.active_events.len]") stat(null,"Tick-[master_controller.ticker_cost]\tALL-[master_controller.total_cost]") else stat(null,"MasterController-ERROR") @@ -1210,4 +1211,4 @@ mob/proc/yank_out_object() /mob/verb/westfaceperm() set hidden = 1 facing_dir = null - set_face_dir(WEST) + set_face_dir(WEST) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 944fd914109..18ff946cc89 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -137,3 +137,33 @@ /obj/item/weapon/pen/chameleon/get_signature(var/mob/user) return signature ? signature : "Anonymous" + +/obj/item/weapon/pen/chameleon/verb/set_colour() + set name = "Change Pen Colour" + set category = "Object" + + var/list/possible_colours = list ("Yellow", "Green", "Pink", "Blue", "Orange", "Cyan", "Red", "Invisible", "Black") + var/selected_type = input("Pick new colour.", "Pen Colour", null, null) as null|anything in possible_colours + + if(selected_type) + switch(selected_type) + if("Yellow") + colour = COLOR_YELLOW + if("Green") + colour = COLOR_GREEN + if("Pink") + colour = COLOR_PINK + if("Blue") + colour = COLOR_BLUE + if("Orange") + colour = COLOR_ORANGE + if("Cyan") + colour = COLOR_CYAN + if("Red") + colour = COLOR_RED + if("Invisible") + colour = COLOR_WHITE + else + colour = COLOR_BLACK + usr << "You select the [lowertext(selected_type)] ink container." + diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index b4ae141cd74..ed33bbfe48e 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -66,8 +66,10 @@ max_ammo = 10 multiple_sprites = 1 -/obj/item/ammo_magazine/mc9mm/empty - max_ammo = 0 +/obj/item/ammo_magazine/mc9mm/empty/New() + ..() + stored_ammo = list() + update_icon() /obj/item/ammo_magazine/c9mm name = "Ammunition Box (9mm)" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index f12420f7dce..a0c6b0e5cb7 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -85,7 +85,7 @@ origin_tech = "combat=2;materials=2;syndicate=2" ammo_type = "/obj/item/ammo_casing/c9mm" load_method = MAGAZINE - mag_type = /obj/item/ammo_magazine/mc9mm/empty + mag_type = /obj/item/ammo_magazine/mc9mm /obj/item/weapon/gun/projectile/pistol/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index b8d45d8d2dd..703c48032e2 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -696,6 +696,23 @@ reagents.add_reagent("protein", 6) bitesize = 2 +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket + name = "\improper Sin-pocket" + desc = "The food of choice for the veteran. Do NOT overconsume." + filling_color = "#6D6D00" + heated_reagents = list("doctorsdelight" = 5, "hyperzine" = 0.75, "synaptizine" = 0.25) + var/has_been_heated = 0 + +/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user) + if(has_been_heated) + user << "The heating chemicals have already been spent." + return + has_been_heated = 1 + user.visible_message("[user] crushes \the [src] package.", "You crush \the [src] package and feel a comfortable heat build up.") + spawn(200) + user << "You think \the [src] is ready to eat about now." + heat() + /obj/item/weapon/reagent_containers/food/snacks/donkpocket name = "Donk-pocket" desc = "The food of choice for the seasoned traitor." @@ -708,12 +725,22 @@ reagents.add_reagent("protein", 2) var/warm = 0 - proc/cooltime() //Not working, derp? + var/list/heated_reagents = list("tricordrazine" = 5) + proc/heat() + warm = 1 + for(var/reagent in heated_reagents) + reagents.add_reagent(reagent, heated_reagents[reagent]) + bitesize = 6 + name = "Warm " + name + cooltime() + + proc/cooltime() if (src.warm) - spawn( 4200 ) + spawn(4200) src.warm = 0 - src.reagents.del_reagent("tricordrazine") - src.name = "donk-pocket" + for(var/reagent in heated_reagents) + src.reagents.del_reagent(reagent) + src.name = initial(name) return /obj/item/weapon/reagent_containers/food/snacks/brainburger diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 34ce53a2b67..804b0347be7 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -190,6 +190,38 @@ ..() reagents.add_reagent("dexalin", 15) +/obj/item/weapon/reagent_containers/pill/dexalin_plus + name = "Dexalin Plus pill" + desc = "Used to treat extreme oxygen deprivation." + icon_state = "pill8" + New() + ..() + reagents.add_reagent("dexalin", 15) + +/obj/item/weapon/reagent_containers/pill/dermaline + name = "Dermaline pill" + desc = "Used to treat burn wounds." + icon_state = "pill12" + New() + ..() + reagents.add_reagent("dermaline", 15) + +/obj/item/weapon/reagent_containers/pill/dylovene + name = "Dylovene pill" + desc = "A broad-spectrum anti-toxin." + icon_state = "pill13" + New() + ..() + reagents.add_reagent("anti_toxin", 15) + +/obj/item/weapon/reagent_containers/pill/inaprovaline + name = "Inaprovaline pill" + desc = "Used to stabilize patients." + icon_state = "pill20" + New() + ..() + reagents.add_reagent("inaprovaline", 30) + /obj/item/weapon/reagent_containers/pill/bicaridine name = "Bicaridine pill" desc = "Used to treat physical injuries." @@ -216,3 +248,11 @@ reagents.add_reagent("impedrezene", 10) reagents.add_reagent("synaptizine", 5) reagents.add_reagent("hyperzine", 5) + + /obj/item/weapon/reagent_containers/pill/spaceacillin + name = "Spaceacillin" + desc = "Contains antiviral agents." + icon_state = "pill19" + New() + ..() + reagents.add_reagent("spaceacillin", 15) diff --git a/code/setup.dm b/code/setup.dm index 6f45678c392..5a1a6b4b21e 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -644,6 +644,7 @@ var/list/be_special_flags = list( #define COLOR_YELLOW "#FFFF00" #define COLOR_ORANGE "#FF9900" #define COLOR_WHITE "#FFFFFF" +#define COLOR_BLACK "#000000" /* * Germs and infections. diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index 1239c1c1b58..efc73c54368 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index c7521751add..98a12e5ff1a 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index ffad059da43..bb8033bbe8c 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ