diff --git a/Content.Client/Holiday/HolidayRsiSwapComponent.cs b/Content.Client/Holiday/HolidayRsiSwapComponent.cs new file mode 100644 index 0000000000..d84018d3e7 --- /dev/null +++ b/Content.Client/Holiday/HolidayRsiSwapComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Client.Holiday; + +/// +/// This is used for a component that swaps an entity's RSI based on HolidayVisuals +/// +[RegisterComponent] +public sealed partial class HolidayRsiSwapComponent : Component +{ + /// + /// A dictionary of arbitrary visual keys to an rsi to swap the sprite to. + /// + [DataField] + public Dictionary Sprite = new(); +} diff --git a/Content.Client/Holiday/HolidaySystem.cs b/Content.Client/Holiday/HolidaySystem.cs new file mode 100644 index 0000000000..07ae98f449 --- /dev/null +++ b/Content.Client/Holiday/HolidaySystem.cs @@ -0,0 +1,34 @@ +using Content.Shared.Holiday; +using Content.Shared.Item; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; +using Robust.Shared.Serialization.TypeSerializers.Implementations; + +namespace Content.Client.Holiday; + +public sealed class HolidaySystem : EntitySystem +{ + [Dependency] private readonly IResourceCache _rescache = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAppearanceChange); + } + + private void OnAppearanceChange(Entity ent, ref AppearanceChangeEvent args) + { + if (!_appearance.TryGetData(ent, HolidayVisuals.Holiday, out var data, args.Component)) + return; + + var comp = ent.Comp; + if (!comp.Sprite.TryGetValue(data, out var rsistring) || args.Sprite == null) + return; + + var path = SpriteSpecifierSerializer.TextureRoot / rsistring; + if (_rescache.TryGetResource(path, out RSIResource? rsi)) + args.Sprite.BaseRSI = rsi.RSI; + } +} diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index e1d744da2d..c1b646ec4f 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -18,6 +18,7 @@ namespace Content.Server.Entry "PdaBorderColor", "InventorySlots", "LightFade", + "HolidayRsiSwap", }; } } diff --git a/Content.Server/Holiday/HolidaySystem.cs b/Content.Server/Holiday/HolidaySystem.cs index 86cd300101..4224b01491 100644 --- a/Content.Server/Holiday/HolidaySystem.cs +++ b/Content.Server/Holiday/HolidaySystem.cs @@ -2,6 +2,7 @@ using System.Linq; using Content.Server.Chat.Managers; using Content.Server.GameTicking; using Content.Shared.CCVar; +using Content.Shared.Holiday; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; @@ -12,6 +13,7 @@ namespace Content.Server.Holiday [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [ViewVariables] private readonly List _currentHolidays = new(); @@ -24,6 +26,7 @@ namespace Content.Server.Holiday _configManager.OnValueChanged(CCVars.HolidaysEnabled, OnHolidaysEnableChange, true); SubscribeLocalEvent(OnRunLevelChanged); + SubscribeLocalEvent(OnVisualsInit); } public void RefreshCurrentHolidays() @@ -102,6 +105,17 @@ namespace Content.Server.Holiday break; } } + + private void OnVisualsInit(Entity ent, ref ComponentInit args) + { + foreach (var (key, holidays) in ent.Comp.Holidays) + { + if (!holidays.Any(h => IsCurrentlyHoliday(h))) + continue; + _appearance.SetData(ent, HolidayVisuals.Holiday, key); + break; + } + } } /// diff --git a/Content.Server/Holiday/HolidayVisualsComponent.cs b/Content.Server/Holiday/HolidayVisualsComponent.cs new file mode 100644 index 0000000000..96032263e6 --- /dev/null +++ b/Content.Server/Holiday/HolidayVisualsComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.Prototypes; + +namespace Content.Server.Holiday; + +/// +/// This is used for an entity that enables unique visuals on specified holidays. +/// +[RegisterComponent] +public sealed partial class HolidayVisualsComponent : Component +{ + /// + /// A dictionary relating a generic key to a list of holidays. + /// If any of the holidays are being celebrated, that key will be set for holiday visuals. + /// + [DataField] + public Dictionary>> Holidays = new(); +} diff --git a/Content.Shared/Holiday/HolidayVisuals.cs b/Content.Shared/Holiday/HolidayVisuals.cs new file mode 100644 index 0000000000..4af1efae68 --- /dev/null +++ b/Content.Shared/Holiday/HolidayVisuals.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Holiday; + +[Serializable, NetSerializable] +public enum HolidayVisuals : byte +{ + Holiday +} diff --git a/Resources/Prototypes/Entities/Objects/Devices/nuke.yml b/Resources/Prototypes/Entities/Objects/Devices/nuke.yml index 63e28648c3..b61787b574 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/nuke.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/nuke.yml @@ -9,7 +9,21 @@ - type: Sprite sprite: Objects/Devices/nuke.rsi noRot: true - state: nuclearbomb_base + layers: + - state: nuclearbomb_base + - state: nukefestive + map: ["christmas"] + visible: false + - type: Appearance + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: GenericVisualizer + visuals: + enum.HolidayVisuals.Holiday: + christmas: + festive: { visible: true } - type: Physics bodyType: Static - type: Fixtures @@ -90,7 +104,21 @@ - type: NukeLabel - type: Sprite sprite: Objects/Devices/nuke.rsi - state: nuclearbomb_base + layers: + - state: nuclearbomb_base + - state: nukefestive + map: ["christmas"] + visible: false + - type: Appearance + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: GenericVisualizer + visuals: + enum.HolidayVisuals.Holiday: + christmas: + festive: { visible: true } - type: Physics bodyType: Dynamic - type: Fixtures diff --git a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml index 83701249d0..ec9a94de86 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml @@ -62,12 +62,24 @@ sprite: Objects/Misc/Lights/lamp.rsi layers: - state: lamp + map: [ "base" ] - state: lamp-on shader: unshaded visible: false map: [ "light" ] - type: Item sprite: Objects/Misc/Lights/lamp.rsi + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: GenericVisualizer + visuals: + enum.HolidayVisuals.Holiday: + base: + festive: { state: christmaslamp } + light: + festive: { state: christmaslamp-on } - type: entity name: banana lamp @@ -93,12 +105,28 @@ sprite: Objects/Misc/Lights/lampgreen.rsi layers: - state: lampgreen + map: [ "base" ] - state: lampgreen-on shader: unshaded visible: false map: [ "light" ] - type: Item sprite: Objects/Misc/Lights/lampgreen.rsi + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: GenericVisualizer + visuals: + enum.HolidayVisuals.Holiday: + base: + festive: + sprite: Objects/Misc/Lights/lamp.rsi + state: christmaslamp + light: + festive: + sprite: Objects/Misc/Lights/lamp.rsi + state: christmaslamp-on - type: entity name: interrogator lamp diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml index e3581370f0..ac675f6cd2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml @@ -11,7 +11,6 @@ - state: icon map: ["base"] - type: Item - sprite: Objects/Weapons/Bombs/c4.rsi size: Small - type: OnUseTimerTrigger delay: 10 @@ -54,6 +53,13 @@ - !type:ExplodeBehavior - type: StickyVisualizer - type: Appearance + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: HolidayRsiSwap + sprite: + festive: Objects/Weapons/Bombs/c4gift.rsi - type: GenericVisualizer visuals: enum.Trigger.TriggerVisuals.VisualState: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml index b0fa94d440..48138452b2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml @@ -6,7 +6,19 @@ components: - type: Sprite sprite: Objects/Weapons/Throwable/throwing_star.rsi - state: icon + layers: + - state: icon + map: ["base"] + - type: Appearance + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: GenericVisualizer + visuals: + enum.HolidayVisuals.Holiday: + base: + festive: { state: festive } - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml b/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml index 03851318e1..f5bbafa40c 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/fireplace.yml @@ -8,10 +8,23 @@ sprite: Structures/Decoration/fireplace.rsi layers: - state: fireplace + - state: fireplacefestive + map: ["christmas"] + visible: false - state: fireplace_fire4 shader: unshaded - state: fireplace_glow shader: unshaded + - type: Appearance + - type: HolidayVisuals + holidays: + festive: + - FestiveSeason + - type: GenericVisualizer + visuals: + enum.HolidayVisuals.Holiday: + christmas: + festive: { visible: true } - type: AmbientSound volume: -6 range: 5 diff --git a/Resources/Textures/Objects/Devices/nuke.rsi/meta.json b/Resources/Textures/Objects/Devices/nuke.rsi/meta.json index 6e44a5417f..2828b13ddb 100644 --- a/Resources/Textures/Objects/Devices/nuke.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/nuke.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/835fd60545178a19064f5df9981dac6e1b220775/icons/obj/stationobjs.dmi", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/835fd60545178a19064f5df9981dac6e1b220775/icons/obj/stationobjs.dmi, nukefestive by Alekshhh (Github)", "size": { "x": 32, "y": 32 @@ -10,6 +10,15 @@ { "name": "nuclearbomb_deployed" }, + { + "name": "nukefestive", + "delays": [ + [ + 0.25, + 0.25 + ] + ] + }, { "name": "nuclearbomb_timing", "delays": [ diff --git a/Resources/Textures/Objects/Devices/nuke.rsi/nukefestive.png b/Resources/Textures/Objects/Devices/nuke.rsi/nukefestive.png new file mode 100644 index 0000000000..f9c58ac8e6 Binary files /dev/null and b/Resources/Textures/Objects/Devices/nuke.rsi/nukefestive.png differ diff --git a/Resources/Textures/Objects/Misc/Lights/lamp.rsi/christmaslamp-on.png b/Resources/Textures/Objects/Misc/Lights/lamp.rsi/christmaslamp-on.png new file mode 100644 index 0000000000..df2434f83d Binary files /dev/null and b/Resources/Textures/Objects/Misc/Lights/lamp.rsi/christmaslamp-on.png differ diff --git a/Resources/Textures/Objects/Misc/Lights/lamp.rsi/christmaslamp.png b/Resources/Textures/Objects/Misc/Lights/lamp.rsi/christmaslamp.png new file mode 100644 index 0000000000..c461a429fd Binary files /dev/null and b/Resources/Textures/Objects/Misc/Lights/lamp.rsi/christmaslamp.png differ diff --git a/Resources/Textures/Objects/Misc/Lights/lamp.rsi/meta.json b/Resources/Textures/Objects/Misc/Lights/lamp.rsi/meta.json index 1cfaa8f91d..c18be3fd62 100644 --- a/Resources/Textures/Objects/Misc/Lights/lamp.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/Lights/lamp.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, christmaslamp by Alekshhh (Github)", "size": { "x": 32, "y": 32 @@ -11,6 +11,12 @@ "name": "lamp", "directions": 4 }, + { + "name": "christmaslamp" + }, + { + "name": "christmaslamp-on" + }, { "name": "lamp-on", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/icon.png b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/icon.png new file mode 100644 index 0000000000..915d1c0c35 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/inhand-left.png new file mode 100644 index 0000000000..cb782d5245 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/inhand-right.png new file mode 100644 index 0000000000..6ceb49c89d Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/meta.json b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/meta.json new file mode 100644 index 0000000000..a24d3bae5f --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by Alekshhh (Github) for SS14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/primed.png b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/primed.png new file mode 100644 index 0000000000..84c96e0340 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/c4gift.rsi/primed.png differ diff --git a/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/festive.png b/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/festive.png new file mode 100644 index 0000000000..cd62feb095 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/festive.png differ diff --git a/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/meta.json b/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/meta.json index 44d65d9d5e..c716710532 100644 --- a/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Throwable/throwing_star.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created for SS14 by deltanedas (github)", + "copyright": "Created for SS14 by deltanedas (github), festive by Alekshhh (Github)", "size": { "x": 32, "y": 32 @@ -9,6 +9,9 @@ "states": [ { "name": "icon" + }, + { + "name": "festive" } ] } diff --git a/Resources/Textures/Structures/Decoration/fireplace.rsi/fireplacefestive.png b/Resources/Textures/Structures/Decoration/fireplace.rsi/fireplacefestive.png new file mode 100644 index 0000000000..bea2ae81cf Binary files /dev/null and b/Resources/Textures/Structures/Decoration/fireplace.rsi/fireplacefestive.png differ diff --git a/Resources/Textures/Structures/Decoration/fireplace.rsi/meta.json b/Resources/Textures/Structures/Decoration/fireplace.rsi/meta.json index e5fffc1852..276eabd624 100644 --- a/Resources/Textures/Structures/Decoration/fireplace.rsi/meta.json +++ b/Resources/Textures/Structures/Decoration/fireplace.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/tgstation/commit/6449b65d307312a111deb592e7a1bb4093e085e4", + "copyright": "https://github.com/tgstation/tgstation/commit/6449b65d307312a111deb592e7a1bb4093e085e4, fireplacefestive by Alekshhh (Github)", "size": { "x": 64, "y": 64 @@ -11,6 +11,9 @@ "name": "fireplace", "directions": 1 }, + { + "name": "fireplacefestive" + }, { "name": "fireplace_fire4", "directions": 4, @@ -60,4 +63,4 @@ ] } ] -} \ No newline at end of file +}