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
+}