Added and completed radio broadcasting system.

This commit is contained in:
Rob Nelson
2014-07-27 02:14:06 -07:00
parent 416373d3be
commit 3aa98e64d3
10 changed files with 12584 additions and 12337 deletions

View File

@@ -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()

View File

@@ -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"

View File

@@ -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()

View File

@@ -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

View File

@@ -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",

View File

@@ -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)

View File

@@ -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

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

File diff suppressed because it is too large Load Diff