mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
Added and completed radio broadcasting system.
This commit is contained in:
@@ -20,25 +20,27 @@ var/global/media_receivers=list()
|
||||
update_music()
|
||||
|
||||
/obj/machinery/media/receiver/proc/connect_frequency()
|
||||
// This is basically media_receivers[media_frequency] += src
|
||||
// This is basically media_receivers["[media_frequency]"] += src
|
||||
var/list/receivers=list()
|
||||
if(media_frequency in media_receivers)
|
||||
receivers = media_receivers[media_frequency]
|
||||
var/freq = num2text(media_frequency)
|
||||
if(freq in media_receivers)
|
||||
receivers = media_receivers[freq]
|
||||
receivers.Add(src)
|
||||
media_receivers[media_frequency]=receivers
|
||||
media_receivers[freq]=receivers
|
||||
|
||||
// Check if there's a broadcast to tune into.
|
||||
if(media_frequency in media_transmitters)
|
||||
if(freq in media_transmitters)
|
||||
// Pick a random broadcast in that frequency.
|
||||
var/obj/machinery/media/transmitter/B = pick(media_transmitters[media_frequency])
|
||||
var/obj/machinery/media/transmitter/B = pick(media_transmitters[freq])
|
||||
if(B.media_crypto == media_crypto) // Crypto-key check, if needed.
|
||||
receive_broadcast(B.media_url,B.media_start_time)
|
||||
|
||||
/obj/machinery/media/receiver/proc/disconnect_frequency()
|
||||
var/list/receivers=list()
|
||||
if(media_frequency in media_receivers)
|
||||
receivers = media_receivers[media_frequency]
|
||||
var/freq = num2text(media_frequency)
|
||||
if(freq in media_receivers)
|
||||
receivers = media_receivers[freq]
|
||||
receivers.Remove(src)
|
||||
media_receivers[media_frequency]=receivers
|
||||
media_receivers[freq]=receivers
|
||||
|
||||
receive_broadcast()
|
||||
|
||||
@@ -6,30 +6,48 @@
|
||||
icon_state="radio"
|
||||
|
||||
var/on=0
|
||||
/obj/machinery/media/receiver/boombox/interact(var/mob/user)
|
||||
if(!on)
|
||||
return
|
||||
|
||||
/obj/machinery/media/receiver/boombox/initialize()
|
||||
if(on)
|
||||
update_on()
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/media/receiver/boombox/attack_hand(var/mob/user)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
usr << "\red You don't see anything to mess with."
|
||||
return
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/media/receiver/boombox/interact(var/mob/user)
|
||||
var/dat = "<html><head><title>[src]</title></head><body><TT>"
|
||||
dat += {"
|
||||
Power: <a href="?src=\ref[src];power=[!on]">[on ? "On" : "Off"]</a><BR>
|
||||
Power: <a href="?src=\ref[src];power=1">[on ? "On" : "Off"]</a><BR>
|
||||
Frequency: <A href='byond://?src=\ref[src];set_freq=-1'>[format_frequency(media_frequency)]</a><BR>
|
||||
"}
|
||||
dat+={"</TT></body></html>"}
|
||||
user << browse(dat, "window=radio-recv")
|
||||
onclose(user, "radio-recv")
|
||||
return
|
||||
|
||||
/obj/machinery/media/receiver/boombox/proc/update_on()
|
||||
if(on)
|
||||
visible_message("\The [src] hisses to life!")
|
||||
playing=1
|
||||
connect_frequency()
|
||||
else
|
||||
visible_message("\The [src] falls quiet.")
|
||||
playing=0
|
||||
disconnect_frequency()
|
||||
|
||||
/obj/machinery/media/receiver/boombox/Topic(href,href_list)
|
||||
if(isobserver(usr) && !isAdminGhost(usr))
|
||||
usr << "\red You can't push buttons when your fingers go right through them, dummy."
|
||||
return
|
||||
..()
|
||||
if("power" in href_list)
|
||||
on = !on
|
||||
if(on)
|
||||
visible_message("\The [src] hisses to life!")
|
||||
connect_frequency()
|
||||
else
|
||||
visible_message("\The [src] falls quiet.")
|
||||
disconnect_frequency()
|
||||
return
|
||||
update_on()
|
||||
if("set_freq" in href_list)
|
||||
var/newfreq=media_frequency
|
||||
if(href_list["set_freq"]!="-1")
|
||||
@@ -45,3 +63,24 @@
|
||||
connect_frequency()
|
||||
else
|
||||
usr << "\red Invalid FM frequency. (90.0, 200.0)"
|
||||
updateDialog()
|
||||
|
||||
|
||||
/obj/machinery/media/receiver/boombox/wallmount
|
||||
name = "Sound System"
|
||||
desc = "This plays music for this room."
|
||||
|
||||
icon='icons/obj/radio.dmi'
|
||||
icon_state="wallradio"
|
||||
anchored=1
|
||||
|
||||
/obj/machinery/media/receiver/boombox/wallmount/muzak
|
||||
on=1
|
||||
media_frequency=1015
|
||||
|
||||
/obj/machinery/media/receiver/boombox/wallmount/update_on()
|
||||
..()
|
||||
if(on)
|
||||
icon_state="wallradio-p"
|
||||
else
|
||||
icon_state="wallradio"
|
||||
@@ -19,24 +19,28 @@ var/global/media_transmitters=list()
|
||||
|
||||
/obj/machinery/media/transmitter/proc/connect_frequency()
|
||||
var/list/transmitters=list()
|
||||
if(media_frequency in media_transmitters)
|
||||
transmitters = media_transmitters[media_frequency]
|
||||
var/freq = num2text(media_frequency)
|
||||
if(freq in media_transmitters)
|
||||
transmitters = media_transmitters[freq]
|
||||
transmitters.Add(src)
|
||||
media_transmitters[media_frequency]=transmitters
|
||||
media_transmitters[freq]=transmitters
|
||||
|
||||
|
||||
/obj/machinery/media/transmitter/update_music()
|
||||
//..()
|
||||
if(media_frequency in media_receivers)
|
||||
for(var/obj/machinery/media/receiver/R in media_receivers[media_frequency])
|
||||
var/freq = num2text(media_frequency)
|
||||
if(freq in media_receivers)
|
||||
for(var/obj/machinery/media/receiver/R in media_receivers[freq])
|
||||
if(R.media_crypto == media_crypto)
|
||||
R.receive_broadcast(media_url,media_start_time)
|
||||
//testing("[src]: Sending music to [R]")
|
||||
|
||||
/obj/machinery/media/transmitter/proc/disconnect_frequency()
|
||||
var/list/transmitters=list()
|
||||
if(media_frequency in media_transmitters)
|
||||
transmitters = media_transmitters[media_frequency]
|
||||
var/freq = num2text(media_frequency)
|
||||
if(freq in media_transmitters)
|
||||
transmitters = media_transmitters[freq]
|
||||
transmitters.Remove(src)
|
||||
media_transmitters[media_frequency]=transmitters
|
||||
media_transmitters[freq]=transmitters
|
||||
|
||||
broadcast()
|
||||
|
||||
@@ -1,36 +1,141 @@
|
||||
/obj/machinery/media/transmitter/broadcast
|
||||
name = "FM Transmitter"
|
||||
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"
|
||||
l_color="#4285F4"
|
||||
use_power = 1
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 1000
|
||||
|
||||
var/on=0
|
||||
var/obj/machinery/media/source=null
|
||||
var/integrity=100
|
||||
var/list/obj/machinery/media/sources=list()
|
||||
var/heating_power=40000
|
||||
var/list/autolink = null
|
||||
|
||||
/obj/machinery/media/transmitter/broadcast/proc/hook_media_source()
|
||||
if(!source) return
|
||||
// Hook into output
|
||||
if(!source.hookMediaOutput(src,exclusive=1))
|
||||
return
|
||||
source.update_music() // Request music update
|
||||
var/const/RADS_PER_TICK=150
|
||||
var/const/MAX_TEMP=70 // Celsius
|
||||
|
||||
/obj/machinery/media/transmitter/broadcast/proc/unhook_media_source()
|
||||
if(!source) return
|
||||
// Hook into output
|
||||
if(!source.unhookMediaOutput(src))
|
||||
/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)
|
||||
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/light_switch/power_change()
|
||||
if(powered(LIGHT))
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
stat |= NOPOWER
|
||||
|
||||
updateicon()
|
||||
|
||||
/obj/machinery/light_switch/emp_act(severity)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
..(severity)
|
||||
return
|
||||
power_change()
|
||||
..(severity)
|
||||
|
||||
/obj/machinery/media/transmitter/broadcast/update_icon()
|
||||
overlays = 0
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
if(on)
|
||||
overlays+="broadcaster on"
|
||||
SetLuminosity(3) // OH FUUUUCK
|
||||
use_power = 2
|
||||
else
|
||||
SetLuminosity(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
|
||||
if(on)
|
||||
visible_message("\The [src] hums as it begins pumping energy into the air!")
|
||||
connect_frequency()
|
||||
hook_media_source()
|
||||
else
|
||||
visible_message("\The [src] falls quiet and makes a soft ticking noise as it cools down.")
|
||||
unhook_media_source()
|
||||
disconnect_frequency()
|
||||
update_on()
|
||||
return
|
||||
if("set_freq" in href_list)
|
||||
var/newfreq=media_frequency
|
||||
@@ -48,24 +153,85 @@
|
||||
else
|
||||
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) )
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
M.apply_effect((rads*3),IRRADIATE)
|
||||
else
|
||||
M.radiation += rads
|
||||
|
||||
// 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)
|
||||
|
||||
//world << "got [transfer_moles] moles at [removed.temperature]"
|
||||
|
||||
if(removed)
|
||||
|
||||
var/heat_capacity = removed.heat_capacity()
|
||||
//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)
|
||||
|
||||
//world << "now at [removed.temperature]"
|
||||
|
||||
env.merge(removed)
|
||||
|
||||
//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)))
|
||||
if(source)
|
||||
unhook_media_source()
|
||||
source=O
|
||||
hook_media_source()
|
||||
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(source==O)
|
||||
unhook_media_source()
|
||||
source=null
|
||||
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))
|
||||
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==source
|
||||
return O in sources
|
||||
|
||||
/obj/machinery/media/transmitter/broadcast/dj
|
||||
id_tag = "dj"
|
||||
media_frequency=1015
|
||||
autolink = list("DJ Satellite")
|
||||
on=1
|
||||
@@ -108,7 +108,6 @@ var/global/loopModeNames=list(
|
||||
linked_account = department_accounts[department]
|
||||
else
|
||||
linked_account = station_account
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/media/jukebox/attack_ai(var/mob/user)
|
||||
attack_hand(user)
|
||||
@@ -259,6 +258,9 @@ var/global/loopModeNames=list(
|
||||
|
||||
|
||||
/obj/machinery/media/jukebox/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
update_multitool_menu(user)
|
||||
return 1
|
||||
if(istype(W, /obj/item/weapon/card/emag))
|
||||
current_song = 0
|
||||
if(!emagged)
|
||||
@@ -426,6 +428,9 @@ var/global/loopModeNames=list(
|
||||
update_icon()
|
||||
return
|
||||
visible_message("<span class='notice'>\icon[src] \The [src] beeps, and the menu on its front fills with [playlist.len] items.</span>","<em>You hear a beep.</em>")
|
||||
if(autoplay)
|
||||
playing=1
|
||||
autoplay=0
|
||||
else
|
||||
testing("[src] failed to update playlist: Response null.")
|
||||
stat &= BROKEN
|
||||
@@ -482,6 +487,22 @@ var/global/loopModeNames=list(
|
||||
"rock" = "Rock"
|
||||
)
|
||||
|
||||
// Relaxing elevator music~
|
||||
/obj/machinery/media/jukebox/dj
|
||||
|
||||
playlist_id="muzak"
|
||||
autoplay = 1
|
||||
|
||||
id_tag="DJ Satellite" // For autolink
|
||||
|
||||
// Must be defined on your server.
|
||||
playlists=list(
|
||||
"bar" = "Bar Mix",
|
||||
"jazz" = "Jazz",
|
||||
"rock" = "Rock",
|
||||
"muzak" = "Muzak"
|
||||
)
|
||||
|
||||
// So I don't have to do all this shit manually every time someone sacrifices pun-pun.
|
||||
// Also for debugging.
|
||||
/obj/machinery/media/jukebox/superjuke
|
||||
@@ -497,6 +518,7 @@ var/global/loopModeNames=list(
|
||||
"bar" = "Bar Mix",
|
||||
"jazz" = "Jazz",
|
||||
"rock" = "Rock",
|
||||
"muzak" = "Muzak",
|
||||
|
||||
"emagged" = "Syndie Mix",
|
||||
"shuttle" = "Shuttle",
|
||||
|
||||
@@ -9,20 +9,27 @@
|
||||
var/list/obj/machinery/media/transmitter/hooked = list()
|
||||
var/exclusive_hook=null // Disables output to the room
|
||||
|
||||
// Media system autolink.
|
||||
var/id_tag = "???"
|
||||
|
||||
/obj/machinery/media/proc/hookMediaOutput(var/obj/machinery/media/transmitter/T, exclusive=0)
|
||||
if(exclusive)
|
||||
exclusive_hook=T
|
||||
hooked.Add(T)
|
||||
return 1
|
||||
|
||||
/obj/machinery/media/proc/unhookMediaOutput(var/obj/machinery/media/transmitter/T)
|
||||
if(exclusive_hook==T)
|
||||
exclusive_hook=null
|
||||
hooked.Remove(T)
|
||||
return 1
|
||||
|
||||
// Notify everyone in the area of new music.
|
||||
// YOU MUST SET MEDIA_URL AND MEDIA_START_TIME YOURSELF!
|
||||
/obj/machinery/media/proc/update_music()
|
||||
// Broadcasting shit
|
||||
for(var/obj/machinery/media/transmitter/T in hooked)
|
||||
testing("[src] Writing media to [T].")
|
||||
T.broadcast(media_url,media_start_time)
|
||||
|
||||
if(exclusive_hook)
|
||||
|
||||
@@ -284,5 +284,5 @@
|
||||
else
|
||||
l.show_message("<span class=\"warning\">You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.</span>", 2)
|
||||
var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) )
|
||||
l.apply_effect(rads, IRRADIATE)
|
||||
l.apply_effect(rads, IRRADIATE, 0) // Permit blocking
|
||||
|
||||
|
||||
BIN
icons/obj/machines/broadcast.dmi
Normal file
BIN
icons/obj/machines/broadcast.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 7.7 KiB |
24559
maps/tgstation.dmm
24559
maps/tgstation.dmm
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user