Files
VOREStation/code/game/objects/items/devices/radio/jammer.dm
Neerti bc40a45cc4 Adds Radio Jammers to Traitor Uplink
Subspace Jammers can be bought in the traitor uplink for 25 TC.  They are already in the code, but this PR adds them to the uplink.

This PR also adds a power meter to the sprite, as a small QoL change.

They run off of weapon cells and one cell will last for about a minute.
2017-07-06 21:20:10 -04:00

114 lines
3.3 KiB
Plaintext

var/global/list/active_radio_jammers = list()
/proc/is_jammed(var/obj/radio)
var/turf/Tr = get_turf(radio)
if(!Tr) return 0 //Nullspace radios don't get jammed.
for(var/jammer in active_radio_jammers)
var/obj/item/device/radio_jammer/J = jammer
var/turf/Tj = get_turf(J)
if(J.on && Tj.z == Tr.z) //If we're on the same Z, it's worth checking.
var/dist = get_dist(Tj,Tr)
if(dist <= J.jam_range)
return list("jammer" = J, "distance" = dist)
/obj/item/device/radio_jammer
name = "subspace jammer"
desc = "Primarily for blocking subspace communications, preventing the use of headsets, PDAs, and communicators."
icon = 'icons/obj/device.dmi'
icon_state = "jammer0"
var/active_state = "jammer1"
var/last_overlay_percent = null // Stores overlay icon_state to avoid excessive recreation of overlays.
var/on = 0
var/jam_range = 7
var/obj/item/weapon/cell/device/weapon/power_source
var/tick_cost = 80 // Will last for roughly one minute, as process() ticks every 2 seconds.
origin_tech = list(TECH_ILLEGAL = 7, TECH_BLUESPACE = 5) //Such technology! Subspace jamming!
/obj/item/device/radio_jammer/New()
power_source = new(src)
update_icon() // So it starts with the full overlay.
/obj/item/device/radio_jammer/Destroy()
if(on)
turn_off()
qdel_null(power_source)
return ..()
/obj/item/device/radio_jammer/proc/turn_off(mob/user)
if(user)
to_chat(user,"<span class='warning'>\The [src] deactivates.</span>")
processing_objects.Remove(src)
active_radio_jammers -= src
on = FALSE
update_icon()
/obj/item/device/radio_jammer/proc/turn_on(mob/user)
if(user)
to_chat(user,"<span class='notice'>\The [src] is now active.</span>")
processing_objects.Add(src)
active_radio_jammers += src
on = TRUE
update_icon()
/obj/item/device/radio_jammer/process()
if(!power_source || !power_source.check_charge(tick_cost))
var/mob/living/notify
if(isliving(loc))
notify = loc
turn_off(notify)
else
power_source.use(tick_cost)
update_icon()
/obj/item/device/radio_jammer/attack_hand(mob/user)
if(user.get_inactive_hand() == src && power_source)
to_chat(user,"<span class='notice'>You eject \the [power_source] from \the [src].</span>")
user.put_in_hands(power_source)
power_source = null
turn_off()
else
return ..()
/obj/item/device/radio_jammer/attack_self(mob/user)
if(on)
turn_off(user)
else
if(power_source)
turn_on(user)
else
to_chat(user,"<span class='warning'>\The [src] has no power source!</span>")
/obj/item/device/radio_jammer/attackby(obj/W, mob/user)
if(istype(W,/obj/item/weapon/cell/device/weapon) && !power_source)
power_source = W
power_source.update_icon() //Why doesn't a cell do this already? :|
user.unEquip(power_source)
power_source.forceMove(src)
update_icon()
to_chat(user,"<span class='notice'>You insert \the [power_source] into \the [src].</span>")
/obj/item/device/radio_jammer/update_icon()
if(on)
icon_state = active_state
else
icon_state = initial(icon_state)
var/overlay_percent = 0
if(power_source)
overlay_percent = between(0, round( power_source.percent() , 25), 100)
else
overlay_percent = 0
// Only Cut() if we need to.
if(overlay_percent != last_overlay_percent)
overlays.Cut()
var/image/I = image(src.icon, src, "jammer_overlay_[overlay_percent]")
overlays += I
last_overlay_percent = overlay_percent