Earphone Soundplayers (#20964)

Adds soundplayer functionality to earphones, headphones and earbuds.
They can now play music, loaded via music cartridges with preset
playlists.

Heavily based off CMSS13's Walkmans and our Audioconsoles.

Current Features:

- All earphones have a cartridge slot. Cartridges can be inserted by
clicking an earphone, and removed via an eject_music_cartridge() verb.
- Inserting a cartridge will load a playlist containing /datum/tracks,
where track names and sound files are loaded.
- Shift+Clicking or will Start/Stop a playlist, creating or deleting an
active sound_player token.
- Alt+Clicking with Pause/Unpause the current track, preserving an
active sound_player token.
- Attack_self will eject the music cartridge. Ejecting a music cartridge
also terminates the sound_player token.
- Volume controllable via verb.

Missing features i am too weak to figure out:

- There is no auto—next song, and a user must manually use next_song()
or previous_song() verbs to iterate through a playlist.
- Part and parcel with no auto-next: Tracks automatically loop due to
using the PlayLoopingSound() proc. Ideally, tracks should not loop.
-  There is no accomodation for user-uploaded sound files.
- There are no UI implementations of earphone controls, which could be
more user friendly.

Music Cartridge CoderIcons:
<img width="430" height="106" alt="aaa"
src="https://github.com/user-attachments/assets/5c15d5f4-b2e1-4ece-8076-2e93a5853168"
/>

### Asset Licenses
The following assets that **have not** been created by myself are
included in this PR:

| Path | Original Author | License |
| --- | --- | --- |
| sound/music/regional/venus/all_night.ogg | Rollergirl
(https://rollergirl.bandcamp.com/album/rollergirl) | CC BY-NC-SA 3.0 |
| sound/music/regional/venus/billy_ocean.ogg | Rollergirl
(https://rollergirl.bandcamp.com/album/rollergirl) | CC BY-NC-SA 3.0 |
| sound/music/regional/venus/artificially_sweetened.ogg | Stevia Sphere
(https://steviasphere.bandcamp.com/album/artificially-sweetened-single)
| CC BY 3.0 |
|sound/music/regional/venus/real_love.ogg | Stevia Sphere
(https://steviasphere.bandcamp.com/album/artificially-sweetened-single)
| CC BY 3.0 |
| sound/music/regional/venus/dance.ogg | ウナチャンUNACHAN
(https://unachan.bandcamp.com/track/dance) | CC BY 3.0 |
| sound/music/regional/venus/love_sensation.ogg | ウナチャンUNACHAN and
bedroomtheft (https://unachan.bandcamp.com/track/love-sensation) | CC BY
3.0 |
| sound/music/regional/venus/funky_girl.ogg | B~mO9000
(https://bmo9000.bandcamp.com/album/v-i-n-t-a-g-e) | CC BY-NC-SA 3.0 |
| sound/music/regional/venus/break_the_system.ogg |
(https://bmo9000.bandcamp.com/album/wanted-in-80s [Download Only]) | CC
CC BY-SA 3.0 |
| sound/music/regional/xanu/xanu_rock_3.ogg | Swara Sutra
(https://swarasutra.bandcamp.com/album/indulgence) | CC BY-SA 3.0 |

All sound files compressed to 20K sample rate. No
transformations/remixing
This commit is contained in:
smellie
2025-07-22 10:08:40 +00:00
committed by GitHub
parent ff5927c692
commit d438053ddd
28 changed files with 2986 additions and 2554 deletions
+1
View File
@@ -1924,6 +1924,7 @@
#include "code\modules\clothing\ears\antennae.dm"
#include "code\modules\clothing\ears\bandanna.dm"
#include "code\modules\clothing\ears\earmuffs.dm"
#include "code\modules\clothing\ears\earphones.dm"
#include "code\modules\clothing\ears\earrings.dm"
#include "code\modules\clothing\ears\xeno\bulwark.dm"
#include "code\modules\clothing\ears\xeno\skrell.dm"
+11
View File
@@ -36,6 +36,17 @@ GLOBAL_DATUM_INIT(sound_player, /singleton/sound_player, new)
return PlaySoundDatum(source, sound_id, S, range, prefer_mute, sound_type)
/singleton/sound_player/proc/PlayNonloopingSound(atom/source, sound_id, sound, volume, range, falloff = 1, echo, frequency, prefer_mute, sound_type = ASFX_AMBIENCE)
var/sound/S = istype(sound, /sound) ? sound : new(sound)
S.environment = 0 // Ensures a 3D effect even if x/y offset happens to be 0 the first time it's played
S.volume = volume
S.falloff = falloff
S.echo = echo
S.frequency = frequency
S.repeat = FALSE
return PlaySoundDatum(source, sound_id, S, range, prefer_mute, sound_type)
/singleton/sound_player/proc/PrivStopSound(datum/sound_token/sound_token)
var/channel = sound_token.sound.channel
var/sound_id = sound_token.sound_id
-1
View File
@@ -36,7 +36,6 @@
new/datum/track("Thunderdome", 'sound/music/THUNDERDOME.ogg')
)
/obj/machinery/media/jukebox/Destroy()
StopPlaying()
return ..()
@@ -14,20 +14,6 @@
path = /obj/item/clothing/accessory/ear_warmers
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION
/datum/gear/ears/double/headphones
display_name = "headphone selection"
description = "A selection of headphones."
path = /obj/item/clothing/ears/earmuffs/earphones/headphones
flags = GEAR_HAS_COLOR_SELECTION
/datum/gear/ears/double/headphones/New()
..()
var/list/headphones = list()
headphones["headphones"] = /obj/item/clothing/ears/earmuffs/earphones/headphones
headphones["earphones"] = /obj/item/clothing/ears/earmuffs/earphones
headphones["earbuds"] = /obj/item/clothing/ears/earmuffs/earphones/earbuds
gear_tweaks += new /datum/gear_tweak/path(headphones)
/datum/gear/ears/earrings
display_name = "earring selection"
description = "A selection of eye-catching earrings."
@@ -179,3 +179,34 @@
/datum/gear/utility/buddy_tag/New()
..()
gear_tweaks += new /datum/gear_tweak/buddy_tag_config()
/datum/gear/utility/earphones
display_name = "earphones selection"
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION
path = /obj/item/clothing/ears/earphones
cost = 1
/datum/gear/utility/earphones/New()
..()
var/list/earphones = list()
earphones["headphones"] = /obj/item/clothing/ears/earphones/headphones
earphones["earphones"] = /obj/item/clothing/ears/earphones
earphones["earbuds"] = /obj/item/clothing/ears/earphones/earbuds
gear_tweaks += new /datum/gear_tweak/path(earphones)
/datum/gear/utility/earphones_music_cartridge
display_name = "earphones music cartridge selection"
flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION
path = /obj/item/music_cartridge/audioconsole
cost = 1
/datum/gear/utility/earphones_music_cartridge/New()
..()
var/list/music_cartridges = list()
music_cartridges["Konyang Vibes 2463"] = /obj/item/music_cartridge/konyang_retrowave
music_cartridges["Top of the Charts 66 (Venusian Hits)"] = /obj/item/music_cartridge/venus_funkydisco
music_cartridges["SCC Welcome Package"] = /obj/item/music_cartridge/audioconsole
music_cartridges["Spacer Classics Vol. 1"] = /obj/item/music_cartridge/
music_cartridges["Indulgence EP (X-Rock)"] = /obj/item/music_cartridge/xanu_rock
music_cartridges["Electro-Swing of Adhomai"] = /obj/item/music_cartridge/adhomai_swing
gear_tweaks += new /datum/gear_tweak/path(music_cartridges)
-52
View File
@@ -7,58 +7,6 @@
item_flags = ITEM_FLAG_SOUND_PROTECTION
slot_flags = SLOT_EARS | SLOT_TWOEARS
contained_sprite = TRUE
var/on = FALSE
/obj/item/clothing/ears/earmuffs/earphones
name = "earphones"
desc = "A pair of wired earphones. Good luck trying to find a headphone jack."
desc_extended = "Has a tendency to snag itself on whatever furniture it can find at the most inopportune of times."
icon_state = "earphones"
item_state = "earphones"
build_from_parts = TRUE
/obj/item/clothing/ears/earmuffs/earphones/attack_self(mob/user)
togglemusic()
/obj/item/clothing/ears/earmuffs/earphones/verb/togglemusic()
set name = "Toggle Headphone Music"
set category = "Object"
set src in usr
if(!isliving(usr))
return
if(use_check_and_message(usr))
return
playsound(src, /singleton/sound_category/button_sound, 10)
if(on)
ClearOverlays()
worn_overlay = null
to_chat(usr, SPAN_NOTICE("You turn the music off."))
else
worn_overlay = "music" // this is rather annoying but prevents the music notes on getting colored
to_chat(usr, SPAN_NOTICE("You turn the music on."))
on = !on
update_icon()
update_clothing_icon()
/obj/item/clothing/ears/earmuffs/earphones/headphones
name = "headphones"
desc = "A pair of headphones. Cushioned and sound-cancelling."
desc_extended = "Unce unce unce unce."
icon_state = "headphones"
item_state = "headphones"
/obj/item/clothing/ears/earmuffs/earphones/headphones/update_icon()
..()
AddOverlays(overlay_image(icon, "[icon_state]_overlay", flags=RESET_COLOR))
/obj/item/clothing/ears/earmuffs/earphones/earbuds
name = "earbuds"
desc = "A pair of wireless earbuds. Don't lose them."
desc_extended = "Oh god, they can't hear us! They've got earbuds on!"
icon_state = "earbuds"
item_state = "earbuds"
/obj/item/clothing/accessory/ear_warmers
name = "ear warmers"
+437
View File
@@ -0,0 +1,437 @@
/*
Earphones that use our sound_player system to play sounds from a music cartridge to their wearer.
Current Features:
- All earphones have a cartridge slot. Cartridges can be inserted by clicking an earphone, and removed via an eject_music_cartridge() verb.
- Inserting a cartridge will load a playlist containing /datum/tracks, where track names and sound files are loaded.
- Shift+Clicking will Start/Stop a playlist, creating or deleting an active sound_player token.
- Alt+Clicking with Pause/Unpause the current track, preserving an active sound_player token.
- attack_self will eject the music cartridge. Ejecting a music cartridge also terminates the sound_player token.
- Volume controllable via verb.
Missing features i am too weak to figure out:
- There is no auto—next song, and a user must manually use next_song() or previous_song() verbs to iterate through a playlist.
- Part and parcel with no auto-next: Tracks automatically loop due to using the PlayLoopingSound() proc. Ideally, tracks should not loop.
- There is no accomodation for user-uploaded sound files.
- There are no UI implementations of earphone controls, which could be more user friendly.
*/
/obj/item/clothing/ears/earphones
name = "earphones"
desc = "A pair of wireless earphones. Includes a little slot for a music cartridge."
desc_mechanics = "Shift+Click to Start/Stop a playlist. Alt+Click to Pause/Resume the current track. Click character to eject cartridge. Alternatively, use verbs."
icon = 'icons/obj/clothing/ears/earmuffs.dmi'
icon_state = "earphones"
item_state = "earphones"
slot_flags = SLOT_EARS
contained_sprite = TRUE
build_from_parts = TRUE
/// The music cartridge loaded into the earphones. The source of which sound files to play.
var/obj/item/music_cartridge/music_cartridge
/// The active sound_token for the sound_player. Created per track and deleted when a song is stopped.
var/datum/sound_token/soundplayer_token = null
/// A list of /datum/tracks the earphones will iterate through to select sound files. /datum/tracks supplied by a music cartridge item.
var/list/datum/track/current_playlist = list()
/// For iterating through current_player() to select new sounds
var/playlist_index = 1
/// Volume. Affected by change_volume() proc/verb so users may control the volume.
var/volume = 25
/// Range. No use for this yet, but maybe someone will want to make a boombox or something that has a larger range.
var/range = 0
/// Is a track playing? For icon updates.
var/playing = FALSE
/obj/item/clothing/ears/earphones/Destroy()
StopPlaying()
QDEL_NULL(music_cartridge)
. = ..()
/*
Music Cartridge Procs:
*/
// Cartridge Insertion
/obj/item/clothing/ears/earphones/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/music_cartridge))
if(attacking_item == user.get_active_hand())
if(!music_cartridge) // Making sure there is no track in there already
user.drop_from_inventory(attacking_item, src)
music_cartridge = attacking_item
read_music_cartridge(attacking_item, user) // This is where tracks will actually get loaded
to_chat(user, SPAN_NOTICE("You insert \the [attacking_item] into \the [src]"))
else
to_chat(user, SPAN_WARNING("There's already a music cartridge in there."))
..()
/obj/item/clothing/ears/earphones/proc/read_music_cartridge(obj/item/music_cartridge/cartridge, mob/user)
StopPlaying() // New cartridge in, so clean up our sound token if it hasn't already been for some reason
playlist_index = 1 // Back to the beginning
if(music_cartridge.tracks)
for(var/datum/track/track in music_cartridge.tracks)
current_playlist += track // Move all the tracks stored on the music_cartridge to our current_playlist
to_chat(user, SPAN_NOTICE("Now listening to: [music_cartridge.name]."))
/obj/item/clothing/ears/earphones/proc/eject_music_cartridge(mob/user)
if(!music_cartridge)
to_chat(user,SPAN_WARNING("There is no music cartridge in \the [src]!"))
return
StopPlaying() // Stop & Clean Up
current_playlist.Cut()
user.put_in_hands(music_cartridge)
music_cartridge = null
to_chat(user,SPAN_NOTICE("You eject the music cartridge from \the [src]."))
/obj/item/clothing/ears/earphones/attack_self(mob/user)
eject_music_cartridge(user)
..()
/*
Starting and Stopping Procs
*/
/obj/item/clothing/ears/earphones/proc/StopPlaying()
if(!soundplayer_token)
return
soundplayer_token.Stop()
QDEL_NULL(soundplayer_token) // A sound token is created per-song, so we'll be liberal with cleaning up old tokens.
// Icon/Overlay stuff for the music notes
ClearOverlays()
worn_overlay = null
update_icon()
update_clothing_icon()
/obj/item/clothing/ears/earphones/proc/StartPlaying(mob/user)
if(!music_cartridge)
to_chat(user, SPAN_WARNING("No cartridge loaded."))
return
// Make sure we aren't doubling up on soundtokens
if(!soundplayer_token)
if(current_playlist && (current_playlist.len > 0))
var/sound/sound_to_play = current_playlist[playlist_index].sound
soundplayer_token = GLOB.sound_player.PlayLoopingSound(src, src, sound_to_play, volume, range, 20, prefer_mute = FALSE, sound_type = ASFX_MUSIC)
//addtimer(CALLBACK(src, PROC_REF(next_song), user), (sound_to_play.len SECOND)) // Queue the next_song() proc when the current song ends. Clean up handled under next_song() which also calls stopplaying() to end this token
// If someone gets ^this^ to work, you can switch out PlayLoopingSound for PlayNonloopingSound
// the sound's len variable doesn't seem to actually store a length :/
// Chat Display
var/current_track_name = current_playlist[playlist_index].title
to_chat(user,SPAN_NOTICE("Now Playing: Track [playlist_index] — '[current_track_name]'."))
// Icon/Overlay stuff for the music notes
worn_overlay = "music" // this is rather annoying but prevents the music notes on getting colored
update_icon()
update_clothing_icon()
/*
Song Iteration Procs
*/
/obj/item/clothing/ears/earphones/proc/next_song(mob/user)
if(use_check_and_message(user))
return
if(!music_cartridge || (current_playlist.len == 0))
to_chat(user, SPAN_WARNING("No playlist loaded."))
return
StopPlaying() // Stop & Cleanup previous sound token
// Sound iteration
if(playlist_index + 1 <= current_playlist.len)
playlist_index++
else
playlist_index = 1
StartPlaying(user) // New sound token created here
/obj/item/clothing/ears/earphones/proc/previous_song(mob/user)
if(use_check_and_message(usr))
return
if(!music_cartridge || (current_playlist.len == 0))
to_chat(user, SPAN_WARNING("No playlist loaded."))
return
StopPlaying() // Stop & Cleanup previous sound token
// Sound iteration
if(playlist_index - 1 < 1)
playlist_index = 1
else
playlist_index--
StartPlaying(user) // New sound token created here
/*
Verbs:
play_stop()
change_volume()
pause_unpause()
next_song()
previous_song()
*/
/obj/item/clothing/ears/earphones/verb/play_stop()
set name = "Earphones - Play/Stop"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
if(ismob(src.loc))
usr.visible_message(SPAN_NOTICE("[usr] clicks a button on [usr.get_pronoun("his")] [src]."))
playsound(usr, /singleton/sound_category/button_sound, 10)
if(soundplayer_token)
StopPlaying()
else
if(!music_cartridge)
to_chat(usr, SPAN_WARNING("You need to slot a music cartridge in first!"))
return
StartPlaying(usr)
/obj/item/clothing/ears/earphones/verb/change_volume()
set name = "Earphones - Change Volume"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
usr.visible_message(SPAN_NOTICE("[usr] swipes at [usr.get_pronoun("his")] [src]."))
// Volume Control
var/volume_input = tgui_input_number(usr,"Change the volume (0 - 100)","Volume", volume, 100, 0)
if(volume_input == null)
return
if(volume_input > 100)
volume_input = 100
if(volume_input < 0)
volume_input = 0
volume = volume_input
// If a soundtoken is already active/a song playing, we can adjust the volume mid-token.
if(!soundplayer_token)
return
else
soundplayer_token.SetVolume(volume)
/obj/item/clothing/ears/earphones/verb/pause_unpause()
set name = "Earphones - Pause/Unpause"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
if(ismob(src.loc))
usr.visible_message(SPAN_NOTICE("[usr] clicks a button on [usr.get_pronoun("his")] [src]."))
playsound(usr, /singleton/sound_category/button_sound, 10)
if(soundplayer_token)
if(soundplayer_token.status != SOUND_PAUSED)
soundplayer_token.Pause()
to_chat(usr, SPAN_NOTICE("Music paused."))
// Icon/Overlay stuff for the music notes
ClearOverlays()
worn_overlay = null
update_icon()
update_clothing_icon()
else if (soundplayer_token.status == SOUND_PAUSED)
soundplayer_token.Unpause()
to_chat(usr, SPAN_NOTICE("Music unpaused."))
// Icon/Overlay stuff for the music notes
worn_overlay = "music" // this is rather annoying but prevents the music notes on getting colored
update_icon()
update_clothing_icon()
else
play_stop() //No soundtoken? They probably meant to use the other verb instead.
/obj/item/clothing/ears/earphones/verb/next_song_verb()
set name = "Earphones - Next Song"
set category = "Object"
set src in usr
usr.visible_message(SPAN_NOTICE("[usr] clicks a button on [usr.get_pronoun("his")] [src]."))
playsound(usr, /singleton/sound_category/button_sound, 10)
next_song(usr)
/obj/item/clothing/ears/earphones/verb/previous_song_verb()
set name = "Earphones - Previous Song"
set category = "Object"
set src in usr
usr.visible_message(SPAN_NOTICE("[usr] clicks a button on [usr.get_pronoun("his")] [src]."))
playsound(usr, /singleton/sound_category/button_sound, 10)
previous_song(usr)
/obj/item/clothing/ears/earphones/verb/eject_music_cartridge_verb()
set name = "Earphones - Eject Music Cartridge"
set category = "Object"
set src in usr
eject_music_cartridge(usr)
/*
Click Controls:
Shift+Click to Pause/Unpause
Alt+Click to Start/Stop
*/
/obj/item/clothing/ears/earphones/AltClick(mob/user)
pause_unpause()
/obj/item/clothing/ears/earphones/ShiftClick(mob/user)
play_stop()
/*
Generic Earwear Procs
*/
/obj/item/clothing/ears/earphones/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc
M.update_inv_l_ear()
M.update_inv_r_ear()
/*
Earphone Variants
*/
/obj/item/clothing/ears/earphones/headphones
name = "headphones"
desc = "A pair of headphones. Cushioned but not quite sound-cancelling. Includes a little slot for a music cartridge."
desc_extended = "Unce unce unce unce."
icon_state = "headphones"
item_state = "headphones"
slot_flags = SLOT_EARS | SLOT_TWOEARS
/obj/item/clothing/ears/earphones/headphones/update_icon()
..()
AddOverlays(overlay_image(icon, "[icon_state]_overlay", flags=RESET_COLOR))
/obj/item/clothing/ears/earphones/earbuds
name = "earbuds"
desc = "A pair of wireless earbuds. Don't lose them. Includes a little slot for a music cartridge."
icon_state = "earbuds"
item_state = "earbuds"
/*
Music Cartridges
*/
/obj/item/music_cartridge
name = "music cartridge"
desc = "A music cartridge."
icon = 'icons/obj/item/music_cartridges.dmi'
icon_state = "generic"
w_class = WEIGHT_CLASS_SMALL
var/list/datum/track/tracks = list()
/obj/item/music_cartridge/ss13
name = "Spacer Classics Vol. 1"
desc = "An old music cartridge with a cheap-looking label."
tracks = list(
new/datum/track("Title 1", 'sound/music/title1.ogg'),
new/datum/track("Title 2", 'sound/music/title2.ogg'),
new/datum/track("Title 3", 'sound/music/title3.ogg'),
new/datum/track("Traitor", 'sound/music/traitor.ogg'),
new/datum/track("Space", 'sound/music/space.ogg'),
new/datum/track("Title 3 Mk2", 'sound/music/title3mk2.ogg')
)
/obj/item/music_cartridge/audioconsole
name = "SCC Welcome Package"
desc = "A music cartridge with some company-selected songs. Nothing special, everyone got one of these in their welcome boxes..."
tracks = list(
new/datum/track("Amsterdam", 'sound/music/audioconsole/Amsterdam.ogg'),
new/datum/track("Butterflies", 'sound/music/audioconsole/Butterflies.ogg'),
new/datum/track("Childhood", 'sound/music/audioconsole/Childhood.ogg'),
new/datum/track("Don't Rush", 'sound/music/audioconsole/DontRush.ogg'),
new/datum/track("Lips", 'sound/music/audioconsole/Lips.ogg'),
new/datum/track("Number 0", 'sound/music/audioconsole/Number0.ogg'),
new/datum/track("Phoron Will Make Us Rich", 'sound/music/audioconsole/PhoronWillMakeUsRich.ogg'),
new/datum/track("That Ain't Chopin", 'sound/music/audioconsole/ThatAintChopin.ogg'),
new/datum/track("The Pianist", 'sound/music/audioconsole/ThePianist.ogg'),
new/datum/track("When", 'sound/music/audioconsole/When.ogg')
)
/*
Regional Music Cartridges
*/
/obj/item/music_cartridge/konyang_retrowave
name = "Konyang Vibes 2463"
desc = "A music cartridge with a Konyang flag on the hololabel."
icon_state = "konyang"
tracks = list(
new/datum/track("Konyang Vibes #1", 'sound/music/lobby/konyang/konyang-1.ogg'),
new/datum/track("Konyang Vibes #2", 'sound/music/lobby/konyang/konyang-2.ogg'),
new/datum/track("Konyang Vibes #3", 'sound/music/lobby/konyang/konyang-3.ogg')
)
/obj/item/music_cartridge/venus_funkydisco
name = "Top of the Charts 66 (Venusian Hits)"
desc = "A glitzy, pink music cartridge with more Venusian hits."
icon_state = "venus"
tracks = list(
new/datum/track("dance させる", 'sound/music/regional/venus/dance.ogg'),
new/datum/track("love sensation", 'sound/music/regional/venus/love_sensation.ogg'),
new/datum/track("All Night", 'sound/music/regional/venus/all_night.ogg'),
new/datum/track("#billyocean", 'sound/music/regional/venus/billy_ocean.ogg'),
new/datum/track("Artificially Sweetened", 'sound/music/regional/venus/artificially_sweetened.ogg'),
new/datum/track("Real Love", 'sound/music/regional/venus/real_love.ogg'),
new/datum/track("F U N K Y G I R L <3", 'sound/music/regional/venus/funky_girl.ogg'),
new/datum/track("Break The System", 'sound/music/regional/venus/break_the_system.ogg')
)
/obj/item/music_cartridge/xanu_rock
name = "Indulgence EP (X-Rock)" //feel free to reflavour as a more varied x-rock mixtape, instead of a single EP, if other x-rock tracks are added
desc = "A music cartridge with a Xanan flag on the hololabel. Some fancy, rainbow text over it reads, 'INDULGENCE'."
icon_state = "xanu"
tracks = list(
new/datum/track("Shimmer", 'sound/music/regional/xanu/xanu_rock_3.ogg'),
new/datum/track("Rise", 'sound/music/regional/xanu/xanu_rock_1.ogg'),
new/datum/track("Indulgence", 'sound/music/regional/xanu/xanu_rock_2.ogg')
)
/obj/item/music_cartridge/adhomai_swing
name = "Electro-Swing of Adhomai"
desc = "A red music cartridge holding the most widely-known Adhomian electro-swing songs."
icon_state = "adhomai"
tracks = list(
new/datum/track("Boolean Sisters", 'sound/music/phonograph/boolean_sisters.ogg'),
new/datum/track("Electro Swing", 'sound/music/phonograph/electro_swing.ogg'),
new/datum/track("Le Swing", 'sound/music/phonograph/le_swing.ogg'),
new/datum/track("Posin", 'sound/music/phonograph/posin.ogg')
)
@@ -0,0 +1,7 @@
author: kermit
delete-after: True
changes:
- rscadd: "Makes earphones/headphones/earbuds play music, much like Audioconsoles!"
- rscadd: "Adds music cartridges which are used to load music into earphones."
Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

@@ -2482,7 +2482,7 @@
/obj/random/junk{
pixel_x = -13
},
/obj/item/clothing/ears/earmuffs/earphones,
/obj/item/clothing/ears/earphones,
/turf/simulated/floor/tiled/dark,
/area/abandoned_diner/crew_quarters)
"cGg" = (
@@ -4644,7 +4644,7 @@
/area/abandoned_diner/diner)
"piK" = (
/obj/machinery/atmospherics/unary/vent_scrubber/on,
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_y = 6;
pixel_x = 11
},
@@ -5845,7 +5845,7 @@
pixel_y = -4;
pixel_x = 3
},
/obj/item/clothing/ears/earmuffs/earphones,
/obj/item/clothing/ears/earphones,
/turf/simulated/floor/carpet/rubber,
/area/abandoned_diner/backroom)
"xjB" = (
@@ -6311,7 +6311,7 @@
pixel_x = -1;
pixel_y = -5
},
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_y = 2;
pixel_x = 3
},
@@ -3788,7 +3788,7 @@
/area/ship/freebooter_ship/exterior)
"oUu" = (
/obj/structure/table/steel,
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_x = -4;
pixel_y = 3
},
+1 -1
View File
@@ -4506,7 +4506,7 @@
pixel_y = 6
},
/obj/random/dirt_75,
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_y = 4;
pixel_x = 9
},
+1 -1
View File
@@ -575,7 +575,7 @@
/area/shuttle/lone_spacer/storage)
"go" = (
/obj/structure/table/standard,
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_y = 9;
pixel_x = 7
},
+1 -1
View File
@@ -1813,7 +1813,7 @@
/obj/item/toy/comic/witchfinder,
/obj/item/mirror,
/obj/item/flame/lighter/zippo/europa,
/obj/item/clothing/ears/earmuffs/earphones/headphones,
/obj/item/clothing/ears/earphones/headphones,
/obj/item/gamehelm/pink{
icon_state = "closed_pink"
},
@@ -4348,7 +4348,7 @@
pixel_y = 13;
pixel_x = -6
},
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_y = -4;
pixel_x = -7
},
+1 -1
View File
@@ -5343,7 +5343,7 @@
icon_state = "closed_pink";
pixel_x = -2
},
/obj/item/clothing/ears/earmuffs/earphones/headphones{
/obj/item/clothing/ears/earphones/headphones{
pixel_x = 3;
pixel_y = 1
},
File diff suppressed because it is too large Load Diff
+17 -5
View File
@@ -138,6 +138,23 @@ sound/machines/steam_pipe3.ogg - "file0571_air_hiss_weak.wav" by beerbelly38. Li
sound/machines/steam_pipe4.ogg - "Steam Sewer Ambient" by Geoff-Bremner-Audio. Licensed under CC0. Obtained from https://freesound.org/people/Geoff-Bremner-Audio/sounds/724892/
ATTRIBUTIONS SECTION END
ATTRIBUTIONS SECTOR START
sound/music/regional/venus/all_night.ogg - "All Night" by Rollergirl, licensed under CC BY-NC-SA 3.0. Obtained from https://rollergirl.bandcamp.com/album/rollergirl
sound/music/regional/venus/billy_ocean.ogg - "#billyocean" by Rollergirl, licensed under CC BY-NC-SA 3.0. Obtained from https://rollergirl.bandcamp.com/album/rollergirl
sound/music/regional/venus/artificially_sweetened.ogg - "Artificially Sweetened" by Stevia Sphere, licensed under CC BY 3.0. https://steviasphere.bandcamp.com/album/artificially-sweetened-single
sound/music/regional/venus/real_love.ogg - "Real Love" by Stevia Sphere, licensed under CC BY 3.0. Obtained from https://steviasphere.bandcamp.com/album/artificially-sweetened-single
sound/music/regional/venus/dance.ogg - "Danceさせる" by ウナチャンUNACHAN, licensed under CC BY 3.0. Obtained from https://unachan.bandcamp.com/track/dance
sound/music/regional/venus/love_sensation.ogg - "love sensation" by ウナチャンUNACHAN and bedroomtheft, licensed under CC BY 3.0. Obtained from https://unachan.bandcamp.com/track/love-sensation
sound/music/regional/venus/funky_girl.ogg - "F U N K Y G I R L <3" by B~mO9000, licensed under CC BY-SA 3.0. Obtained from https://bmo9000.bandcamp.com/album/v-i-n-t-a-g-e
sound/music/regional/venus/break_the_system.ogg - "Break The System" by B~mO9000, licensed under CC BY-SA 3.0. Obtained from https://bmo9000.bandcamp.com/album/wanted-in-80s (Download Only)
ATTRIBUTIONS SECTION END
ATTRIBUTIONS SECTOR START
sound/music/regional/xanu/xanu_rock_1.ogg - "Rise" by Swara Sutra, licensed under CC BY-NC-SA 3.0. Obtained from https://swarasutra.bandcamp.com/track/rise
sound/music/regional/xanu/xanu_rock_2.ogg - "Induldge" by Swara Sutra, licensed under CC BY-NC-SA 3.0. Obtained from https://swarasutra.bandcamp.com/track/indulgence
sound/music/regional/xanu/xanu_rock_3.ogg - "Shimmer" by Swara Sutra, licensed under CC BY-NC-SA 3.0. Obtained from https://swarasutra.bandcamp.com/track/indulgence
ATTRIBUTIONS SECTION END
ATTRIBUTIONS SECTOR START
sound/music/lobby/crescent_expanse/crescent_expanse_1.ogg - "Lüüü - Weedance" by Lüüü, licensed under CC BY-NC-SA 3.0. Obtained from https://myprivateunderground.bandcamp.com/track/lu-u-u-weedance
sound/music/lobby/crescent_expanse/crescent_expanse_2.ogg - "Little Bradley - Sunset Drive" by Little Bradley, licensed under CC BY-NC 3.0. Obtained from https://myprivateunderground.bandcamp.com/track/little-bradley-sunset-drive
@@ -146,8 +163,3 @@ sound/music/lobby/lights_edge/lights_edge_2.ogg - "Running From The Wendigo" by
sound/music/lobby/dangerous_space/dangerous_space_1.ogg - "You Can't Kill The Boogeyman" by Karl Casey, licensed under CC BY 3.0. Obtained From https://karlcasey.bandcamp.com/track/you-can-t-kill-the-boogeyman
sound/music/lobby/dangerous_space/dangerous_space_2.ogg - "Prison Planet" by Karl Casey, licensed under CC BY 3.0. Obtained from https://karlcasey.bandcamp.com/track/prison-planet
ATTRIBUTIONS SECTION END
ATTRIBUTIONS SECTOR START
sound/music/lobby/xanu/xanu_rock_1.ogg - "Rise" by Swara Sutra, licensed under CC BY-NC-SA 3.0. Obtained from https://swarasutra.bandcamp.com/track/rise
sound/music/lobby/xanu/xanu_rock_2.ogg - "Induldge" by Swara Sutra, licensed under CC BY-NC-SA 3.0. Obtained from https://swarasutra.bandcamp.com/track/indulgence
ATTRIBUTIONS SECTION END
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.