From 2389e9a7780efb6f72601535f9982879de418c4f Mon Sep 17 00:00:00 2001 From: Rob Nelson Date: Thu, 17 Apr 2014 02:12:54 -0700 Subject: [PATCH] Fix a bunch of jukebox issues, clean up UI a bit, add feedback, allow slapping it to reset if broken. --- code/modules/media/jukebox.dm | 48 +++++++++++++++++++++++++++++----- html/browser/common.css | 16 ++++++++++++ icons/obj/jukebox.dmi | Bin 5108 -> 5523 bytes 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/code/modules/media/jukebox.dm b/code/modules/media/jukebox.dm index ce97be063c6..7456419b2f6 100644 --- a/code/modules/media/jukebox.dm +++ b/code/modules/media/jukebox.dm @@ -39,6 +39,21 @@ str += ", from '[album]'" return str + proc/displaytitle() + if(artist==""&&title=="") + return "\[NO TAGS\]" + var/str="" + if(artist!="") + str += "[artist]" + else + str += "Unattributed" + str += " - " + if(title!="") + str += "\"[title]\"" + else + str += "Untitled" + return str + var/global/loopModeNames=list( JUKEMODE_SHUFFLE = "Shuffle", @@ -96,7 +111,10 @@ var/global/loopModeNames=list( /obj/machinery/media/jukebox/update_icon() overlays = 0 if(stat & (NOPOWER|BROKEN)) - icon_state = "jukebox2-nopower" + if(stat & BROKEN) + icon_state = "jukebox2-broken" + else + icon_state = "jukebox2-nopower" stop_playing() return icon_state = "jukebox2" @@ -110,7 +128,14 @@ var/global/loopModeNames=list( return world.time > last_reload + JUKEBOX_RELOAD_COOLDOWN /obj/machinery/media/jukebox/attack_hand(var/mob/user) - if(stat & (NOPOWER|BROKEN) || emagged) + if(stat & NOPOWER) + usr << "\red You don't see anything to mess with." + return + if(stat & BROKEN && playlist!=null) + user.visible_message("\red [user.name] smacks the side of \the [src.name].","\red You hammer the side of \the [src.name].") + playlist=null + playing=emagged + update_icon() return var/t = "

Jukebox Interface

" t += "Power: [playing?"On":"Off"]
" @@ -122,7 +147,9 @@ var/global/loopModeNames=list( t += "Playlist: " for(var/plid in playlists) t += "[playlists[plid]]" - t += "
" + else + t += "Please wait before changing playlists." + t += "
" if(current_song) var/datum/song_info/song=playlist[current_song] t += "Current song: [song.artist] - [song.title]
" @@ -130,7 +157,7 @@ var/global/loopModeNames=list( var/i for(i = 1,i <= playlist.len,i++) var/datum/song_info/song=playlist[i] - t += "#[i][song.artist] - [song.title][song.album]" + t += "#[i][song.displaytitle()][song.album]" t += "" user.set_machine(src) var/datum/browser/popup = new (user,"jukebox",name,420,700) @@ -149,14 +176,16 @@ var/global/loopModeNames=list( loop_mode = JUKEMODE_SHUFFLE emagged = 1 playing = 1 - user.visible_message("[user.name] emags the [src.name].","\red You short out the [src.name].") + user.visible_message("[user.name] slides something into the [src.name]'s card-reader.","\red You short out the [src.name].") update_icon() update_music() return /obj/machinery/media/jukebox/Topic(href, href_list) ..() - if(emagged) return + if(emagged) + usr << "\red You touch the bluescreened menu. Nothing happens. You feel dumber." + return if (href_list["power"]) playing=!playing @@ -203,9 +232,14 @@ var/global/loopModeNames=list( var/songdata = reader.read_value() for(var/list/record in songdata) playlist += new /datum/song_info(record) + if(playlist.len==0) + visible_message("\icon[src] \The [src] buzzes, unable to update its playlist.","You hear a buzz.") + stat &= BROKEN + update_icon() + return visible_message("\icon[src] \The [src] beeps, and the menu on its front fills with [playlist.len] items.","You hear a beep.") else - //testing("Failed to update playlist: Response null.") + testing("[src] failed to update playlist: Response null.") stat &= BROKEN update_icon() return diff --git a/html/browser/common.css b/html/browser/common.css index 9755dd54017..49f3fdd6e94 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -25,6 +25,22 @@ a, a:link, a:visited, a:active, .linkOn, .linkOff cursor:default; } +a.nobg, a.nobg:link, a.nobg:visited, a.nobg:active +{ + color: #ffffff; + text-decoration: none; + background: transparent; + border: none; + padding: 0px; + margin: 0px; + cursor:default; + font-weight:bold; +} +a.nobg:hover +{ + color:#40628a; +} + a:hover { color: #40628a; diff --git a/icons/obj/jukebox.dmi b/icons/obj/jukebox.dmi index 02b3f7cb45120da866c5333f354d9212a89daba7..b4c938fb4f5cd1405fafc4b76fae8612378f2855 100644 GIT binary patch literal 5523 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 S3Ft2?U~%5cr0lFq?0*0skWcXd literal 5108 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 r