diff --git a/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxBoundUserInterface.cs b/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxBoundUserInterface.cs index 469d3abc81..81765bac77 100644 --- a/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxBoundUserInterface.cs +++ b/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxBoundUserInterface.cs @@ -11,11 +11,13 @@ namespace Content.Client.SimpleStation14.Jukebox.Ui; public sealed class JukeboxBoundUserInterface : BoundUserInterface { [Dependency] private readonly IEntityManager _entity = default!; + private readonly ISawmill _log = default!; private JukeboxWindow? _window; - public JukeboxBoundUserInterface(EntityUid owner, Enum uiKey) : base (owner, uiKey) + public JukeboxBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { + _log = EntMan.System().Log; } protected override void Open() @@ -24,11 +26,11 @@ protected override void Open() if (!_entity.TryGetComponent(Owner, out var jukeboxComp)) { - Logger.Error($"No Jukebox component found for {_entity.ToPrettyString(Owner)}!"); + _log.Error("No Jukebox component found for {0}!", _entity.ToPrettyString(Owner)); return; } - _window = new JukeboxWindow(this, jukeboxComp) + _window = new JukeboxWindow(jukeboxComp, _log) { Title = _entity.GetComponent(Owner).EntityName }; diff --git a/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxWindow.xaml.cs b/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxWindow.xaml.cs index 4e15000c2b..89ec805b3c 100644 --- a/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxWindow.xaml.cs +++ b/Content.Client/SimpleStation14/Jukebox/Ui/JukeboxWindow.xaml.cs @@ -21,7 +21,7 @@ public sealed partial class JukeboxWindow : FancyWindow [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; - private readonly JukeboxBoundUserInterface _bui; + private readonly ISawmill _log = default!; private readonly JukeboxComponent _jukeboxComp; @@ -38,12 +38,12 @@ public sealed partial class JukeboxWindow : FancyWindow public Action? OnSongSelected; - public JukeboxWindow(JukeboxBoundUserInterface bui, JukeboxComponent jukeboxComp) + public JukeboxWindow(JukeboxComponent jukeboxComp, ISawmill log) { RobustXamlLoader.Load(this); IoCManager.InjectDependencies(this); - _bui = bui; + _log = log; _jukeboxComp = jukeboxComp; PlayButton.OnPressed += _ => OnPlayButtonPressed?.Invoke(); @@ -51,16 +51,17 @@ public JukeboxWindow(JukeboxBoundUserInterface bui, JukeboxComponent jukeboxComp SerialTitle.SetMessage(Loc.GetString("jukebox-ui-serial-title")); SerialNumber.Text = jukeboxComp.SerialNumber; + SkipButton.TexturePath = jukeboxComp.UiButtonSkip; // Sets up the custom colours of the ui. - BG_1.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorBG) }; - Panel_1.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorPanel) }; - Panel_2.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorPanel) }; - Panel_3.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorPanel) }; + BG_1.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.UiColorBG) }; + Panel_1.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.UiColorPanel) }; + Panel_2.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.UiColorPanel) }; + Panel_3.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.UiColorPanel) }; // Accent_1.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorAccent) }; // Accent_2.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorAccent) }; - Accent_3.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorAccent) }; - Accent_4.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.JukeboxUiColorAccent) }; + Accent_3.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.UiColorAccent) }; + Accent_4.PanelOverride = new StyleBoxFlat { BackgroundColor = Color.FromHex(jukeboxComp.UiColorAccent) }; // Sets up all the fonts. SongName.FontOverride = _resourceCache.GetFont("/Fonts/NotoSans/NotoSans-Regular.ttf", 18); @@ -92,7 +93,7 @@ public JukeboxWindow(JukeboxBoundUserInterface bui, JukeboxComponent jukeboxComp UpdateState(true); } - // Updates the progress bar of the song every frame, matching to the duration and if one is actually playing. + // Updates the progress bar of the song every frame, matching to the duration, if a song is actually playing. protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); @@ -114,7 +115,7 @@ protected override void FrameUpdate(FrameEventArgs args) if (_jukeboxComp.StoppedTime == null) { - Logger.ErrorS("jukebox", $"Jukebox {_jukeboxComp} is stopped but has no StoppedTime!"); + _log.Error(Loc.GetString("jukebox-error-no-stopped-time"), _jukeboxComp); return; } @@ -127,23 +128,19 @@ private void PopulateSongs() { SongPickerBox.RemoveAllChildren(); - var songsToAdd = _jukeboxComp.Songs; - - songsToAdd.Sort(); - - foreach (var trackId in songsToAdd) - GenerateSongButton(trackId, false); - - if (_jukeboxComp.Emagged) + if (_jukeboxComp.Emagged) // We want the emagged songs on top. foreach (var trackId in _jukeboxComp.EmaggedSongs.OrderBy(song => song).ToList()) GenerateSongButton(trackId, true); + + foreach (var trackId in _jukeboxComp.Songs.OrderBy(song => song).ToList()) + GenerateSongButton(trackId, false); } private void GenerateSongButton(string trackId, bool illegal) { if (!_prototype.TryIndex(trackId, out var track)) { - Logger.Error($"No JukeboxTrackPrototype found for {trackId}!"); + _log.Error(Loc.GetString("jukebox-error-no-prototype"), trackId); return; } @@ -183,7 +180,7 @@ private void PopulateQueue() { if (!_prototype.TryIndex(trackId, out var track)) { - Logger.Error($"No JukeboxTrackPrototype found for {trackId}!"); + _log.Error(Loc.GetString("jukebox-error-no-prototype"), trackId); continue; } @@ -207,7 +204,7 @@ public void UpdateState(bool repopulateSongs = false) PopulateQueue(); - if (_jukeboxComp.CurrentlyPlayingTrack == null) + if (_jukeboxComp.CurrentlyPlayingTrack == null || !_prototype.TryIndex(_jukeboxComp.CurrentlyPlayingTrack, out var track)) { SongName.Text = Loc.GetString("jukebox-ui-current-empty"); SongIcon.TexturePath = _jukeboxComp.DefaultSongArtPath; @@ -218,7 +215,10 @@ public void UpdateState(bool repopulateSongs = false) _timeWillFinish = TimeSpan.Zero; _timeStopped = TimeSpan.Zero; - PlayButton.TexturePath = "/Textures/SimpleStation14/Interface/MediaControls/play.png"; + PlayButton.TexturePath = _jukeboxComp.UiButtonPlay; + + PlayButton.Disabled = true; + SkipButton.Disabled = true; return; } @@ -227,19 +227,17 @@ public void UpdateState(bool repopulateSongs = false) _timeStopped = _jukeboxComp.StoppedTime ?? TimeSpan.Zero; - _songDuration = _jukeboxComp.CurrentlyPlayingTrack.Duration; - - var track = _jukeboxComp.CurrentlyPlayingTrack; + _songDuration = track.Duration; SongName.Text = track.Name; - SongIcon.TexturePath = track.ArtPath; + SongIcon.TexturePath = track.ArtPath ?? _jukeboxComp.DefaultSongArtPath; SkipButton.Disabled = false; PlayButton.Disabled = false; - if (_jukeboxComp.Paused) - PlayButton.TexturePath = "/Textures/SimpleStation14/Interface/MediaControls/play.png"; - else - PlayButton.TexturePath = "/Textures/SimpleStation14/Interface/MediaControls/pause.png"; + PlayButton.TexturePath = _jukeboxComp.Paused ? _jukeboxComp.UiButtonPlay : _jukeboxComp.UiButtonPause; + + PlayButton.Disabled = false; + SkipButton.Disabled = false; } } diff --git a/Content.Server/SimpleStation14/Jukebox/JukeboxSystem.cs b/Content.Server/SimpleStation14/Jukebox/JukeboxSystem.cs index 66b74c6f52..ddb0a24a5f 100644 --- a/Content.Server/SimpleStation14/Jukebox/JukeboxSystem.cs +++ b/Content.Server/SimpleStation14/Jukebox/JukeboxSystem.cs @@ -1,4 +1,3 @@ -using Content.Server.Power.Components; using Content.Shared.SimpleStation14.Jukebox; using Content.Shared.SimpleStation14.Prototypes; using Robust.Shared.Audio; @@ -6,14 +5,11 @@ using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Server.GameObjects; -using Content.Shared.Emag.Systems; -using Content.Server.Construction; -using Content.Shared.Damage; -using Content.Server.DeviceLinking.Events; using Content.Server.DeviceLinking.Systems; using Robust.Shared.Random; using Content.Shared.Power; using System.Linq; +using Content.Server.Power.EntitySystems; namespace Content.Server.SimpleStation14.Jukebox; @@ -35,27 +31,6 @@ public sealed partial class JukeboxSystem : EntitySystem public const string PortUnPause = "Unpause"; public const string PortTogglePuase = "TogglePause"; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnComponentInit); - SubscribeLocalEvent(OnComponentShutdown); - - SubscribeLocalEvent(OnPowerChanged); - SubscribeLocalEvent(OnEmagged); - SubscribeLocalEvent(OnPaused); - SubscribeLocalEvent(OnUnpaused); - SubscribeLocalEvent(OnRefreshParts); - SubscribeLocalEvent(OnExamineParts); - SubscribeLocalEvent(OnDamageChanged); - SubscribeLocalEvent(OnSignalReceived); - - SubscribeLocalEvent(OnPlayButtonPressed); - SubscribeLocalEvent(OnSkipButtonPressed); - SubscribeLocalEvent(OnSongSelected); - } - #region Public functions /// @@ -220,7 +195,7 @@ public void TryPlayRandomSong(EntityUid jukebox, JukeboxComponent? jukeboxComp = jukeboxComp.Playing = true; // Set the Jukebox to playing. - jukeboxComp.CurrentlyPlayingTrack = song; // Set the currently playing song. + jukeboxComp.CurrentlyPlayingTrack = song.ID; // Set the currently playing song. jukeboxComp.FinishPlayingTime = _timing.CurTime + song.Duration - offset; // Set the time when the song should finish. @@ -259,7 +234,7 @@ private void CheckCanPlay(EntityUid uid, JukeboxComponent component) { var canPlay = true; - if (EntityManager.TryGetComponent(uid, out var powerComp) && !powerComp.Powered) + if (!this.IsPowered(uid, EntityManager)) canPlay = false; component.CanPlay = canPlay; @@ -337,14 +312,17 @@ private void TryRestart(EntityUid jukeBox, JukeboxComponent jukeboxComp) if (jukeboxComp.Paused || !jukeboxComp.CanPlay) return; - if (jukeboxComp.CurrentlyPlayingTrack == null || jukeboxComp.FinishPlayingTime == null || jukeboxComp.StoppedTime == null) + if (jukeboxComp.CurrentlyPlayingTrack == null || + jukeboxComp.FinishPlayingTime == null || + jukeboxComp.StoppedTime == null || + !_prototype.TryIndex(jukeboxComp.CurrentlyPlayingTrack, out var trackProto)) return; - var timeLeftBeforeFinished = (TimeSpan) (jukeboxComp.CurrentlyPlayingTrack.Duration - (jukeboxComp.FinishPlayingTime - jukeboxComp.StoppedTime)); + var timeLeftBeforeFinished = (TimeSpan) (trackProto.Duration - (jukeboxComp.FinishPlayingTime - jukeboxComp.StoppedTime)); jukeboxComp.StoppedTime = null; - TryPlaySong(jukeBox, jukeboxComp.CurrentlyPlayingTrack, jukeboxComp, timeLeftBeforeFinished); + TryPlaySong(jukeBox, trackProto, jukeboxComp, timeLeftBeforeFinished); return; } diff --git a/Content.Server/SimpleStation14/Jukebox/JukeboxSystems.Interactions.cs b/Content.Server/SimpleStation14/Jukebox/JukeboxSystems.Interactions.cs index f8aedbf120..c55e9111d6 100644 --- a/Content.Server/SimpleStation14/Jukebox/JukeboxSystems.Interactions.cs +++ b/Content.Server/SimpleStation14/Jukebox/JukeboxSystems.Interactions.cs @@ -12,10 +12,31 @@ public sealed partial class JukeboxSystem : EntitySystem { [Dependency] private readonly IRobustRandom _random = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent((ent, comp, _) => Clean(ent, comp)); + + SubscribeLocalEvent((EntityUid ent, JukeboxComponent comp, ref EntityPausedEvent _) => CheckCanPlay(ent, comp)); + SubscribeLocalEvent((EntityUid ent, JukeboxComponent comp, ref EntityUnpausedEvent _) => CheckCanPlay(ent, comp)); + SubscribeLocalEvent((EntityUid ent, JukeboxComponent comp, ref PowerChangedEvent _) => CheckCanPlay(ent, comp)); + SubscribeLocalEvent(OnEmagged); + SubscribeLocalEvent(OnRefreshParts); + SubscribeLocalEvent(OnExamineParts); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnSignalReceived); + + SubscribeLocalEvent((ent, comp, _) => TryTogglePause(ent, comp)); + SubscribeLocalEvent((ent, comp, _) => TrySkipSong(ent, comp)); + SubscribeLocalEvent((ent, comp, msg) => TryQueueSong(ent, msg.Song, comp)); + } + /// - /// Simply checks if the Jukebox can play songs on init. + /// Handles setting up a Jukebox. /// - private void OnComponentInit(EntityUid uid, JukeboxComponent component, ComponentInit args) + private void OnComponentInit(EntityUid uid, JukeboxComponent component, MapInitEvent args) { CheckCanPlay(uid, component); @@ -33,14 +54,6 @@ private void OnComponentInit(EntityUid uid, JukeboxComponent component, Componen UpdateState(uid, component); } - /// - /// Handles cleanup when the Jukebox is shut down. - /// - private void OnComponentShutdown(EntityUid uid, JukeboxComponent component, ComponentShutdown args) - { - Clean(uid, component); - } - /// /// Handles setting the Jukebox's state to emagged. /// @@ -51,61 +64,6 @@ private void OnEmagged(EntityUid jukeBox, JukeboxComponent jukeboxComp, ref GotE UpdateState(jukeBox, jukeboxComp); } - /// - /// Handles when a Jukebox entity is paused in game terms. - /// - private void OnPaused(EntityUid jukeBox, JukeboxComponent jukeboxComp, ref EntityPausedEvent args) - { - StopSong(jukeBox, jukeboxComp); - } - - /// - /// Handles when a Jukebox entity is unpaused in game terms. - /// - private void OnUnpaused(EntityUid jukeBox, JukeboxComponent jukeboxComp, ref EntityUnpausedEvent args) - { - CheckCanPlay(jukeBox, jukeboxComp); - } - - /// - /// Checks if the Jukebox can play songs when its power state changes. - /// - private void OnPowerChanged(EntityUid uid, JukeboxComponent component, ref PowerChangedEvent args) - { - CheckCanPlay(uid, component); - } - - /// - /// Handles the Jukebox's play button being pressed to toggle between playing and paused. - /// - private void OnPlayButtonPressed(EntityUid jukeBox, JukeboxComponent jukeboxComp, JukeboxPlayButtonPressedMessage msg) - { - if (jukeboxComp.Paused) - { - TryUnPauseSong(jukeBox, jukeboxComp); - } - else - { - DoPauseSong(jukeBox, jukeboxComp); - } - } - - /// - /// Handles the Jukebox's skip button being pressed to skip the current song. - /// - private void OnSkipButtonPressed(EntityUid jukeBox, JukeboxComponent jukeboxComp, JukeboxSkipButtonPressedMessage msg) - { - TrySkipSong(jukeBox, jukeboxComp); - } - - /// - /// Handles a song being selected in the Jukebox's ui. - /// - private void OnSongSelected(EntityUid jukeBox, JukeboxComponent jukeboxComp, JukeboxSongSelectedMessage msg) - { - TryQueueSong(jukeBox, msg.Song, jukeboxComp); - } - /// /// Generates a valid serial number for the jukeboxes. This is just goofy. /// @@ -120,7 +78,10 @@ public string GenerateSerialNumber() digits[4] = (digits[0] + digits[1]) % 10; digits[5] = digits[2] - digits[3]; digits[6] = digits[4] * digits[5]; - digits[7] = (digits[0] + digits[1] + digits[2] + digits[3]) % 5; + digits[7] = (digits[0] + digits[1] + digits[5] + digits[4]) % 5; + + for (var i = 0; i < digits.Length; i++) + digits[i] = Math.Abs(digits[i]); var serial = $"{digits[0]}{digits[1]}{digits[2]}{digits[3]}{digits[4]}{digits[5]}{digits[6]}"; diff --git a/Content.Shared/SimpleStation14/Jukebox/JukeboxComponent.cs b/Content.Shared/SimpleStation14/Jukebox/JukeboxComponent.cs index 1bb372bab3..76d6badfcc 100644 --- a/Content.Shared/SimpleStation14/Jukebox/JukeboxComponent.cs +++ b/Content.Shared/SimpleStation14/Jukebox/JukeboxComponent.cs @@ -3,6 +3,7 @@ using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Content.Shared.Construction.Prototypes; +using Content.Shared.DeviceLinking; namespace Content.Shared.SimpleStation14.Jukebox; @@ -44,29 +45,38 @@ public sealed partial class JukeboxComponent : Component /// The song art to be used when no song is playing. /// [DataField("defaultSongArtPath")] - public string DefaultSongArtPath { get; set; } = "/Textures/SimpleStation14/JukeboxTracks/default.png"; + public string DefaultSongArtPath { get; } = "/Textures/SimpleStation14/JukeboxTracks/default.png"; /// /// A colour to be used in the Jukebox's UI. /// Should be based on the sprite. /// - [DataField("jukeboxUiColorBG")] - public string JukeboxUiColorBG { get; set; } = "#602C00"; + [DataField("uiColorBG")] + public string UiColorBG { get; } = "#602C00"; - /// - [DataField("jukeboxUiColorPanel")] - public string JukeboxUiColorPanel { get; } = "#480F0F"; + /// + [DataField("uiColorPanel")] + public string UiColorPanel { get; } = "#480F0F"; - /// - [DataField("jukeboxUiColorAccent")] - public string JukeboxUiColorAccent { get; } = "#20181B"; + /// + [DataField("uiColorAccent")] + public string UiColorAccent { get; } = "#20181B"; + + [DataField("uiButtonPlay")] + public string UiButtonPlay { get; } = "/Textures/SimpleStation14/Interface/MediaControls/play.png"; + + [DataField("uiButtonPause")] + public string UiButtonPause { get; } = "/Textures/SimpleStation14/Interface/MediaControls/pause.png"; + + [DataField("uiButtonSkip")] + public string UiButtonSkip { get; } = "/Textures/SimpleStation14/Interface/MediaControls/skip.png"; /// /// Whether or not to include the decorative portion of the UI /// which contains the serial number and the 'coin' slot. /// [DataField("decorativeUi")] - public bool DecorativeUi { get; set; } = false; + public bool DecorativeUi { get; } = false; /// /// The part to be used for upgrading the queue size. @@ -84,10 +94,10 @@ public sealed partial class JukeboxComponent : Component public IPlayingAudioStream? CurrentlyPlayingStream { get; set; } /// - /// The prototype of the currently playing song. + /// The ID of the currently playing song. /// [AutoNetworkedField] - public JukeboxTrackPrototype? CurrentlyPlayingTrack { get; set; } + public string? CurrentlyPlayingTrack { get; set; } /// /// The list of songs that are queued to be played. diff --git a/Content.Shared/SimpleStation14/Prototypes/JukeboxTrackPrototype.cs b/Content.Shared/SimpleStation14/Prototypes/JukeboxTrackPrototype.cs index 52ed402a4d..92c3d0bdda 100644 --- a/Content.Shared/SimpleStation14/Prototypes/JukeboxTrackPrototype.cs +++ b/Content.Shared/SimpleStation14/Prototypes/JukeboxTrackPrototype.cs @@ -4,8 +4,9 @@ namespace Content.Shared.SimpleStation14.Prototypes; -[Prototype("jukeboxTrack")] [Serializable] [NetSerializable] -public sealed class JukeboxTrackPrototype : IPrototype +[Prototype("jukeboxTrack")] +[Serializable, NetSerializable] +public sealed class JukeboxTrackPrototype : IPrototype, ISerializationHooks { [IdDataField] public string ID { get; } = default!; @@ -36,36 +37,42 @@ public sealed class JukeboxTrackPrototype : IPrototype /// /// Actual duration as a TimeSpan. /// - public TimeSpan Duration => ToTimeSpan(DurationString); + public TimeSpan Duration = TimeSpan.Zero; /// /// Path of this track's art file. /// [DataField("artPath")] - public string ArtPath { get; } = "/Textures/SimpleStation14/JukeboxTracks/default.png"; + public string? ArtPath { get; } = null; - private static TimeSpan ToTimeSpan(string time) + void ISerializationHooks.AfterDeserialization() + { + Duration = ToTimeSpan(DurationString, Name); + } + + // I know this is stupid but I don't feel learning custom type serializers right now it's old code and it scares me. + private static TimeSpan ToTimeSpan(string time, string id) { var split = time.Split(':'); if (split.Length != 2) { - Logger.Error($"Invalid time format: {time}"); + Logger.Error($"Invalid time format on track '{id}': {time}"); Logger.Debug($"Duration string should be in the format 'mm:ss'"); - throw new ArgumentException($"Invalid time format: {time}"); + throw new ArgumentException($"Invalid time format on track '{id}': {time}"); } if (!int.TryParse(split[0], out var minutes)) { - Logger.Error($"Invalid time format: {time}"); + Logger.Error($"Invalid time format on track '{id}': {time}"); Logger.Debug($"Invalid minutes: {split[0]}"); - throw new ArgumentException($"Invalid time format: {time}"); + throw new ArgumentException($"Invalid time format on track '{id}': {time}"); } if (!int.TryParse(split[1], out var seconds)) { - Logger.Error($"Invalid time format: {time}"); + Logger.Error($"Invalid time format on track '{id}': {time}"); Logger.Debug($"Invalid seconds: {split[1]}"); - throw new ArgumentException($"Invalid time format: {time}"); + throw new ArgumentException($"Invalid time format on track '{id}': {time}"); } return new TimeSpan(0, minutes, seconds); diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/a_tiny_green_beetle_beat.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/a_tiny_green_beetle_beat.ogg new file mode 100644 index 0000000000..47f4180999 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/a_tiny_green_beetle_beat.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/all_access_vacation.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/all_access_vacation.ogg new file mode 100644 index 0000000000..07e4eca64d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/all_access_vacation.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/and_the_clown_smiled_outside_the_airlock.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/and_the_clown_smiled_outside_the_airlock.ogg new file mode 100644 index 0000000000..69a812b3fc Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/and_the_clown_smiled_outside_the_airlock.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/atmospherics.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/atmospherics.ogg new file mode 100644 index 0000000000..c38bd5acd9 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/atmospherics.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/attributions.yml b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/attributions.yml new file mode 100644 index 0000000000..7011ca025b --- /dev/null +++ b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/attributions.yml @@ -0,0 +1,4 @@ +- files: [loop.ogg, and_the_clown_smiled_outside_the_airlock.ogg, atmospherics.ogg, a_tiny_green_beetle_beat.ogg, clear_choice.ogg, connect.ogg, corporate_central_command.ogg, disposal.ogg, docking.ogg, do_i_look_like_a_clown_to_you.ogg, expensive_rugs_and_cheap_caskets.ogg, figured_as_much.ogg, forget_the_station.ogg, ghost_in_the_janitors_closet.ogg, habanero_donk_pocket.ogg, hivemind_channel.ogg, its_a_wall_see.ogg, i_found_these_pills_in_maintenance.ogg, no_loose_goose_here.ogg, okay_its_loose.ogg, on_to_the_next_station.ogg, outside_in_a_firesuit.ogg, pick_a_tyre_pattern.ogg, red_shadows_fall_on_clean_floors.ogg, saw_you_just_then.ogg, should_have_filled_my_form.ogg, smells_like_something_jaunted_here.ogg, spessmen_in_a_shuttle.ogg, strangely_dark_sky.ogg, the_soap_bar.ogg, the_wanderers_sail_without_wind.ogg, wrench_the_gas_canister_down.ogg, your_stay_aboard_the_station.ogg] + license: CC0-1.0 + source: "https://github.com/unitystation/unitystation" + copyright: DSC@apelsinsaft diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/clear_choice.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/clear_choice.ogg new file mode 100644 index 0000000000..12b41c6a32 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/clear_choice.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/connect.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/connect.ogg new file mode 100644 index 0000000000..7cfec19876 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/connect.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/corporate_central_command.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/corporate_central_command.ogg new file mode 100644 index 0000000000..ba80ae459d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/corporate_central_command.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/disposal.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/disposal.ogg new file mode 100644 index 0000000000..8a6d25bba7 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/disposal.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/do_i_look_like_a_clown_to_you.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/do_i_look_like_a_clown_to_you.ogg new file mode 100644 index 0000000000..fd420cbbd2 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/do_i_look_like_a_clown_to_you.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/docking.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/docking.ogg new file mode 100644 index 0000000000..473f1835ac Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/docking.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/expensive_rugs_and_cheap_caskets.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/expensive_rugs_and_cheap_caskets.ogg new file mode 100644 index 0000000000..90d4527fee Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/expensive_rugs_and_cheap_caskets.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/figured_as_much.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/figured_as_much.ogg new file mode 100644 index 0000000000..197262bae8 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/figured_as_much.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/forget_the_station.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/forget_the_station.ogg new file mode 100644 index 0000000000..0cc175322e Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/forget_the_station.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/ghost_in_the_janitors_closet.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/ghost_in_the_janitors_closet.ogg new file mode 100644 index 0000000000..3b3b9309eb Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/ghost_in_the_janitors_closet.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/habanero_donk_pocket.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/habanero_donk_pocket.ogg new file mode 100644 index 0000000000..800af0356e Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/habanero_donk_pocket.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/hivemind_channel.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/hivemind_channel.ogg new file mode 100644 index 0000000000..1788aee2a3 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/hivemind_channel.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/i_found_these_pills_in_maintenance.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/i_found_these_pills_in_maintenance.ogg new file mode 100644 index 0000000000..40a46fef05 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/i_found_these_pills_in_maintenance.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/its_a_wall_see.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/its_a_wall_see.ogg new file mode 100644 index 0000000000..48b52a3690 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/its_a_wall_see.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/no_loose_goose_here.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/no_loose_goose_here.ogg new file mode 100644 index 0000000000..ee41a69393 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/no_loose_goose_here.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/okay_its_loose.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/okay_its_loose.ogg new file mode 100644 index 0000000000..ad61ed052d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/okay_its_loose.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/on_to_the_next_station.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/on_to_the_next_station.ogg new file mode 100644 index 0000000000..e69e94278b Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/on_to_the_next_station.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/outside_in_a_firesuit.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/outside_in_a_firesuit.ogg new file mode 100644 index 0000000000..53a37393c6 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/outside_in_a_firesuit.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/pick_a_tyre_pattern.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/pick_a_tyre_pattern.ogg new file mode 100644 index 0000000000..f0ffbc8f6d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/pick_a_tyre_pattern.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/red_shadows_fall_on_clean_floors.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/red_shadows_fall_on_clean_floors.ogg new file mode 100644 index 0000000000..763a123a4e Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/red_shadows_fall_on_clean_floors.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/saw_you_just_then.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/saw_you_just_then.ogg new file mode 100644 index 0000000000..14f29e4335 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/saw_you_just_then.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/should_have_filled_my_form.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/should_have_filled_my_form.ogg new file mode 100644 index 0000000000..6b46b2b02b Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/should_have_filled_my_form.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/smells_like_something_jaunted_here.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/smells_like_something_jaunted_here.ogg new file mode 100644 index 0000000000..f09efc9d1d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/smells_like_something_jaunted_here.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/spessmen_in_a_shuttle.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/spessmen_in_a_shuttle.ogg new file mode 100644 index 0000000000..1211509cab Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/spessmen_in_a_shuttle.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/strangely_dark_sky.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/strangely_dark_sky.ogg new file mode 100644 index 0000000000..b212b7879c Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/strangely_dark_sky.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_soap_bar.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_soap_bar.ogg new file mode 100644 index 0000000000..9a3d8e66df Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_soap_bar.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_wanderers_sail_without_wind.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_wanderers_sail_without_wind.ogg new file mode 100644 index 0000000000..b48a88e54e Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_wanderers_sail_without_wind.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/wrench_the_gas_canister_down.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/wrench_the_gas_canister_down.ogg new file mode 100644 index 0000000000..65af34fb6c Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/wrench_the_gas_canister_down.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/your_stay_aboard_the_station.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/your_stay_aboard_the_station.ogg new file mode 100644 index 0000000000..311922295d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/your_stay_aboard_the_station.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/agartha.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/agartha.ogg new file mode 100644 index 0000000000..1e7ed7390d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/agartha.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/attributions.yml b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/attributions.yml new file mode 100644 index 0000000000..7aa26f65ae --- /dev/null +++ b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/attributions.yml @@ -0,0 +1,4 @@ +- files: [washed_away.ogg, the_current.ogg, drift.ogg, low_tide.ogg, sha.ogg, dancers_and_floaters.ogg, agartha.ogg] + license: "CC-BY-NC-4.0" + copyright: "Jon Shuemaker on the Free Music Archive" + source: "https://freemusicarchive.org/music/jon-shuemaker/" diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/dancers_and_floaters.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/dancers_and_floaters.ogg new file mode 100644 index 0000000000..4419aaba6d Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/dancers_and_floaters.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/drift.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/drift.ogg new file mode 100644 index 0000000000..0a0ef45fe2 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/drift.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/low_tide.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/low_tide.ogg new file mode 100644 index 0000000000..248a7f63de Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/low_tide.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/sha.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/sha.ogg new file mode 100644 index 0000000000..a8b7bc57c6 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/sha.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/the_current.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/the_current.ogg new file mode 100644 index 0000000000..c5da9433b1 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/the_current.ogg differ diff --git a/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/washed_away.ogg b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/washed_away.ogg new file mode 100644 index 0000000000..46eb6a5032 Binary files /dev/null and b/Resources/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/washed_away.ogg differ diff --git a/Resources/Locale/en-US/SimpleStation14/Content/Jukebox/jukebox.ftl b/Resources/Locale/en-US/SimpleStation14/Content/Jukebox/jukebox.ftl index 4bd8bc1a87..d79479c9b5 100644 --- a/Resources/Locale/en-US/SimpleStation14/Content/Jukebox/jukebox.ftl +++ b/Resources/Locale/en-US/SimpleStation14/Content/Jukebox/jukebox.ftl @@ -1 +1,4 @@ jukebox-maxqueued-upgrade-string = Queue size + +jukebox-error-no-prototype = No JukeboxTrackPrototype found for {"{0}"}! +jukebox-error-no-stopped-time = Owner jukebox of {"{0}"} is stopped but has no StoppedTime! diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 4c521e7c92..84234b4943 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -223,6 +223,7 @@ - WallmountGeneratorAPUElectronics - WallmountGeneratorElectronics - WallmountSubstationElectronics + - JukeboxMachineCircuitboard - type: MaterialStorage whitelist: tags: diff --git a/Resources/Prototypes/Nyanotrasen/Markers/Spawners/Random/devices.yml b/Resources/Prototypes/Nyanotrasen/Markers/Spawners/Random/devices.yml index 05491ef6d3..5001cd1a69 100644 --- a/Resources/Prototypes/Nyanotrasen/Markers/Spawners/Random/devices.yml +++ b/Resources/Prototypes/Nyanotrasen/Markers/Spawners/Random/devices.yml @@ -56,6 +56,7 @@ - EmitterCircuitboard - SurveillanceCameraWirelessRouterCircuitboard - SurveillanceWirelessCameraMonitorCircuitboard + - JukeboxMachineCircuitboard chance: 0.8 rarePrototypes: - TraversalDistorterMachineCircuitboard diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index 808ecee87c..3ac02052a9 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -89,6 +89,7 @@ - SynthesizerInstrument - DawInstrumentMachineCircuitboard - MassMediaCircuitboard + - JukeboxMachineCircuitboard # Tier 2 diff --git a/Resources/Prototypes/SimpleStation14/Entities/Objects/Devices/Circuitboards/production.yml b/Resources/Prototypes/SimpleStation14/Entities/Objects/Devices/Circuitboards/production.yml index ad97cd6019..4592fe6c56 100644 --- a/Resources/Prototypes/SimpleStation14/Entities/Objects/Devices/Circuitboards/production.yml +++ b/Resources/Prototypes/SimpleStation14/Entities/Objects/Devices/Circuitboards/production.yml @@ -5,7 +5,7 @@ description: A jukebox machine circuitboard. components: - type: Sprite - state: supply + state: service - type: MachineBoard prototype: JukeboxClassic requirements: diff --git a/Resources/Prototypes/SimpleStation14/Entities/Structures/Machines/Fun/jukebox.yml b/Resources/Prototypes/SimpleStation14/Entities/Structures/Machines/Fun/jukebox.yml index 9b55f49253..8c6252f269 100644 --- a/Resources/Prototypes/SimpleStation14/Entities/Structures/Machines/Fun/jukebox.yml +++ b/Resources/Prototypes/SimpleStation14/Entities/Structures/Machines/Fun/jukebox.yml @@ -18,7 +18,7 @@ - state: base - type: ApcPowerReceiver powerLoad: 350 - - type: Jukebox + - type: Jukebox # All that's technically needed- everything else is optional. - type: entity parent: JukeboxBase @@ -32,15 +32,58 @@ - DanyaVodovozGoinOn - DanyaVodovozOffTheGrid - DanyaVodovozPlanetOfTheAmazons - emaggedSongs: - DanyaVodovozGuacamole - DanyaVodovozJazzFunkMySoul - DanyaVodovozMothToAFlame - DanyaVodovozNightInBrazil + - JonShuemakerAgartha + - JonShuemakerDancersAndFloaters + - JonShuemakerSha + - JonShuemakerLowTide + - JonShuemakerTheCurrent + - JonShuemakerDrift + - JonShuemakerWashedAway + - ApelsinsaftAllAccessVacation + - ApelsinsaftAndTheClownSmiledOutsideTheAirlock + - ApelsinsaftAtmospherics + - ApelsinsaftATinyGreenBeetleBeat + - ApelsinsaftClearChoice + - ApelsinsaftConnect + - ApelsinsaftCorporateCentralCommand + - ApelsinsaftDisposal + - ApelsinsaftDocking + - ApelsinsaftDoILookLikeAClownToYou + - ApelsinsaftExpensiveRugsAndCheapCaskets + - ApelsinsaftFiguredAsMuch + - ApelsinsaftForgetTheStation + - ApelsinsaftGhostInTheJanitorsCloset + - ApelsinsaftHabaneroDonkPocket + - ApelsinsaftHivemindChannel + - ApelsinsaftItsAWallSee + - ApelsinsaftIFoundThesePillsInMaintenance + - ApelsinsaftNoLooseGooseHere + - ApelsinsaftOkayItsLoose + - ApelsinsaftOnToTheNextStation + - ApelsinsaftOutsideInAFiresuit + - ApelsinsaftPickATyrePattern + - ApelsinsaftRedShadowsFallOnCleanFloors + - ApelsinsaftSawYouJustThen + - ApelsinsaftShouldHaveFilledMyForm + - ApelsinsaftSmellsLikeSomethingJauntedHere + - ApelsinsaftSpessmenInAShuttle + - ApelsinsaftStrangelyDarkSky + - ApelsinsaftTheSoapBar + - ApelsinsaftTheWanderersSailWithoutWind + - ApelsinsaftWrenchTheGasCanisterDown + - ApelsinsaftYourStayAboardTheStation queueSizeUpgradePart: Capacitor - jukeboxUiColorBG: "#602C00" - jukeboxUiColorPanel: "#480F0F" - jukeboxUiColorAccent: "#20181B" + maxQueuedDefault: 3 + uiColorBG: "#602C00" + uiColorPanel: "#480F0F" + uiColorAccent: "#20181B" + uiButtonPlay: "/Textures/SimpleStation14/Interface/MediaControls/play.png" + uiButtonPause: "/Textures/SimpleStation14/Interface/MediaControls/pause.png" + uiButtonSkip: "/Textures/SimpleStation14/Interface/MediaControls/skip.png" decorativeUi: true - type: Machine board: JukeboxMachineCircuitboard @@ -70,68 +113,3 @@ True: { visible: true } False: { visible: false } -# This and the Zune are just goofy testing items, but proper versions of them should probably be made. -- type: entity - parent: JukeboxBase - id: JukeboxRadio - name: jukebox - description: A small radio for playing music. - components: - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.17,0,0.20,0.4" - mask: - - TabletopMachineMask - layer: - - TabletopMachineLayer - - type: Sprite - sprite: Objects/Devices/communication.rsi - layers: - - state: old-radio - drawdepth: SmallObjects - snapCardinals: true - offset: "0.0,0.4" - - type: ApcPowerReceiver - powerLoad: 120 - - type: Jukebox - songs: - - DanyaVodovozFunkOMatic - - DanyaVodovozGoinOn - emaggedSongs: - - DanyaVodovozMothToAFlame - maxQueuedDefault: 0 - jukeboxUiColorBG: "#272b34" - jukeboxUiColorPanel: "#4d5f6c" - jukeboxUiColorAccent: "#36673d" - decorativeUi: false - -- type: entity - parent: BaseItem - id: JukeboxHandheld - name: zune - description: A small radio for playing music. - components: - - type: ActivatableUI - key: enum.JukeboxUiKey.Key - - type: UserInterface - interfaces: - - key: enum.JukeboxUiKey.Key - type: JukeboxBoundUserInterface - - type: Sprite - sprite: Objects/Devices/communication.rsi - layers: - - state: old-radio - - type: Jukebox - songs: - - DanyaVodovozFunkOMatic - - DanyaVodovozGoinOn - emaggedSongs: - - DanyaVodovozMothToAFlame - maxQueuedDefault: 0 - jukeboxUiColorBG: "#272b34" - jukeboxUiColorPanel: "#4d5f6c" - jukeboxUiColorAccent: "#36673d" - decorativeUi: false diff --git a/Resources/Prototypes/SimpleStation14/JukeboxTracks/apelsinaft.yml b/Resources/Prototypes/SimpleStation14/JukeboxTracks/apelsinaft.yml new file mode 100644 index 0000000000..b48bdc4943 --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/JukeboxTracks/apelsinaft.yml @@ -0,0 +1,198 @@ +# - type: jukeboxTrack +# id: ApelsinsaftAllAccessVacation +# name: "All Access Vacation" +# duration: 1:04 +# path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/all_access_vacation.ogg" # This audio is hanging the client when it gets played??? + +- type: jukeboxTrack + id: ApelsinsaftAndTheClownSmiledOutsideTheAirlock + name: "And The Clown Smiled Outside The Airlock" + duration: 2:21 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/and_the_clown_smiled_outside_the_airlock.ogg" + +- type: jukeboxTrack + id: ApelsinsaftAtmospherics + name: "Atmospherics" + duration: 2:14 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/atmospherics.ogg" + +- type: jukeboxTrack + id: ApelsinsaftATinyGreenBeetleBeat + name: "A Tiny Green Beetle Beat" + duration: 4:48 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/a_tiny_green_beetle_beat.ogg" + +- type: jukeboxTrack + id: ApelsinsaftClearChoice + name: "Clear Choice" + duration: 2:46 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/clear_choice.ogg" + +- type: jukeboxTrack + id: ApelsinsaftConnect + name: "Connect" + duration: 3:56 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/connect.ogg" + +- type: jukeboxTrack + id: ApelsinsaftCorporateCentralCommand + name: "Corporate Central Command" + duration: 3:40 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/corporate_central_command.ogg" + +- type: jukeboxTrack + id: ApelsinsaftDisposal + name: "Disposal" + duration: 2:40 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/disposal.ogg" + +- type: jukeboxTrack + id: ApelsinsaftDocking + name: "Docking" + duration: 3:13 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/docking.ogg" + +- type: jukeboxTrack + id: ApelsinsaftDoILookLikeAClownToYou + name: "Do I Look Like A Clown To You" + duration: 2:24 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/do_i_look_like_a_clown_to_you.ogg" + +- type: jukeboxTrack + id: ApelsinsaftExpensiveRugsAndCheapCaskets + name: "Expensive Rugs And Cheap Caskets" + duration: 2:18 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/expensive_rugs_and_cheap_caskets.ogg" + +- type: jukeboxTrack + id: ApelsinsaftFiguredAsMuch + name: "Figured As Much" + duration: 1:36 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/figured_as_much.ogg" + +- type: jukeboxTrack + id: ApelsinsaftForgetTheStation + name: "Forget The Station" + duration: 2:52 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/forget_the_station.ogg" + +- type: jukeboxTrack + id: ApelsinsaftGhostInTheJanitorsCloset + name: "Ghost In The Janitors Closet" + duration: 3:14 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/ghost_in_the_janitors_closet.ogg" + +- type: jukeboxTrack + id: ApelsinsaftHabaneroDonkPocket + name: "Habanero Donk Pocket" + duration: 1:13 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/habanero_donk_pocket.ogg" + +- type: jukeboxTrack + id: ApelsinsaftHivemindChannel + name: "Hivemind Channel" + duration: 3:33 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/hivemind_channel.ogg" + +- type: jukeboxTrack + id: ApelsinsaftItsAWallSee + name: "Its A Wall See" + duration: 0:42 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/its_a_wall_see.ogg" + +- type: jukeboxTrack + id: ApelsinsaftIFoundThesePillsInMaintenance + name: "I Found These Pills In Maintenance" + duration: 2:08 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/i_found_these_pills_in_maintenance.ogg" + +- type: jukeboxTrack + id: ApelsinsaftNoLooseGooseHere + name: "No Loose Goose Here" + duration: 1:57 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/no_loose_goose_here.ogg" + +- type: jukeboxTrack + id: ApelsinsaftOkayItsLoose + name: "Okay Its Loose" + duration: 2:57 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/okay_its_loose.ogg" + +- type: jukeboxTrack + id: ApelsinsaftOnToTheNextStation + name: "On To The Next Station" + duration: 5:16 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/on_to_the_next_station.ogg" + +- type: jukeboxTrack + id: ApelsinsaftOutsideInAFiresuit + name: "Outside In A Firesuit" + duration: 2:22 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/outside_in_a_firesuit.ogg" + +- type: jukeboxTrack + id: ApelsinsaftPickATyrePattern + name: "Pick A Tyre Pattern" + duration: 4:16 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/pick_a_tyre_pattern.ogg" + +- type: jukeboxTrack + id: ApelsinsaftRedShadowsFallOnCleanFloors + name: "Red Shadows Fall On Clean Floors" + duration: 3:12 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/red_shadows_fall_on_clean_floors.ogg" + +- type: jukeboxTrack + id: ApelsinsaftSawYouJustThen + name: "Saw You Just Then" + duration: 1:41 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/saw_you_just_then.ogg" + +- type: jukeboxTrack + id: ApelsinsaftShouldHaveFilledMyForm + name: "Should Have Filled My Form" + duration: 3:20 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/should_have_filled_my_form.ogg" + +- type: jukeboxTrack + id: ApelsinsaftSmellsLikeSomethingJauntedHere + name: "Smells Like Something Jaunted Here" + duration: 3:43 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/smells_like_something_jaunted_here.ogg" + +- type: jukeboxTrack + id: ApelsinsaftSpessmenInAShuttle + name: "Spessmen In A Shuttle" + duration: 5:24 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/spessmen_in_a_shuttle.ogg" + +- type: jukeboxTrack + id: ApelsinsaftStrangelyDarkSky + name: "Strangely Dark Sky" + duration: 1:28 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/strangely_dark_sky.ogg" + +- type: jukeboxTrack + id: ApelsinsaftTheSoapBar + name: "The Soap Bar" + duration: 3:37 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_soap_bar.ogg" + +- type: jukeboxTrack + id: ApelsinsaftTheWanderersSailWithoutWind + name: "The Wanderers Sail Without Wind" + duration: 3:44 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/the_wanderers_sail_without_wind.ogg" + +- type: jukeboxTrack + id: ApelsinsaftWrenchTheGasCanisterDown + name: "Wrench The Gas Canister Down" + duration: 2:15 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/wrench_the_gas_canister_down.ogg" + +- type: jukeboxTrack + id: ApelsinsaftYourStayAboardTheStation + name: "Your Stay Aboard The Station" + duration: 5:29 + path: "/Audio/SimpleStation14/JukeboxTracks/Apelsinsaft/your_stay_aboard_the_station.ogg" + diff --git a/Resources/Prototypes/SimpleStation14/JukeboxTracks/danyavodovoz.yml b/Resources/Prototypes/SimpleStation14/JukeboxTracks/danya_vodovoz.yml similarity index 100% rename from Resources/Prototypes/SimpleStation14/JukeboxTracks/danyavodovoz.yml rename to Resources/Prototypes/SimpleStation14/JukeboxTracks/danya_vodovoz.yml diff --git a/Resources/Prototypes/SimpleStation14/JukeboxTracks/jon_shuemaker.yml b/Resources/Prototypes/SimpleStation14/JukeboxTracks/jon_shuemaker.yml new file mode 100644 index 0000000000..ce897c290d --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/JukeboxTracks/jon_shuemaker.yml @@ -0,0 +1,48 @@ +- type: jukeboxTrack + id: JonShuemakerAgartha + name: "Agartha" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/agartha.ogg" + duration: 3:16 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/sha.png" + +- type: jukeboxTrack + id: JonShuemakerDancersAndFloaters + name: "Dancers And Floaters" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/dancers_and_floaters.ogg" + duration: 3:23 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/sha.png" + +- type: jukeboxTrack + id: JonShuemakerSha + name: "Sha" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/sha.ogg" + duration: 2:26 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/sha.png" + +- type: jukeboxTrack + id: JonShuemakerLowTide + name: "Low Tide" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/low_tide.ogg" + duration: 3:42 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png" + +- type: jukeboxTrack + id: JonShuemakerTheCurrent + name: "The Current" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/the_current.ogg" + duration: 4:23 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png" + +- type: jukeboxTrack + id: JonShuemakerDrift + name: "Drift" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/drift.ogg" + duration: 4:05 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png" + +- type: jukeboxTrack + id: JonShuemakerWashedAway + name: "Washed Away" + path: "/Audio/SimpleStation14/JukeboxTracks/JonShuemaker/washed_away.ogg" + duration: 5:47 + artPath: "/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png" diff --git a/Resources/Prototypes/SimpleStation14/Recipes/Lathes/electronics.yml b/Resources/Prototypes/SimpleStation14/Recipes/Lathes/electronics.yml new file mode 100644 index 0000000000..bd99ac0fe5 --- /dev/null +++ b/Resources/Prototypes/SimpleStation14/Recipes/Lathes/electronics.yml @@ -0,0 +1,7 @@ +- type: latheRecipe + id: JukeboxMachineCircuitboard + result: JukeboxMachineCircuitboard + completetime: 4 + materials: + Steel: 100 + Glass: 900 diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/a_night_in_brazil.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/a_night_in_brazil.png index 7a24bca932..c3ab164347 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/a_night_in_brazil.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/a_night_in_brazil.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/funk_o_matic.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/funk_o_matic.png index 0d2380e762..9de3ac6332 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/funk_o_matic.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/funk_o_matic.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/goin'_on.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/goin'_on.png index a7fb281fd8..d80325a51e 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/goin'_on.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/goin'_on.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/guacamole.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/guacamole.png index 0d573f5581..b5020c9b39 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/guacamole.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/guacamole.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/jazz_funk_my_soul.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/jazz_funk_my_soul.png index 3a1f024e7f..c6aaaba4bb 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/jazz_funk_my_soul.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/jazz_funk_my_soul.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/moth_to_a_flame.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/moth_to_a_flame.png index 1201983845..ee258679a6 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/moth_to_a_flame.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/moth_to_a_flame.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/off_the_grid.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/off_the_grid.png index 8b6ee2f160..e9a4225fca 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/off_the_grid.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/off_the_grid.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/planet_of_the_amazons.png b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/planet_of_the_amazons.png index 9eaa0f9149..d732563154 100644 Binary files a/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/planet_of_the_amazons.png and b/Resources/Textures/SimpleStation14/JukeboxTracks/DanyaVodovoz/planet_of_the_amazons.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png b/Resources/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png new file mode 100644 index 0000000000..f4413362af Binary files /dev/null and b/Resources/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/drift.png differ diff --git a/Resources/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/sha.png b/Resources/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/sha.png new file mode 100644 index 0000000000..294811798a Binary files /dev/null and b/Resources/Textures/SimpleStation14/JukeboxTracks/JonShuemaker/sha.png differ