diff --git a/code/datums/wires/jukebox.dm b/code/datums/wires/jukebox.dm
new file mode 100644
index 00000000000..f482133e62a
--- /dev/null
+++ b/code/datums/wires/jukebox.dm
@@ -0,0 +1,66 @@
+/datum/wires/jukebox
+ random = 1
+ holder_type = /obj/machinery/media/jukebox
+ wire_count = 7
+
+var/const/WIRE_POWER = 1
+var/const/WIRE_HACK = 2
+var/const/WIRE_SPEEDUP = 4
+var/const/WIRE_SPEEDDOWN = 8
+var/const/WIRE_REVERSE = 16
+var/const/WIRE_NOTHING1 = 32
+var/const/WIRE_NOTHING2 = 64
+
+/datum/wires/jukebox/CanUse(var/mob/living/L)
+ var/obj/machinery/media/jukebox/A = holder
+ if(A.panel_open)
+ return 1
+ return 0
+
+// Show the status of lights as a hint to the current state
+/datum/wires/jukebox/GetInteractWindow()
+ var/obj/machinery/media/jukebox/A = holder
+ . += ..()
+ . += "
The power light is [(A.stat & (BROKEN|NOPOWER)) ? "off" : "on"].
"
+ . += "The parental guidance light is [A.hacked ? "off" : "on"].
"
+ . += "The data light is [IsIndexCut(WIRE_REVERSE) ? "hauntingly dark" : "glowing sloftly"].
"
+
+// Give a hint as to what each wire does
+/datum/wires/jukebox/UpdatePulsed(var/index)
+ var/obj/machinery/media/jukebox/A = holder
+ switch(index)
+ if(WIRE_POWER)
+ holder.visible_message("\icon[holder] The power light flickers.")
+ A.shock(usr, 90)
+ if(WIRE_HACK)
+ holder.visible_message("\icon[holder] The parental guidance light flickers.")
+ if(WIRE_REVERSE)
+ holder.visible_message("\icon[holder] The data light blinks ominously.")
+ if(WIRE_SPEEDUP)
+ holder.visible_message("\icon[holder] The speakers squeaks.")
+ if(WIRE_SPEEDDOWN)
+ holder.visible_message("\icon[holder] The speakers rumble.")
+ else
+ A.shock(usr, 10) // The nothing wires give a chance to shock just for fun
+
+/datum/wires/jukebox/UpdateCut(var/index, var/mended)
+ var/obj/machinery/media/jukebox/A = holder
+
+ switch(index)
+ if(WIRE_POWER)
+ // TODO - Actually make machine electrified or something.
+ A.shock(usr, 90)
+
+ if(WIRE_HACK)
+ if(mended)
+ A.set_hacked(0)
+ else
+ A.set_hacked(1)
+
+ if(WIRE_SPEEDUP, WIRE_SPEEDDOWN, WIRE_REVERSE)
+ var/newfreq = IsIndexCut(WIRE_REVERSE) ? -1 : 1;
+ if (IsIndexCut(WIRE_SPEEDUP))
+ newfreq *= 2
+ if (IsIndexCut(WIRE_SPEEDDOWN))
+ newfreq *= 0.5
+ A.freq = newfreq
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index 3cc537be495..3b661b77fe3 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
datum/track
var/title
var/sound
@@ -23,6 +21,11 @@ datum/track/New(var/title_name, var/audio)
var/playing = 0
+ // Vars for hacking
+ var/datum/wires/jukebox/wires = null
+ var/hacked = 0 // Whether to show the hidden songs or not
+ var/freq = 0
+
var/datum/track/current_track
var/list/datum/track/tracks = list(
new/datum/track("Beyond", 'sound/ambience/ambispace.ogg'),
@@ -36,6 +39,14 @@ datum/track/New(var/title_name, var/audio)
new/datum/track("Trai`Tor", 'sound/music/traitor.ogg'),
)
+ // Only visible if hacked
+ var/list/datum/track/secret_tracks = list(
+ //new/datum/track("Bandit Radio", 'sound/music/bandit_radio.ogg'), // Waiting on email from GSC World about the copyright status of this.
+ new/datum/track("Space Asshole", 'sound/music/space_asshole.ogg'),
+ new/datum/track("Thunderdome", 'sound/music/THUNDERDOME.ogg'),
+ new/datum/track("Russkiy rep Diskoteka", 'sound/music/russianrapdisco.ogg')
+ )
+
/obj/machinery/media/jukebox/New()
..()
circuit = new circuit(src)
@@ -44,11 +55,41 @@ datum/track/New(var/title_name, var/audio)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/stack/cable_coil(src, 5)
RefreshParts()
+ wires = new/datum/wires/jukebox(src)
/obj/machinery/media/jukebox/Destroy()
StopPlaying()
+ qdel(wires)
+ wires = null
..()
+/obj/machinery/media/jukebox/proc/set_hacked(var/newhacked)
+ if (hacked == newhacked) return
+ hacked = newhacked
+ if (hacked)
+ tracks.Add(secret_tracks)
+ else
+ tracks.Remove(secret_tracks)
+ updateDialog()
+
+/obj/machinery/media/jukebox/attackby(obj/item/W as obj, mob/user as mob)
+ src.add_fingerprint(user)
+
+ if(default_deconstruction_screwdriver(user, W))
+ return
+ if(default_deconstruction_crowbar(user, W))
+ return
+ if(istype(W, /obj/item/weapon/wrench))
+ if(playing)
+ StopPlaying()
+ user.visible_message("[user] has [anchored ? "un" : ""]secured \the [src].", "You [anchored ? "un" : ""]secure \the [src].")
+ anchored = !anchored
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ power_change()
+ update_icon()
+ return
+ return ..()
+
/obj/machinery/media/jukebox/power_change()
if(!powered(power_channel) || !anchored)
stat |= NOPOWER
@@ -73,6 +114,8 @@ datum/track/New(var/title_name, var/audio)
overlays += "[state_base]-emagged"
else
overlays += "[state_base]-running"
+ if (panel_open)
+ overlays += "panel_open"
/obj/machinery/media/jukebox/Topic(href, href_list)
if(..() || !(Adjacent(usr) || istype(usr, /mob/living/silicon)))
@@ -213,11 +256,17 @@ datum/track/New(var/title_name, var/audio)
return
var/area/main_area = get_area(src)
- main_area.forced_ambience = list(current_track.sound)
+ if(freq)
+ var/sound/new_song = sound(current_track.sound, channel = 1, repeat = 1, volume = 25)
+ new_song.frequency = freq
+ main_area.forced_ambience = list(new_song)
+ else
+ main_area.forced_ambience = list(current_track.sound)
+
for(var/mob/living/M in mobs_in_area(main_area))
if(M.mind)
main_area.play_ambience(M)
playing = 1
update_use_power(2)
- update_icon()
+ update_icon()
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index 045a3f731fb..1095f16c658 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -250,6 +250,7 @@
#include "code\datums\wires\autolathe.dm"
#include "code\datums\wires\camera.dm"
#include "code\datums\wires\explosive.dm"
+#include "code\datums\wires\jukebox.dm"
#include "code\datums\wires\particle_accelerator.dm"
#include "code\datums\wires\radio.dm"
#include "code\datums\wires\robot.dm"
diff --git a/sound/music/bandit_radio.ogg b/sound/music/bandit_radio.ogg
new file mode 100644
index 00000000000..9057dfda73c
Binary files /dev/null and b/sound/music/bandit_radio.ogg differ
diff --git a/sound/music/russianrapdisco.ogg b/sound/music/russianrapdisco.ogg
new file mode 100644
index 00000000000..6c749817499
Binary files /dev/null and b/sound/music/russianrapdisco.ogg differ