mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-19 22:13:37 +00:00
221 lines
6.6 KiB
Plaintext
221 lines
6.6 KiB
Plaintext
/obj/machinery/media/transmitter/broadcast
|
|
name = "Radio Transmitter"
|
|
desc = "A huge hulk of steel containing high-powered phase-modulating radio transmitting equipment."
|
|
|
|
icon = 'icons/obj/machines/broadcast.dmi'
|
|
icon_state = "broadcaster"
|
|
light_color="#4285F4"
|
|
use_power = 1
|
|
idle_power_usage = 50
|
|
active_power_usage = 1000
|
|
|
|
var/on=0
|
|
var/integrity=100
|
|
var/list/obj/machinery/media/sources=list()
|
|
var/heating_power=40000
|
|
var/list/autolink = null
|
|
|
|
var/const/RADS_PER_TICK=150
|
|
var/const/MAX_TEMP=70 // Celsius
|
|
|
|
/obj/machinery/media/transmitter/broadcast/initialize()
|
|
testing("[type]/initialize() called!")
|
|
if(autolink && autolink.len)
|
|
for(var/obj/machinery/media/source in orange(20, src))
|
|
if(source.id_tag in autolink)
|
|
sources.Add(source)
|
|
testing("Autolinked [source] -> [src]")
|
|
hook_media_sources()
|
|
if(on)
|
|
update_on()
|
|
update_icon()
|
|
|
|
/obj/machinery/media/transmitter/broadcast/proc/hook_media_sources()
|
|
if(!sources.len)
|
|
return
|
|
|
|
for(var/obj/machinery/media/source in sources)
|
|
// Hook into output
|
|
source.hookMediaOutput(src,exclusive=1) // Don't hook into the room media sources.
|
|
source.update_music() // Request music update
|
|
|
|
/obj/machinery/media/transmitter/broadcast/proc/unhook_media_sources()
|
|
if(!sources.len)
|
|
return
|
|
|
|
for(var/obj/machinery/media/source in sources)
|
|
source.unhookMediaOutput(src)
|
|
|
|
broadcast() // Bzzt
|
|
/*
|
|
/obj/machinery/media/transmitter/broadcast/attackby(var/obj/item/W, mob/user, params)
|
|
if(istype(W, /obj/item/device/multitool))
|
|
update_multitool_menu(user)
|
|
return 1
|
|
|
|
/obj/machinery/media/transmitter/broadcast/attack_ai(var/mob/user as mob)
|
|
src.add_hiddenprint(user)
|
|
attack_hand(user)
|
|
|
|
/obj/machinery/media/transmitter/broadcast/attack_hand(var/mob/user as mob)
|
|
update_multitool_menu(user)
|
|
|
|
/obj/machinery/media/transmitter/broadcast/multitool_menu(var/mob/user,var/obj/item/device/multitool/P)
|
|
// You need a multitool to use this, or be silicon
|
|
if(!issilicon(user))
|
|
// istype returns false if the value is null
|
|
if(!istype(user.get_active_hand(), /obj/item/device/multitool))
|
|
return
|
|
|
|
if(stat & (BROKEN|NOPOWER))
|
|
return
|
|
|
|
var/screen = {"
|
|
<h2>Settings</h2>
|
|
<ul>
|
|
<li><b>Power:</b> <a href="?src=\ref[src];power=1">[on?"On":"Off"]</a></li>
|
|
<li><b>Frequency:</b> <a href="?src=\ref[src];set_freq=-1">[format_frequency(media_frequency)] GHz</a> (<a href="?src=\ref[src];set_freq=[initial(media_frequency)]">Reset</a>)</li>
|
|
</ul>
|
|
<h2>Media Sources</h2>"}
|
|
if(!sources.len)
|
|
screen += "<em>No media sources have been selected.</em>"
|
|
else
|
|
screen += "<ol>"
|
|
for(var/i=1;i<=sources.len;i++)
|
|
var/obj/machinery/media/source=sources[i]
|
|
screen += "<li>\ref[source] [source.name] ([source.id_tag]) <a href='?src=\ref[src];unlink=[i]'>\[X\]</a></li>"
|
|
screen += "</ol>"
|
|
return screen
|
|
*/
|
|
|
|
/obj/machinery/media/transmitter/broadcast/update_icon()
|
|
overlays = 0
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
if(on)
|
|
overlays+="broadcaster on"
|
|
set_light(3) // OH FUUUUCK
|
|
use_power = 2
|
|
else
|
|
set_light(1) // Only the tile we're on.
|
|
use_power = 1
|
|
if(sources.len)
|
|
overlays+="broadcaster linked"
|
|
|
|
/obj/machinery/media/transmitter/broadcast/proc/update_on()
|
|
if(on)
|
|
visible_message("\The [src] hums as it begins pumping energy into the air!")
|
|
connect_frequency()
|
|
hook_media_sources()
|
|
else
|
|
visible_message("\The [src] falls quiet and makes a soft ticking noise as it cools down.")
|
|
unhook_media_sources()
|
|
disconnect_frequency()
|
|
update_icon()
|
|
|
|
/obj/machinery/media/transmitter/broadcast/Topic(href,href_list)
|
|
if(..(href, href_list))
|
|
return
|
|
|
|
if("power" in href_list)
|
|
on = !on
|
|
update_on()
|
|
return
|
|
if("set_freq" in href_list)
|
|
var/newfreq=media_frequency
|
|
if(href_list["set_freq"]!="-1")
|
|
newfreq = text2num(href_list["set_freq"])
|
|
else
|
|
newfreq = input(usr, "Set a new frequency (MHz, 90.0, 200.0).", src, media_frequency) as null|num
|
|
if(newfreq)
|
|
if(findtext(num2text(newfreq), "."))
|
|
newfreq *= 10 // shift the decimal one place
|
|
if(newfreq > 900 && newfreq < 2000) // Between (90.0 and 100.0)
|
|
disconnect_frequency()
|
|
media_frequency = newfreq
|
|
connect_frequency()
|
|
else
|
|
to_chat(usr, "\red Invalid FM frequency. (90.0, 200.0)")
|
|
|
|
/obj/machinery/media/transmitter/broadcast/process()
|
|
if(stat & (NOPOWER|BROKEN))
|
|
return
|
|
if(on)
|
|
if(integrity<=0)
|
|
on=0
|
|
update_on()
|
|
|
|
// Radiation
|
|
for(var/mob/living/carbon/M in view(src,3))
|
|
var/rads = RADS_PER_TICK * sqrt( 1 / (get_dist(M, src) + 1) )
|
|
M.apply_effect((rads*3),IRRADIATE)
|
|
|
|
// Heat output
|
|
var/turf/simulated/L = loc
|
|
if(istype(L) && heating_power)
|
|
var/datum/gas_mixture/env = L.return_air()
|
|
if(env.temperature != MAX_TEMP + T0C)
|
|
|
|
var/transfer_moles = 0.25 * env.total_moles()
|
|
|
|
var/datum/gas_mixture/removed = env.remove(transfer_moles)
|
|
|
|
// to_chat(world, "got [transfer_moles] moles at [removed.temperature]")
|
|
|
|
if(removed)
|
|
|
|
var/heat_capacity = removed.heat_capacity()
|
|
// to_chat(world, "heating ([heat_capacity])")
|
|
if(heat_capacity) // Added check to avoid divide by zero (oshi-) runtime errors -- TLE
|
|
if(removed.temperature < MAX_TEMP + T0C)
|
|
removed.temperature = min(removed.temperature + heating_power/heat_capacity, 1000) // Added min() check to try and avoid wacky superheating issues in low gas scenarios -- TLE
|
|
else
|
|
removed.temperature = max(removed.temperature - heating_power/heat_capacity, TCMB)
|
|
|
|
// to_chat(world, "now at [removed.temperature]")
|
|
|
|
env.merge(removed)
|
|
|
|
// to_chat(world, "turf now at [env.temperature]")
|
|
/*
|
|
// Checks heat from the environment and applies any integrity damage
|
|
var/datum/gas_mixture/environment = loc.return_air()
|
|
switch(environment.temperature)
|
|
if(T0C to (T20C + 20))
|
|
integrity = between(0, integrity, 100)
|
|
if((T20C + 20) to INFINITY)
|
|
integrity = max(0, integrity - 1)
|
|
*/
|
|
/*
|
|
/obj/machinery/media/transmitter/broadcast/linkWith(var/mob/user, var/obj/O, var/list/context)
|
|
if(istype(O,/obj/machinery/media) && !is_type_in_list(O,list(/obj/machinery/media/transmitter,/obj/machinery/media/receiver)))
|
|
if(sources.len)
|
|
unhook_media_sources()
|
|
sources.Add(O)
|
|
hook_media_sources()
|
|
update_icon()
|
|
return 1
|
|
return 0
|
|
|
|
/obj/machinery/media/transmitter/broadcast/unlinkFrom(var/mob/user, var/obj/O)
|
|
if(O in sources)
|
|
unhook_media_sources()
|
|
sources.Remove(O)
|
|
if(sources.len)
|
|
hook_media_sources()
|
|
update_icon()
|
|
return 0
|
|
|
|
/obj/machinery/media/transmitter/broadcast/canLink(var/obj/O, var/list/context)
|
|
return istype(O,/obj/machinery/media) && !is_type_in_list(O,list(/obj/machinery/media/transmitter,/obj/machinery/media/receiver))
|
|
|
|
/obj/machinery/media/transmitter/broadcast/isLinkedWith(var/obj/O)
|
|
return O in sources
|
|
*/
|
|
|
|
/obj/machinery/media/transmitter/broadcast/dj
|
|
id_tag = "dj"
|
|
media_frequency=1015
|
|
autolink = list("DJ Satellite")
|
|
on=1
|