diff --git a/Content.Client/Alerts/UpdateAlertSpriteEvent.cs b/Content.Client/Alerts/UpdateAlertSpriteEvent.cs new file mode 100644 index 0000000000..4f182c458c --- /dev/null +++ b/Content.Client/Alerts/UpdateAlertSpriteEvent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Alert; +using Robust.Client.GameObjects; + +namespace Content.Client.Alerts; + +/// +/// Event raised on an entity with alerts in order to allow it to update visuals for the alert sprite entity. +/// +[ByRefEvent] +public record struct UpdateAlertSpriteEvent +{ + public Entity SpriteViewEnt; + + public AlertPrototype Alert; + + public UpdateAlertSpriteEvent(Entity spriteViewEnt, AlertPrototype alert) + { + SpriteViewEnt = spriteViewEnt; + Alert = alert; + } +} diff --git a/Content.Client/Revenant/RevenantSystem.cs b/Content.Client/Revenant/RevenantSystem.cs index 6e7d0d2a1b..49d29d8a5f 100644 --- a/Content.Client/Revenant/RevenantSystem.cs +++ b/Content.Client/Revenant/RevenantSystem.cs @@ -1,3 +1,5 @@ +using Content.Client.Alerts; +using Content.Shared.Alert; using Content.Shared.Revenant; using Content.Shared.Revenant.Components; using Robust.Client.GameObjects; @@ -13,6 +15,7 @@ public sealed class RevenantSystem : EntitySystem base.Initialize(); SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnUpdateAlert); } private void OnAppearanceChange(EntityUid uid, RevenantComponent component, ref AppearanceChangeEvent args) @@ -36,4 +39,16 @@ public sealed class RevenantSystem : EntitySystem args.Sprite.LayerSetState(0, component.State); } } + + private void OnUpdateAlert(Entity ent, ref UpdateAlertSpriteEvent args) + { + if (args.Alert.AlertType != AlertType.Essence) + return; + + var sprite = args.SpriteViewEnt.Comp; + var essence = Math.Clamp(ent.Comp.Essence.Int(), 0, 999); + sprite.LayerSetState(RevenantVisualLayers.Digit1, $"{(essence / 100) % 10}"); + sprite.LayerSetState(RevenantVisualLayers.Digit2, $"{(essence / 10) % 10}"); + sprite.LayerSetState(RevenantVisualLayers.Digit3, $"{essence % 10}"); + } } diff --git a/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs b/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs index 826bbf199b..3b85972a9b 100644 --- a/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs +++ b/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs @@ -3,6 +3,8 @@ using Content.Client.Gameplay; using Content.Client.UserInterface.Systems.Alerts.Widgets; using Content.Client.UserInterface.Systems.Gameplay; using Content.Shared.Alert; +using Robust.Client.GameObjects; +using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; @@ -10,6 +12,8 @@ namespace Content.Client.UserInterface.Systems.Alerts; public sealed class AlertsUIController : UIController, IOnStateEntered, IOnSystemChanged { + [Dependency] private readonly IPlayerManager _player = default!; + [UISystemDependency] private readonly ClientAlertsSystem? _alertsSystem = default; private AlertsUI? UI => UIManager.GetActiveUIWidgetOrNull(); @@ -84,4 +88,16 @@ public sealed class AlertsUIController : UIController, IOnStateEntered(spriteViewEnt, out var sprite)) + return; + + var ev = new UpdateAlertSpriteEvent((spriteViewEnt, sprite), alert); + EntityManager.EventBus.RaiseLocalEvent(player, ref ev); + } } diff --git a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs index 4445bb0cd0..9423f7288d 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs @@ -2,6 +2,8 @@ using Content.Client.Actions.UI; using Content.Client.Cooldown; using Content.Shared.Alert; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.Timing; @@ -33,9 +35,12 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls private short? _severity; private readonly IGameTiming _gameTiming; - private readonly AnimatedTextureRect _icon; + private readonly IEntityManager _entityManager; + private readonly SpriteView _icon; private readonly CooldownGraphic _cooldownGraphic; + private EntityUid _spriteViewEntity; + /// /// Creates an alert control reflecting the indicated alert + state /// @@ -44,19 +49,30 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls public AlertControl(AlertPrototype alert, short? severity) { _gameTiming = IoCManager.Resolve(); + _entityManager = IoCManager.Resolve(); TooltipSupplier = SupplyTooltip; Alert = alert; _severity = severity; - var specifier = alert.GetIcon(_severity); - _icon = new AnimatedTextureRect - { - DisplayRect = {TextureScale = new Vector2(2, 2)} - }; - _icon.SetFromSpriteSpecifier(specifier); + _spriteViewEntity = _entityManager.Spawn(Alert.AlertViewEntity); + if (_entityManager.TryGetComponent(_spriteViewEntity, out var sprite)) + { + var icon = Alert.GetIcon(_severity); + if (sprite.LayerMapTryGet(AlertVisualLayers.Base, out var layer)) + sprite.LayerSetSprite(layer, icon); + } + + _icon = new SpriteView + { + Scale = new Vector2(2, 2) + }; + _icon.SetEntity(_spriteViewEntity); Children.Add(_icon); - _cooldownGraphic = new CooldownGraphic(); + _cooldownGraphic = new CooldownGraphic + { + MaxSize = new Vector2(64, 64) + }; Children.Add(_cooldownGraphic); } @@ -72,16 +88,22 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls /// public void SetSeverity(short? severity) { - if (_severity != severity) - { - _severity = severity; - _icon.SetFromSpriteSpecifier(Alert.GetIcon(_severity)); - } + if (_severity == severity) + return; + _severity = severity; + + if (!_entityManager.TryGetComponent(_spriteViewEntity, out var sprite)) + return; + var icon = Alert.GetIcon(_severity); + if (sprite.LayerMapTryGet(AlertVisualLayers.Base, out var layer)) + sprite.LayerSetSprite(layer, icon); } protected override void FrameUpdate(FrameEventArgs args) { base.FrameUpdate(args); + UserInterfaceManager.GetUIController().UpdateAlertSpriteEntity(_spriteViewEntity, Alert); + if (!Cooldown.HasValue) { _cooldownGraphic.Visible = false; @@ -91,5 +113,17 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls _cooldownGraphic.FromTime(Cooldown.Value.Start, Cooldown.Value.End); } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + _entityManager.DeleteEntity(_spriteViewEntity); + } + } + + public enum AlertVisualLayers : byte + { + Base } } diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs index b26cc4a320..86be70c41f 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs @@ -133,6 +133,7 @@ public sealed partial class RevenantSystem : EntitySystem return false; component.Essence += amount; + Dirty(uid, component); if (regenCap) FixedPoint2.Min(component.Essence, component.EssenceRegenCap); @@ -140,7 +141,7 @@ public sealed partial class RevenantSystem : EntitySystem if (TryComp(uid, out var store)) _store.UpdateUserInterface(uid, uid, store); - _alerts.ShowAlert(uid, AlertType.Essence, (short) Math.Clamp(Math.Round(component.Essence.Float() / 10f), 0, 16)); + _alerts.ShowAlert(uid, AlertType.Essence); if (component.Essence <= 0) { diff --git a/Content.Shared/Alert/AlertPrototype.cs b/Content.Shared/Alert/AlertPrototype.cs index ac43cb45f3..248cc00ba4 100644 --- a/Content.Shared/Alert/AlertPrototype.cs +++ b/Content.Shared/Alert/AlertPrototype.cs @@ -25,6 +25,12 @@ namespace Content.Shared.Alert [DataField("icons", required: true)] public List Icons = new(); + /// + /// An entity used for displaying the in the UI control. + /// + [DataField] + public EntProtoId AlertViewEntity = "AlertSpriteView"; + /// /// Name to show in tooltip window. Accepts formatting. /// @@ -83,13 +89,9 @@ namespace Content.Shared.Alert /// the icon path to the texture for the provided severity level public SpriteSpecifier GetIcon(short? severity = null) { - if (!SupportsSeverity && severity != null) - { - throw new InvalidOperationException($"This alert ({AlertKey}) does not support severity"); - } - var minIcons = SupportsSeverity - ? MaxSeverity - MinSeverity : 1; + ? MaxSeverity - MinSeverity + : 1; if (Icons.Count < minIcons) throw new InvalidOperationException($"Insufficient number of icons given for alert {AlertType}"); diff --git a/Content.Shared/Revenant/Components/RevenantComponent.cs b/Content.Shared/Revenant/Components/RevenantComponent.cs index b3d47e22f9..947c1a4b3f 100644 --- a/Content.Shared/Revenant/Components/RevenantComponent.cs +++ b/Content.Shared/Revenant/Components/RevenantComponent.cs @@ -9,13 +9,15 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy namespace Content.Shared.Revenant.Components; [RegisterComponent, NetworkedComponent] +[AutoGenerateComponentState] public sealed partial class RevenantComponent : Component { /// /// The total amount of Essence the revenant has. Functions /// as health and is regenerated. /// - [ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] public FixedPoint2 Essence = 75; [DataField("stolenEssenceCurrencyPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] diff --git a/Content.Shared/Revenant/SharedRevenant.cs b/Content.Shared/Revenant/SharedRevenant.cs index c44e4408aa..485ad26dd2 100644 --- a/Content.Shared/Revenant/SharedRevenant.cs +++ b/Content.Shared/Revenant/SharedRevenant.cs @@ -70,3 +70,11 @@ public enum RevenantVisuals : byte Stunned, Harvesting, } + +[NetSerializable, Serializable] +public enum RevenantVisualLayers : byte +{ + Digit1, + Digit2, + Digit3 +} diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 2d1c9062e6..e9a7f9c958 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -25,6 +25,14 @@ - alertType: Magboots - alertType: Pacified +- type: entity + id: AlertSpriteView + categories: [ hideSpawnMenu ] + components: + - type: Sprite + layers: + - map: [ "enum.AlertVisualLayers.Base" ] + - type: alert id: LowOxygen category: Breathing diff --git a/Resources/Prototypes/Alerts/revenant.yml b/Resources/Prototypes/Alerts/revenant.yml index d859cd60f1..7f3f98949e 100644 --- a/Resources/Prototypes/Alerts/revenant.yml +++ b/Resources/Prototypes/Alerts/revenant.yml @@ -4,45 +4,26 @@ icons: - sprite: /Textures/Interface/Alerts/essence_counter.rsi state: essence0 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence1 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence2 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence3 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence4 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence5 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence6 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence7 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence8 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence9 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence10 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence11 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence12 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence13 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence14 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence15 - - sprite: /Textures/Interface/Alerts/essence_counter.rsi - state: essence16 + alertViewEntity: AlertEssenceSpriteView name: alerts-revenant-essence-name description: alerts-revenant-essence-desc - minSeverity: 0 - maxSeverity: 16 - type: alert id: Corporeal icons: [ /Textures/Mobs/Ghosts/revenant.rsi/icon.png ] name: alerts-revenant-corporeal-name - description: alerts-revenant-corporeal-desc \ No newline at end of file + description: alerts-revenant-corporeal-desc + +- type: entity + id: AlertEssenceSpriteView + categories: [ hideSpawnMenu ] + components: + - type: Sprite + sprite: /Textures/Interface/Alerts/essence_counter.rsi + layers: + - map: [ "enum.AlertVisualLayers.Base" ] + - map: [ "enum.RevenantVisualLayers.Digit1" ] + - map: [ "enum.RevenantVisualLayers.Digit2" ] + offset: 0.125, 0 + - map: [ "enum.RevenantVisualLayers.Digit3" ] + offset: 0.25, 0 diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/0.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/0.png new file mode 100644 index 0000000000..760a92bfe1 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/0.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/1.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/1.png new file mode 100644 index 0000000000..a43c58356e Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/1.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/2.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/2.png new file mode 100644 index 0000000000..9807aa8161 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/2.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/3.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/3.png new file mode 100644 index 0000000000..a1776e8efd Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/3.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/4.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/4.png new file mode 100644 index 0000000000..a1b8c7013e Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/4.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/5.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/5.png new file mode 100644 index 0000000000..479ef53d64 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/5.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/6.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/6.png new file mode 100644 index 0000000000..1222a73b5e Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/6.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/7.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/7.png new file mode 100644 index 0000000000..e6bef33ed5 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/7.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/8.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/8.png new file mode 100644 index 0000000000..c72dbb5433 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/8.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/9.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/9.png new file mode 100644 index 0000000000..970eeb9740 Binary files /dev/null and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/9.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence0.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence0.png index 361fa844e1..3523928f3c 100644 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence0.png and b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence0.png differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence1.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence1.png deleted file mode 100644 index b59f46bf28..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence1.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence10.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence10.png deleted file mode 100644 index 62557685d9..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence10.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence11.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence11.png deleted file mode 100644 index 78919a5cda..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence11.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence12.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence12.png deleted file mode 100644 index 9a915624f3..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence12.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence13.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence13.png deleted file mode 100644 index d853af038e..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence13.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence14.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence14.png deleted file mode 100644 index 9034554013..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence14.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence15.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence15.png deleted file mode 100644 index cc2cc47756..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence15.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence16.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence16.png deleted file mode 100644 index e1a641f9e8..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence16.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence2.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence2.png deleted file mode 100644 index 8b33351062..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence2.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence3.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence3.png deleted file mode 100644 index 7d22c2a9b6..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence3.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence4.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence4.png deleted file mode 100644 index 98f6fc0764..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence4.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence5.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence5.png deleted file mode 100644 index 11252a4c16..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence5.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence6.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence6.png deleted file mode 100644 index 36211437c0..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence6.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence7.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence7.png deleted file mode 100644 index febaf3d09c..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence7.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence8.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence8.png deleted file mode 100644 index 4a2ba8d13e..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence8.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence9.png b/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence9.png deleted file mode 100644 index 8e0c559e8e..0000000000 Binary files a/Resources/Textures/Interface/Alerts/essence_counter.rsi/essence9.png and /dev/null differ diff --git a/Resources/Textures/Interface/Alerts/essence_counter.rsi/meta.json b/Resources/Textures/Interface/Alerts/essence_counter.rsi/meta.json index 562ef369b4..08c01e6008 100644 --- a/Resources/Textures/Interface/Alerts/essence_counter.rsi/meta.json +++ b/Resources/Textures/Interface/Alerts/essence_counter.rsi/meta.json @@ -11,52 +11,34 @@ "name": "essence0" }, { - "name": "essence1" + "name": "0" }, { - "name": "essence2" + "name": "1" }, { - "name": "essence3" + "name": "2" }, { - "name": "essence4" + "name": "3" }, { - "name": "essence5" + "name": "4" }, { - "name": "essence6" + "name": "5" }, { - "name": "essence7" + "name": "6" }, { - "name": "essence8" + "name": "7" }, { - "name": "essence9" + "name": "8" }, { - "name": "essence10" - }, - { - "name": "essence11" - }, - { - "name": "essence12" - }, - { - "name": "essence13" - }, - { - "name": "essence14" - }, - { - "name": "essence15" - }, - { - "name": "essence16" + "name": "9" } ] }