From e2b4876a5d10c729625f66e3619e54cac2b6c35a Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 9 May 2016 22:47:51 -0400 Subject: [PATCH] Resolves Issue #8 - Making Juke Boxes hackable * Created new jukebox type with new features. * Adds all of our songs to the repository. * Adds all of our songs to the jukebox. * Makes juke boxes hackable. * Modify areas to enable playing of frequency-altered sounds. * Replaced normal jukeboxes with our nice ones on the map. --- code/datums/wires/jukebox_vr.dm | 66 ++++++++++++ code/game/area/areas.dm | 5 +- code/game/machinery/jukebox_vr.dm | 101 ++++++++++++++++++ icons/obj/jukebox_vr.dmi | Bin 0 -> 7870 bytes maps/virgo-1.dmm | 4 +- sound/music/jukebox/BelowTheAsteroids.ogg | Bin 0 -> 2213734 bytes sound/music/jukebox/Cantina.ogg | Bin 0 -> 1981172 bytes sound/music/jukebox/DuckTalesMoon.mid | Bin 0 -> 15588 bytes sound/music/jukebox/Fly_Me_To_The_Moon.ogg | Bin 0 -> 2925786 bytes sound/music/jukebox/MinorTurbulenceFull.ogg | Bin 0 -> 5273347 bytes sound/music/jukebox/OdeToGreed.ogg | Bin 0 -> 4649337 bytes sound/music/jukebox/Ransacked.ogg | Bin 0 -> 5367093 bytes sound/music/jukebox/SongAboutHares.ogg | Bin 0 -> 1630657 bytes sound/music/jukebox/TobyFoxGhostFight.mid | Bin 0 -> 12640 bytes sound/music/jukebox/WelcomeToJurassicPark.mid | Bin 0 -> 24444 bytes sound/music/jukebox/bandit_radio.ogg | Bin 0 -> 1593187 bytes sound/music/jukebox/russianrapdisco.ogg | Bin 0 -> 1641724 bytes vorestation.dme | 4 +- 18 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 code/datums/wires/jukebox_vr.dm create mode 100644 code/game/machinery/jukebox_vr.dm create mode 100644 icons/obj/jukebox_vr.dmi create mode 100644 sound/music/jukebox/BelowTheAsteroids.ogg create mode 100644 sound/music/jukebox/Cantina.ogg create mode 100644 sound/music/jukebox/DuckTalesMoon.mid create mode 100644 sound/music/jukebox/Fly_Me_To_The_Moon.ogg create mode 100644 sound/music/jukebox/MinorTurbulenceFull.ogg create mode 100644 sound/music/jukebox/OdeToGreed.ogg create mode 100644 sound/music/jukebox/Ransacked.ogg create mode 100644 sound/music/jukebox/SongAboutHares.ogg create mode 100644 sound/music/jukebox/TobyFoxGhostFight.mid create mode 100644 sound/music/jukebox/WelcomeToJurassicPark.mid create mode 100644 sound/music/jukebox/bandit_radio.ogg create mode 100644 sound/music/jukebox/russianrapdisco.ogg diff --git a/code/datums/wires/jukebox_vr.dm b/code/datums/wires/jukebox_vr.dm new file mode 100644 index 0000000000..bfe62be2bd --- /dev/null +++ b/code/datums/wires/jukebox_vr.dm @@ -0,0 +1,66 @@ +/datum/wires/jukebox + random = 1 + holder_type = /obj/machinery/media/jukebox/vore + 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/vore/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/vore/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/vore/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/area/areas.dm b/code/game/area/areas.dm index 1c420728ba..caa6e78a7f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -257,7 +257,10 @@ var/list/mob/living/forced_ambiance_list = new if(forced_ambience) if(forced_ambience.len) forced_ambiance_list |= L - L << sound(pick(forced_ambience), repeat = 1, wait = 0, volume = 25, channel = 1) + var/sound/chosen_ambiance = pick(forced_ambience) + if(!istype(chosen_ambiance)) + chosen_ambiance = sound(chosen_ambiance, repeat = 1, wait = 0, volume = 25, channel = 1) + L << chosen_ambiance else L << sound(null, channel = 1) else if(src.ambience.len && prob(35)) diff --git a/code/game/machinery/jukebox_vr.dm b/code/game/machinery/jukebox_vr.dm new file mode 100644 index 0000000000..90eb4de98c --- /dev/null +++ b/code/game/machinery/jukebox_vr.dm @@ -0,0 +1,101 @@ +// The improved, hackable jukebox for vorestation! + +/obj/machinery/media/jukebox/vore + name = "space jukebox" + icon = 'icons/obj/jukebox_vr.dmi' + + // Vars for hacking + var/datum/wires/jukebox/wires = null + var/hacked = 0 // Whether to show the hidden songs or not + var/freq = 0 + + // Only visible if hacked + var/list/datum/track/secret_tracks = list( + new/datum/track("Bandit Radio", 'sound/music/jukebox/bandit_radio.ogg'), + new/datum/track("Ghost Fight (Toby Fox)", 'sound/music/jukebox/TobyFoxGhostFight.mid'), + new/datum/track("Space Asshole", 'sound/music/space_asshole.ogg'), + new/datum/track("THUNDERDOME", 'sound/music/THUNDERDOME.ogg'), + ) + + // Normally visible tracks + tracks = list( + // AND WE DO NOT CARE~! AND WE DO NOT CARE~! + new/datum/track("A Song About Hares", 'sound/music/jukebox/SongAboutHares.ogg'), + new/datum/track("Below The Asteroids", 'sound/music/jukebox/BelowTheAsteroids.ogg'), + new/datum/track("Beyond", 'sound/ambience/ambispace.ogg'), + new/datum/track("Clouds of Fire", 'sound/music/clouds.s3m'), + new/datum/track("D`Bert", 'sound/music/title2.ogg'), + new/datum/track("D`Fort", 'sound/ambience/song_game.ogg'), + new/datum/track("Duck Tales - Moon", 'sound/music/jukebox/DuckTalesMoon.mid'), + new/datum/track("Endless Space", 'sound/music/space.ogg'), + new/datum/track("Floating", 'sound/music/main.ogg'), + new/datum/track("Fly Me To The Moon", 'sound/music/jukebox/Fly_Me_To_The_Moon.ogg'), + new/datum/track("Mad About Me", 'sound/music/jukebox/Cantina.ogg'), + new/datum/track("Minor Turbulence", 'sound/music/jukebox/MinorTurbulenceFull.ogg'), + new/datum/track("Ode to Greed", 'sound/music/jukebox/OdeToGreed.ogg'), + new/datum/track("Part A", 'sound/misc/TestLoop1.ogg'), + new/datum/track("Ransacked", 'sound/music/jukebox/Ransacked.ogg'), + // EVEN THOUGH THE STATION IS FULL OF HUNGRY WOLVES + new/datum/track("Russkiy rep Diskoteka", 'sound/music/jukebox/russianrapdisco.ogg'), + new/datum/track("Scratch", 'sound/music/title1.ogg'), + new/datum/track("Space Oddity", 'sound/music/space_oddity.ogg'), + new/datum/track("Trai`Tor", 'sound/music/traitor.ogg'), + new/datum/track("Welcome To Jurassic Park", 'sound/music/jukebox/WelcomeToJurassicPark.mid') + ) + +/obj/machinery/media/jukebox/vore/New() + ..() + wires = new/datum/wires/jukebox(src) + +/obj/machinery/media/jukebox/vore/Destroy() + ..() + qdel(wires) + wires = null + +/obj/machinery/media/jukebox/vore/update_icon() + ..() + if (panel_open) + overlays += "panel_open" + + +/obj/machinery/media/jukebox/vore/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/vore/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + if (default_deconstruction_screwdriver(user, W)) + return + if(istype(W, /obj/item/weapon/wirecutters)) + return wires.Interact(user) + if(istype(W, /obj/item/device/multitool)) + return wires.Interact(user) + return ..() + + +/obj/machinery/media/jukebox/vore/StartPlaying() + StopPlaying() + if(!current_track) + return + + var/area/main_area = get_area(src) + 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() diff --git a/icons/obj/jukebox_vr.dmi b/icons/obj/jukebox_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..52386940e9819a4b76d794f9ede58d51f665859c GIT binary patch literal 7870 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 x!JW