From e7fbdf7286e2786bfbd0e52adbe3640328388494 Mon Sep 17 00:00:00 2001 From: jack-fractal Date: Sat, 7 Nov 2015 12:39:41 -0500 Subject: [PATCH] Adding improvised signal jammers Adds improvised signal jammers, does a bit of light refactoring, makes signal jammers stop radio signallers. --- code/game/objects/items/devices/PDA/PDA.dm | 25 ++--- .../game/objects/items/devices/radio/radio.dm | 13 +-- .../objects/items/devices/radio_jammer.dm | 105 +++++++++++++++--- code/modules/assembly/signaler.dm | 12 +- code/modules/mob/inventory.dm | 7 ++ code/modules/power/cell.dm | 11 +- icons/obj/assemblies/new_assemblies.dmi | Bin 3346 -> 3631 bytes 7 files changed, 128 insertions(+), 45 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 16e12dac..f9a329b6 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -968,12 +968,10 @@ var/global/list/obj/item/device/pda/PDAs = list() for (var/obj/machinery/message_server/MS in message_servers) //PDAs are now dependent on the Message Server. if(MS.active) - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(MS, Jammer) <= Jammer.radius && prob(75)) - continue finding_server - useMS = MS - break + if (within_jamming_range(MS) && prob(75)) + continue finding_server + useMS = MS + break var/datum/signal/signal = src.telecomms_process() @@ -984,22 +982,13 @@ var/global/list/obj/item/device/pda/PDAs = list() var/turf/pos = get_turf(P) if(pos.z in signal.data["level"]) useTC = 2 - //Jamming the recipient - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(P, Jammer) <= Jammer.radius) - useTC = 1 - break + if(within_jamming_range(P)) //Jamming the recipient + useTC = 1 //Let's make this barely readable if(signal.data["compression"] > 0) t = Gibberish(t, signal.data["compression"] + 50) - var/isjammed = 0 - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(src, Jammer) <= Jammer.radius) - isjammed = 1 - break + var/isjammed = within_jamming_range(src) if(useMS && useTC && !isjammed) // only send the message if it's stable if(useTC != 2) // Does our recipient have a broadcaster on their level? diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index c29dece6..cfbacf33 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -320,11 +320,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /* ###### Radio headsets can only broadcast through subspace ###### */ if(subspace_transmission) - //Actually, first we check if we're being jammed or not! - if (active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(src, Jammer) <= Jammer.radius) - return + if (within_jamming_range(src)) //Actually, first we check if we're being jammed or not! + return // First, we want to generate a new radio signal var/datum/signal/signal = new @@ -638,10 +635,8 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use return -1 if(!listening) return -1 - if (subspace_transmission == 1 && active_radio_jammers && active_radio_jammers.len) - for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) - if (get_dist(src, Jammer) <= Jammer.radius) - return -1 + if (subspace_transmission == 1 && within_jamming_range(src)) + return -1 if(!(0 in level)) var/turf/position = get_turf(src) if(!position || !(position.z in level)) diff --git a/code/game/objects/items/devices/radio_jammer.dm b/code/game/objects/items/devices/radio_jammer.dm index 1083260d..1012e0ce 100644 --- a/code/game/objects/items/devices/radio_jammer.dm +++ b/code/game/objects/items/devices/radio_jammer.dm @@ -1,6 +1,12 @@ //Global list for housing active radiojammers: var/list/active_radio_jammers = list() +proc/within_jamming_range(var/atom/test) // tests if an object is near a radio jammer + if (active_radio_jammers && active_radio_jammers.len) + for (var/obj/item/device/radiojammer/Jammer in active_radio_jammers) + if (get_dist(test, Jammer) <= Jammer.radius) + return TRUE + /obj/item/device/radiojammer name = "radio jammer" desc = "A small, inconspicious looking item with an 'ON/OFF' toggle." @@ -10,29 +16,102 @@ var/list/active_radio_jammers = list() var/active = 0 var/radius = 7 + var/icon_state_active = "shield1" + var/icon_state_inactive = "shield0" /obj/item/device/radiojammer/New() ..() + update() +/obj/item/device/radiojammer/Del() if (active) - active_radio_jammers += src - icon_state = "shield1" + active_radio_jammers -= src + ..() + /obj/item/device/radiojammer/attack_self() toggle() + /obj/item/device/radiojammer/emp_act() toggle() + /obj/item/device/radiojammer/proc/toggle() - switch (active) - if (0) - usr << "You activate \the [src]." - active = 1 - active_radio_jammers += src - icon_state = "shield1" - if (1) - usr << "You deactivate \the [src]." - active = 0 - active_radio_jammers -= src - icon_state = "shield0" + if(active) + usr << "You deactivate \the [src]." + else + usr << "You activate \the [src]." + set_active(!active) + + +/obj/item/device/radiojammer/proc/set_active(var/new_value) + active = new_value + update() + + +/obj/item/device/radiojammer/proc/update() + if (active) + active_radio_jammers += src + icon_state = icon_state_active + else + active_radio_jammers -= src + icon_state = icon_state_inactive + + +/obj/item/device/radiojammer/improvised + name = "improvised radio jammer" + desc = "An awkward bundle of wires, batteries, and radio transmitters." + var/obj/item/device/assembly_holder/assembly_holder + var/obj/item/weapon/cell/cell + var/power_drain_per_second = 200 + var/last_updated = null + radius = 5 + icon = 'icons/obj/assemblies/new_assemblies.dmi' + icon_state_active = "improvised_jammer_active" + icon_state_inactive = "improvised_jammer_inactive" + + +/obj/item/device/radiojammer/improvised/New(var/obj/item/device/assembly_holder/incoming_holder, var/obj/item/weapon/cell/incoming_cell, var/mob/user) + ..() + var/active_hand = user.hand + var/cell_was_in_hand = (user.l_hand==incoming_cell || user.r_hand ==incoming_cell) + user.drop_item_if_in_either_hand(incoming_holder,src) + user.drop_item_if_in_either_hand(incoming_cell,src) + assembly_holder = incoming_holder + assembly_holder.loc = src // this should never be necessary, but lets just be sure + cell = incoming_cell + cell.loc = src + set_active(TRUE) + last_updated = world.timeofday + processing_objects.Add(src) // drain that battery + if (cell_was_in_hand) + if(active_hand) + user.put_in_l_hand(src) + else + user.put_in_r_hand(src) + else + src.loc = user.loc + +/obj/item/device/radiojammer/improvised/Del() + if(active) + processing_objects.Remove(src) + ..() + + +/obj/item/device/radiojammer/improvised/process() + var/current = world.timeofday // current tick + var/delta = (current - last_updated) / 10.0 // delta in seconds + last_updated = current + if (!(cell.use(delta * power_drain_per_second))) + set_active(FALSE) + cell.charge = 0 // drain the last of the battery + processing_objects.Remove(src) + + +/obj/item/device/radiojammer/improvised/attack_self(mob/user as mob) + user << "You disassemble the improvised signal jammer." + user.put_in_hands(assembly_holder) + user.put_in_hands(cell) + del(src) + diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index ae18faed..1a2987c5 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -99,8 +99,12 @@ proc/signal() - if(!radio_connection) return - + if(!radio_connection) + return + + if(within_jamming_range(src)) // can't send a signal through jammers + return + var/datum/signal/signal = new signal.source = src signal.encryption = code @@ -126,6 +130,8 @@ receive_signal(datum/signal/signal) + if(within_jamming_range(src)) // can't receive signals while jammed + return if(!signal) return 0 if(signal.encryption != code) return 0 if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 @@ -166,4 +172,4 @@ set desc = "BOOOOM!" deadman = 1 processing_objects.Add(src) - usr.visible_message("\red [usr] moves their finger over [src]'s signal button...") + usr.visible_message("\red [usr] moves their finger over [src]'s signal button...") \ No newline at end of file diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 192c8d93..b5f64ced 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -102,6 +102,13 @@ return 1 return 0 + +/mob/proc/drop_item_if_in_either_hand(var/obj/item/W,var/atom/Target) + if (l_hand==W) + return drop_l_hand(Target) + if (r_hand==W) + return drop_r_hand(Target) + //Drops the item in our left hand /mob/proc/drop_l_hand(var/atom/Target) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index fd9fdfbf..fdd40340 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -89,8 +89,15 @@ message_mods("[user.name] ([user.ckey]) injected a power cell with plasma, rigging it to explode.") S.reagents.clear_reagents() - - + + if(istype(W,/obj/item/device/assembly_holder)) + var/obj/item/device/assembly_holder/holder = W + if(istype(holder.a_left,/obj/item/device/assembly/signaler) && istype(holder.a_right,/obj/item/device/assembly/signaler)) + user << "You make an improvised signal jammer from \the [holder]." + new /obj/item/device/radiojammer/improvised(holder,src,user) + + + /obj/item/weapon/cell/proc/explode() var/turf/T = get_turf(src.loc) /* diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi index 8b0ea26ed23bc4abfa7127ac3c928d629200a8e9..d7bd47acfe37f31c64b38d687bf7879fcd3a0365 100644 GIT binary patch delta 3210 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 ZfsLhN6psj1`1ey9Fg|al|4J8s=f9KPbQ}Nx