mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-09 16:14:13 +00:00
* initial commit * switcheroo * include the rest * fire triangle * a * update 2-20 * turfs and reagents and more * zburn first draft * remove fire_old * initial compat * stable compile * remove pressure factor * total autoignition death * thermal material datums * a * more autoignition * temporary fix for testing * everything is FUCK * burning now * stacks burning * recursive functionality * restore burnitselfup * specific burn case * everything is shit and fuck * refactor * nit * color & light performance increase * fix * smoke cap + changes * updates * final (for now) * remove double count, unit issues, and more tweaks * logspam and grammar * prevents worn or held items from burning * minimum burn time * fix runtime * The Cardboard Update * vis_contents * cigs burn lol * lmao * refactor fire protection * final fix * some more held/worn item fixes * maybe fix foods burning forever * compile * restore plasma burning lmao * review changes * copypasta error * copypasta errors 2: this time it's personal * declare * extensive fixes * fix liquid burning behavior * wtf * undo smoke cap * mutable appearances + removal of debug messages * DMDOC compat * review changes * return * misleading comment
194 lines
6.2 KiB
Plaintext
194 lines
6.2 KiB
Plaintext
var/global/list/obj/item/device/radio_jammer/radio_jammer_list = list()
|
|
|
|
#define JAMMING_SILENCE_SEVERITY 100
|
|
|
|
/obj/item/device/radio_jammer
|
|
name = "radio jammer"
|
|
desc = "A device used to jam radio communications. Requires a power cell to function."
|
|
icon_state = "radio_jammer0"
|
|
flags = FPRINT
|
|
slot_flags = SLOT_BELT
|
|
w_class = W_CLASS_SMALL
|
|
item_state = "electronic"
|
|
starting_materials = list(MAT_IRON = 500, MAT_GLASS = 100)
|
|
w_type = RECYK_ELECTRONIC
|
|
melt_temperature = MELTPOINT_PLASTIC
|
|
origin_tech = Tc_MAGNETS + "=3;" + Tc_ENGINEERING + "=4;" + Tc_MATERIALS + "=4;" + Tc_PROGRAMMING + "=3;" + Tc_SYNDICATE + "=3;" + Tc_BLUESPACE + "=3"
|
|
flammable = TRUE
|
|
var/on = 0
|
|
var/cover_open = 0
|
|
var/base_state = "radio_jammer"
|
|
var/obj/item/weapon/cell/power_src = null
|
|
var/power_usage = 500 // approx 1 minute of leisure action on default cells
|
|
|
|
/obj/item/device/radio_jammer/Destroy()
|
|
if (on)
|
|
processing_objects.Remove(src)
|
|
radio_jammer_list -= src
|
|
..()
|
|
|
|
/obj/item/device/radio_jammer/attack_self(mob/user)
|
|
if (power_src == null || power_src.charge == 0)
|
|
to_chat(user, "<span class='warning'>[src] is unresponsive. Perhaps there's something wrong with its power supply...</span>")
|
|
return
|
|
if (power_src.charge > 0 && power_src.charge < power_usage)
|
|
// suck up the rest of remaining power
|
|
power_src.use(power_usage)
|
|
to_chat(user, "<span class='warning'>[src] flickers a bit, but then dies. Perhaps there's something wrong with its power supply...</span>")
|
|
return
|
|
|
|
on = !on
|
|
icon_state = "[base_state][on]"
|
|
|
|
if (on)
|
|
to_chat(user, "<span class='notice'>You turn on [src].</span>")
|
|
playsound(src, 'sound/items/radio_jammer.wav', 100, 1)
|
|
processing_objects.Add(src)
|
|
radio_jammer_list += src
|
|
else
|
|
// should be removed from processing objects on next Process()
|
|
to_chat(user, "<span class='warning'>You turn off [src].</span>")
|
|
|
|
/obj/item/device/radio_jammer/attack_hand(mob/user)
|
|
if (cover_open && power_src && user.is_holding_item(src))
|
|
user.put_in_hands(power_src)
|
|
power_src.add_fingerprint(user)
|
|
power_src.updateicon()
|
|
|
|
// Don't rip out cells while the device is working
|
|
// Or at least if its still charged
|
|
if (on)
|
|
if (electrocute_mob(user, power_src, src))
|
|
user.visible_message("<span class='warning'>[user] gets shocked as [src] is still working!</span>", "<span class='warning'>You get shocked as [src] is still working!</span>")
|
|
spark(src)
|
|
|
|
src.power_src = null
|
|
user.visible_message("<span class='notice'>[user] removes the cell from [src].</span>", "<span class='notice'>You remove the cell from [src].</span>")
|
|
return
|
|
..()
|
|
|
|
/obj/item/device/radio_jammer/attackby(obj/item/W as obj, mob/user as mob)
|
|
if (W.is_screwdriver(user))
|
|
cover_open = !cover_open
|
|
if (cover_open)
|
|
to_chat(user, "<span class='notice'>You open up the power cell cover.</span>")
|
|
else
|
|
to_chat(user, "<span class='notice'>You close the power cell cover.</span>")
|
|
src.add_fingerprint(user)
|
|
return
|
|
|
|
if (istype(W, /obj/item/weapon/cell))
|
|
if (cover_open)
|
|
if (power_src)
|
|
to_chat(user, "<span class='warning'>There is already a cell inside, remove it first.</span>")
|
|
return
|
|
if (user.drop_item(W, src))
|
|
power_src = W
|
|
user.visible_message("<span class='notice'>[user] inserts a cell into [src].</span>", "<span class='notice'>You insert a cell into [src].</span>")
|
|
src.add_fingerprint(user)
|
|
return
|
|
else
|
|
to_chat(user, "<span class='warning'>You have to open the cover first, it's closed!</span>")
|
|
return
|
|
..()
|
|
|
|
/obj/item/device/radio_jammer/process()
|
|
if (power_src == null || !power_src.use(power_usage))
|
|
on = 0
|
|
icon_state = "[base_state][on]"
|
|
visible_message("<span class='warning'>[src] suddenly shuts down!</span>")
|
|
|
|
if (!on)
|
|
processing_objects.Remove(src)
|
|
radio_jammer_list -= src
|
|
return null
|
|
|
|
/obj/item/device/radio_jammer/examine(mob/user)
|
|
..()
|
|
to_chat(user, "The cover is [cover_open ? "open" : "closed"].")
|
|
to_chat(user, "<span class='warning'>It's turned [on ? "on!" : "off."]</span>")
|
|
// Can only see cell charge % if its turned on
|
|
// or if the cover is open
|
|
if (cover_open)
|
|
to_chat(user, "There is [power_src ? "a" : "no"] power cell inside.")
|
|
if (power_src)
|
|
to_chat(user, "You can see that it's current charge is [round(power_src.percent())]%")
|
|
else
|
|
if (on)
|
|
to_chat(user, "Current charge: [round(power_src.percent())]%")
|
|
|
|
// Returns distance to the closest radio jammer
|
|
/proc/get_min_radio_jammer_dist(position)
|
|
var/mindist = MAX_VALUE
|
|
|
|
for (var/obj/item/device/radio_jammer/J in radio_jammer_list)
|
|
var/dist = get_dist(position, J)
|
|
if (dist < mindist)
|
|
mindist = dist
|
|
return mindist
|
|
|
|
// Returns the severity of jamming applied to parameter obj
|
|
// 100 or more severity = silence.
|
|
/proc/radio_jamming_severity(who)
|
|
// could multiply the effect of several jammers tbh but this is faster
|
|
var/mindist = get_min_radio_jammer_dist(who)
|
|
|
|
if (mindist <= 1)
|
|
// ;HELP IN DORMS
|
|
return JAMMING_SILENCE_SEVERITY
|
|
if (mindist == 2)
|
|
return 99
|
|
if (mindist == 3)
|
|
return 80
|
|
if (mindist == 4)
|
|
return 66
|
|
if (mindist == 5)
|
|
return 40
|
|
if (mindist == 6)
|
|
return 25
|
|
if (mindist == 7)
|
|
return 12
|
|
|
|
return 0
|
|
|
|
// Returns true if severity is bad enough to completely silence the radio device
|
|
/proc/is_completely_jammed(severity)
|
|
return severity >= JAMMING_SILENCE_SEVERITY;
|
|
|
|
// Both could be tuples tbh
|
|
/datum/jammed_radio_src
|
|
var/obj/item/device/radio/radio
|
|
var/severity
|
|
|
|
/datum/jammed_radio_src/New(var/r, var/s)
|
|
radio = r
|
|
severity = s
|
|
|
|
/datum/jammed_mob_dst
|
|
var/atom/movable/attached
|
|
var/severity
|
|
|
|
/datum/jammed_mob_dst/New(var/a, var/s)
|
|
attached = a
|
|
severity = s
|
|
|
|
// Returns a list of mobs that heard the msg through jammed radio devices and their disruption severity
|
|
// Each mob will hear the least disrupted msg.
|
|
// @radios - list of radio devices and corresponding jamming severity
|
|
/proc/get_mobs_in_jammed_radio_ranges(list/datum/jammed_radio_src/radios)
|
|
var/list/datum/jammed_mob_dst/mobs = new/list()
|
|
|
|
for (var/datum/jammed_radio_src/S in radios)
|
|
if (S.radio)
|
|
var/turf/turf = get_turf(S.radio)
|
|
|
|
if (turf)
|
|
for (var/mob/virtualhearer/VH in hearers(S.radio.canhear_range, turf))
|
|
// Update minimal jamming severity for hearers.
|
|
if (mobs[VH] == null)
|
|
mobs[VH] = new /datum/jammed_mob_dst(VH.attached, S.severity)
|
|
else
|
|
if (S.severity < mobs[VH].severity)
|
|
mobs[VH].severity = S.severity
|
|
return mobs
|