diff --git a/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs index 03f0af16c5..04597fc3f9 100644 --- a/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs +++ b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs @@ -120,7 +120,6 @@ namespace Content.Client.GameObjects.Components.Doors { animPlayer.Play(OpenAnimation, AnimationKey); } - break; case DoorVisualState.Open: sprite.LayerSetState(DoorVisualLayers.Base, "open"); diff --git a/Content.Client/GameObjects/Components/Power/AutolatheVisualizer2D.cs b/Content.Client/GameObjects/Components/Power/AutolatheVisualizer2D.cs new file mode 100644 index 0000000000..6ad061678b --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/AutolatheVisualizer2D.cs @@ -0,0 +1,107 @@ +using System; +using Content.Shared.GameObjects.Components.Power; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Power +{ + public class AutolatheVisualizer2D : AppearanceVisualizer + { + private const string AnimationKey = "autolathe_animation"; + + private Animation _buildingAnimation; + private Animation _insertingMetalAnimation; + private Animation _insertingGlassAnimation; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + _buildingAnimation = PopulateAnimation("autolathe_building", "autolathe_building_unlit", 0.5f); + _insertingMetalAnimation = PopulateAnimation("autolathe_inserting_metal_plate", "autolathe_inserting_unlit", 0.9f); + _insertingGlassAnimation = PopulateAnimation("autolathe_inserting_glass_plate", "autolathe_inserting_unlit", 0.9f); + } + + private Animation PopulateAnimation(string sprite, string spriteUnlit, float length) + { + var animation = new Animation {Length = TimeSpan.FromSeconds(length)}; + + var flick = new AnimationTrackSpriteFlick(); + animation.AnimationTracks.Add(flick); + flick.LayerKey = AutolatheVisualLayers.Base; + flick.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(sprite, 0f)); + + var flickUnlit = new AnimationTrackSpriteFlick(); + animation.AnimationTracks.Add(flickUnlit); + flickUnlit.LayerKey = AutolatheVisualLayers.BaseUnlit; + flickUnlit.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(spriteUnlit, 0f)); + + return animation; + } + + public override void InitializeEntity(IEntity entity) + { + if (!entity.HasComponent()) + { + entity.AddComponent(); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + var animPlayer = component.Owner.GetComponent(); + if (!component.TryGetData(PowerDeviceVisuals.VisualState, out LatheVisualState state)) + { + state = LatheVisualState.Idle; + } + + switch (state) + { + case LatheVisualState.Idle: + if (animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Stop(AnimationKey); + } + + sprite.LayerSetState(AutolatheVisualLayers.Base, "autolathe"); + sprite.LayerSetState(AutolatheVisualLayers.BaseUnlit, "autolathe_unlit"); + break; + case LatheVisualState.Producing: + if (!animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Play(_buildingAnimation, AnimationKey); + } + break; + case LatheVisualState.InsertingMetal: + if (!animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Play(_insertingMetalAnimation, AnimationKey); + } + break; + case LatheVisualState.InsertingGlass: + if (!animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Play(_insertingGlassAnimation, AnimationKey); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } + + var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered); + sprite.LayerSetVisible(AutolatheVisualLayers.BaseUnlit, glowingPartsVisible); + } + public enum AutolatheVisualLayers + { + Base, + BaseUnlit + } + } +} diff --git a/Content.Client/GameObjects/Components/Power/ProtolatheVisualizer2D.cs b/Content.Client/GameObjects/Components/Power/ProtolatheVisualizer2D.cs new file mode 100644 index 0000000000..4547c1668c --- /dev/null +++ b/Content.Client/GameObjects/Components/Power/ProtolatheVisualizer2D.cs @@ -0,0 +1,104 @@ +using System; +using Content.Shared.GameObjects.Components.Power; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Power +{ + public class ProtolatheVisualizer2D : AppearanceVisualizer + { + private const string AnimationKey = "protolathe_animation"; + + private Animation _buildingAnimation; + private Animation _insertingMetalAnimation; + private Animation _insertingGlassAnimation; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + _buildingAnimation = PopulateAnimation("protolathe_building", 0.9f); + _insertingMetalAnimation = PopulateAnimation("protolathe_metal", 0.9f); + _insertingGlassAnimation = PopulateAnimation("protolathe_glass", 0.9f); + } + + private Animation PopulateAnimation(string sprite, float length) + { + var animation = new Animation {Length = TimeSpan.FromSeconds(length)}; + + var flick = new AnimationTrackSpriteFlick(); + animation.AnimationTracks.Add(flick); + flick.LayerKey = ProtolatheVisualLayers.AnimationLayer; + flick.KeyFrames.Add(new AnimationTrackSpriteFlick.KeyFrame(sprite, 0f)); + + return animation; + } + + public override void InitializeEntity(IEntity entity) + { + if (!entity.HasComponent()) + { + entity.AddComponent(); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + var animPlayer = component.Owner.GetComponent(); + if (!component.TryGetData(PowerDeviceVisuals.VisualState, out LatheVisualState state)) + { + state = LatheVisualState.Idle; + } + sprite.LayerSetVisible(ProtolatheVisualLayers.AnimationLayer, true); + switch (state) + { + case LatheVisualState.Idle: + if (animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Stop(AnimationKey); + } + + sprite.LayerSetState(ProtolatheVisualLayers.Base, "protolathe"); + sprite.LayerSetState(ProtolatheVisualLayers.BaseUnlit, "protolathe_unlit"); + sprite.LayerSetVisible(ProtolatheVisualLayers.AnimationLayer, false); + break; + case LatheVisualState.Producing: + if (!animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Play(_buildingAnimation, AnimationKey); + } + break; + case LatheVisualState.InsertingMetal: + if (!animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Play(_insertingMetalAnimation, AnimationKey); + } + break; + case LatheVisualState.InsertingGlass: + if (!animPlayer.HasRunningAnimation(AnimationKey)) + { + animPlayer.Play(_insertingGlassAnimation, AnimationKey); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } + + var glowingPartsVisible = !(component.TryGetData(PowerDeviceVisuals.Powered, out bool powered) && !powered); + sprite.LayerSetVisible(ProtolatheVisualLayers.BaseUnlit, glowingPartsVisible); + } + public enum ProtolatheVisualLayers + { + Base, + BaseUnlit, + AnimationLayer + } + } +} diff --git a/Content.Client/GameObjects/EntitySystems/VerbSystem.cs b/Content.Client/GameObjects/EntitySystems/VerbSystem.cs index 832ea53501..c88bf50150 100644 --- a/Content.Client/GameObjects/EntitySystems/VerbSystem.cs +++ b/Content.Client/GameObjects/EntitySystems/VerbSystem.cs @@ -121,7 +121,7 @@ namespace Content.Client.GameObjects.EntitySystems DebugTools.AssertNotNull(_currentPopup); - var buttons = new List