Cosmic glyph rework: activation time and animations. (#4147)
* Refactoring in progress * Refactoring completed, proceeding to animate a ton * Don't commit that idiot * Ballin * Actually use the animations I made * More sprites * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Change a lot of stuff * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Hopefuly finish changing stuff * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Prototype * Change sprites * Fix test fail * Cessation sprites * warding * Add sounds * Typo * Projection * Truth * Knowledge * Fix being able to convert SSD peeps * Add interaction outline because why the hell not * Change stuff * Surely this won't explode --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
|
|
@ -0,0 +1,8 @@
|
|||
using Content.Shared._DV.CosmicCult;
|
||||
|
||||
namespace Content.Client._DV.CosmicCult;
|
||||
|
||||
public sealed class CosmicGlyphSystem : SharedCosmicGlyphSystem
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ using Content.Server.Popups;
|
|||
using Content.Shared._DV.CosmicCult.Components;
|
||||
using Content.Shared._DV.CosmicCult;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Mindshield.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Popups;
|
||||
|
|
@ -22,15 +23,17 @@ public sealed class CosmicConversionSystem : EntitySystem
|
|||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedCosmicCultSystem _cosmicCult = default!;
|
||||
[Dependency] private readonly SharedStunSystem _stun = default!;
|
||||
[Dependency] private readonly SharedMindSystem _mind = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CosmicGlyphConversionComponent, TryActivateGlyphEvent>(OnConversionGlyph);
|
||||
SubscribeLocalEvent<CosmicGlyphConversionComponent, CheckGlyphConditionsEvent>(OnCheckGlyphConditions);
|
||||
}
|
||||
|
||||
private void OnConversionGlyph(Entity<CosmicGlyphConversionComponent> uid, ref TryActivateGlyphEvent args)
|
||||
private void OnCheckGlyphConditions(Entity<CosmicGlyphConversionComponent> uid, ref CheckGlyphConditionsEvent args)
|
||||
{
|
||||
var possibleTargets = _cosmicGlyph.GetTargetsNearGlyph(uid, uid.Comp.ConversionRange, entity => _cosmicCult.EntityIsCultist(entity));
|
||||
if (possibleTargets.Count == 0)
|
||||
|
|
@ -45,6 +48,28 @@ public sealed class CosmicConversionSystem : EntitySystem
|
|||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
foreach (var target in possibleTargets)
|
||||
{
|
||||
if (!_mind.TryGetMind(target, out _, out _))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("cult-glyph-target-mindless"), uid, args.User);
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnConversionGlyph(Entity<CosmicGlyphConversionComponent> uid, ref TryActivateGlyphEvent args)
|
||||
{
|
||||
var ev = new CheckGlyphConditionsEvent(args.User, args.Cultists);
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
if (ev.Cancelled)
|
||||
{
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
var possibleTargets = _cosmicGlyph.GetTargetsNearGlyph(uid, uid.Comp.ConversionRange, entity => _cosmicCult.EntityIsCultist(entity));
|
||||
|
||||
foreach (var target in possibleTargets)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,11 +17,11 @@ public sealed class CosmicTransmuteSystem : EntitySystem
|
|||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CosmicGlyphTransmuteComponent, TryActivateGlyphEvent>(OnTransmuteGlyph);
|
||||
SubscribeLocalEvent<CosmicGlyphTransmuteComponent, CheckGlyphConditionsEvent>(OnCheckGlyphConditions);
|
||||
}
|
||||
|
||||
private void OnTransmuteGlyph(Entity<CosmicGlyphTransmuteComponent> uid, ref TryActivateGlyphEvent args)
|
||||
private void OnCheckGlyphConditions(Entity<CosmicGlyphTransmuteComponent> uid, ref CheckGlyphConditionsEvent args)
|
||||
{
|
||||
var tgtpos = Transform(uid).Coordinates;
|
||||
var possibleTargets = GatherEntities(uid);
|
||||
if (possibleTargets.Count == 0)
|
||||
{
|
||||
|
|
@ -29,6 +29,20 @@ public sealed class CosmicTransmuteSystem : EntitySystem
|
|||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnTransmuteGlyph(Entity<CosmicGlyphTransmuteComponent> uid, ref TryActivateGlyphEvent args)
|
||||
{
|
||||
var ev = new CheckGlyphConditionsEvent(args.User, args.Cultists);
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
if (ev.Cancelled)
|
||||
{
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
var tgtpos = Transform(uid).Coordinates;
|
||||
var possibleTargets = GatherEntities(uid);
|
||||
var target = _random.Pick(possibleTargets);
|
||||
if (!TryComp<CosmicTransmutableComponent>(target, out var comp)) return;
|
||||
Spawn(comp.TransmutesTo, tgtpos);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ using Content.Shared._DV.CosmicCult;
|
|||
using Content.Server._EE.Radio;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Eye;
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.Inventory.Events;
|
||||
|
|
@ -31,7 +30,6 @@ using Robust.Shared.Utility;
|
|||
using Content.Shared.Popups;
|
||||
using Content.Shared.Radio;
|
||||
using Content.Server.Radio.Components;
|
||||
using Content.Shared.IdentityManagement.Components;
|
||||
|
||||
namespace Content.Server._DV.CosmicCult;
|
||||
|
||||
|
|
@ -91,9 +89,6 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
|
|||
SubscribeLocalEvent<CosmicImposingComponent, ComponentRemove>(OnEndImposition);
|
||||
SubscribeLocalEvent<CosmicImposingComponent, RefreshMovementSpeedModifiersEvent>(OnImpositionMoveSpeed);
|
||||
|
||||
SubscribeLocalEvent<CosmicCultExamineComponent, ExaminedEvent>(OnCosmicCultExamined);
|
||||
|
||||
SubscribeLocalEvent<CosmicSubtleMarkComponent, ExaminedEvent>(OnSubtleMarkExamined);
|
||||
SubscribeLocalEvent<CosmicCultComponent, EncryptionChannelsChangedEvent>(OnTransmitterChannelsChangedCult, after: new[] { typeof(IntrinsicRadioKeySystem) });
|
||||
|
||||
SubscribeLocalEvent<RadioSendAttemptEvent>(OnRadioSendAttempt);
|
||||
|
|
@ -125,19 +120,6 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
|
|||
_map.SetPaused(map.Value.Comp.MapId, false);
|
||||
}
|
||||
|
||||
private void OnCosmicCultExamined(Entity<CosmicCultExamineComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
args.PushMarkup(Loc.GetString(EntitySeesCult(args.Examiner) ? ent.Comp.CultistText : ent.Comp.OthersText));
|
||||
}
|
||||
|
||||
private void OnSubtleMarkExamined(Entity<CosmicSubtleMarkComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
var ev = new SeeIdentityAttemptEvent();
|
||||
RaiseLocalEvent(ent, ev);
|
||||
if (ev.TotalCoverage.HasFlag(IdentityBlockerCoverage.EYES)) return;
|
||||
|
||||
args.PushMarkup(Loc.GetString(ent.Comp.ExamineText));
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Init Cult
|
||||
|
|
@ -235,12 +217,10 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem
|
|||
private void OnStartImposition(Entity<CosmicImposingComponent> uid, ref ComponentInit args) // these functions just make sure
|
||||
{
|
||||
_movementSpeed.RefreshMovementSpeedModifiers(uid);
|
||||
EnsureComp<CosmicCultExamineComponent>(uid).CultistText = "cosmic-examine-text-malignecho";
|
||||
}
|
||||
private void OnEndImposition(Entity<CosmicImposingComponent> uid, ref ComponentRemove args) // as various cosmic cult effects get added and removed
|
||||
{
|
||||
_movementSpeed.RefreshMovementSpeedModifiers(uid);
|
||||
RemComp<CosmicCultExamineComponent>(uid);
|
||||
}
|
||||
|
||||
private void OnRefreshMoveSpeed(EntityUid uid, InfluenceStrideComponent comp, RefreshMovementSpeedModifiersEvent args)
|
||||
|
|
|
|||
|
|
@ -10,10 +10,11 @@ using Content.Shared.Mobs.Systems;
|
|||
using Robust.Server.Audio;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server._DV.CosmicCult;
|
||||
|
||||
public sealed class CosmicGlyphSystem : EntitySystem
|
||||
public sealed class CosmicGlyphSystem : SharedCosmicGlyphSystem
|
||||
{
|
||||
[Dependency] private readonly DamageableSystem _damageable = default!;
|
||||
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
||||
|
|
@ -22,27 +23,47 @@ public sealed class CosmicGlyphSystem : EntitySystem
|
|||
[Dependency] private readonly AudioSystem _audio = default!;
|
||||
[Dependency] private readonly SharedContainerSystem _container = default!;
|
||||
[Dependency] private readonly SharedCosmicCultSystem _cosmicCult = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
private readonly HashSet<Entity<CosmicCultComponent>> _cultists = [];
|
||||
private readonly HashSet<Entity<HumanoidAppearanceComponent>> _humanoids = [];
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<CosmicGlyphComponent, ExaminedEvent>(OnExamine);
|
||||
SubscribeLocalEvent<CosmicGlyphComponent, ActivateInWorldEvent>(OnUseGlyph);
|
||||
SubscribeLocalEvent<CosmicGlyphComponent, ComponentStartup>(OnGlyphCreated);
|
||||
}
|
||||
|
||||
#region Base trigger
|
||||
|
||||
private void OnExamine(Entity<CosmicGlyphComponent> uid, ref ExaminedEvent args)
|
||||
private void OnGlyphCreated(Entity<CosmicGlyphComponent> ent, ref ComponentStartup args)
|
||||
{
|
||||
if (_cosmicCult.EntityIsCultist(args.Examiner))
|
||||
ent.Comp.Timer = _timing.CurTime + ent.Comp.SpawnTime;
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
|
||||
var glyphQuery = EntityQueryEnumerator<CosmicGlyphComponent>();
|
||||
while (glyphQuery.MoveNext(out var uid, out var comp))
|
||||
{
|
||||
args.PushMarkup(Loc.GetString("cosmic-examine-glyph-cultcount", ("COUNT", uid.Comp.RequiredCultists)));
|
||||
}
|
||||
else
|
||||
{
|
||||
args.PushMarkup(Loc.GetString("cosmic-examine-text-glyphs"));
|
||||
if (_timing.CurTime < comp.Timer) continue;
|
||||
if (comp.State == GlyphStatus.Spawning || comp.State == GlyphStatus.Cooldown)
|
||||
{
|
||||
_appearance.SetData(uid, GlyphVisuals.Status, GlyphStatus.Ready);
|
||||
comp.State = GlyphStatus.Ready;
|
||||
return;
|
||||
}
|
||||
if (comp.State == GlyphStatus.Active)
|
||||
{
|
||||
ActivateGlyph(new Entity<CosmicGlyphComponent>(uid, comp));
|
||||
}
|
||||
if (comp.State == GlyphStatus.Despawning)
|
||||
{
|
||||
QueueDel(uid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -50,7 +71,7 @@ public sealed class CosmicGlyphSystem : EntitySystem
|
|||
{
|
||||
var tgtpos = Transform(uid).Coordinates;
|
||||
var userCoords = Transform(args.User).Coordinates;
|
||||
if (args.Handled || !userCoords.TryDistance(EntityManager, tgtpos, out var distance) || distance > uid.Comp.ActivationRange || !_cosmicCult.EntityIsCultist(args.User))
|
||||
if (args.Handled || !userCoords.TryDistance(EntityManager, tgtpos, out var distance) || distance > uid.Comp.ActivationRange || !_cosmicCult.EntityIsCultist(args.User) || uid.Comp.State != GlyphStatus.Ready)
|
||||
return;
|
||||
var cultists = GatherCultists(uid, uid.Comp.ActivationRange);
|
||||
if (cultists.Count < uid.Comp.RequiredCultists)
|
||||
|
|
@ -59,21 +80,60 @@ public sealed class CosmicGlyphSystem : EntitySystem
|
|||
return;
|
||||
}
|
||||
|
||||
args.Handled = true;
|
||||
var tryInvokeEv = new TryActivateGlyphEvent(args.User, cultists);
|
||||
RaiseLocalEvent(uid, tryInvokeEv);
|
||||
if (tryInvokeEv.Cancelled)
|
||||
return;
|
||||
var ev = new CheckGlyphConditionsEvent(args.User, cultists);
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
if (ev.Cancelled) return;
|
||||
|
||||
var damage = uid.Comp.ActivationDamage / cultists.Count;
|
||||
args.Handled = true;
|
||||
uid.Comp.User = args.User;
|
||||
if (uid.Comp.ActivationTime > TimeSpan.FromSeconds(0))
|
||||
{
|
||||
_appearance.SetData(uid, GlyphVisuals.Status, GlyphStatus.Active);
|
||||
uid.Comp.State = GlyphStatus.Active;
|
||||
uid.Comp.Timer = _timing.CurTime + uid.Comp.ActivationTime;
|
||||
_audio.PlayPvs(uid.Comp.ChargeSFX, Transform(uid).Coordinates);
|
||||
}
|
||||
else ActivateGlyph(uid);
|
||||
}
|
||||
|
||||
private void ActivateGlyph(Entity<CosmicGlyphComponent> ent)
|
||||
{
|
||||
if (ent.Comp.EraseOnUse)
|
||||
{
|
||||
EraseGlyph(ent);
|
||||
}
|
||||
else if (ent.Comp.CooldownTime > TimeSpan.FromSeconds(0))
|
||||
{
|
||||
_appearance.SetData(ent, GlyphVisuals.Status, GlyphStatus.Cooldown);
|
||||
ent.Comp.State = GlyphStatus.Cooldown;
|
||||
ent.Comp.Timer = _timing.CurTime + ent.Comp.CooldownTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
_appearance.SetData(ent, GlyphVisuals.Status, GlyphStatus.Ready);
|
||||
ent.Comp.State = GlyphStatus.Ready;
|
||||
}
|
||||
|
||||
if (ent.Comp.User is not { } user) return;
|
||||
var cultists = GatherCultists(ent, ent.Comp.ActivationRange);
|
||||
var tryInvokeEv = new TryActivateGlyphEvent(user, cultists);
|
||||
RaiseLocalEvent(ent, ref tryInvokeEv);
|
||||
var tgtpos = Transform(ent).Coordinates;
|
||||
if (tryInvokeEv.Cancelled || cultists.Count < ent.Comp.RequiredCultists)
|
||||
{
|
||||
_audio.PlayPvs(ent.Comp.FailSFX, tgtpos);
|
||||
return;
|
||||
}
|
||||
|
||||
var damage = ent.Comp.ActivationDamage / cultists.Count;
|
||||
foreach (var cultist in cultists)
|
||||
{
|
||||
_damageable.TryChangeDamage(cultist, damage, true);
|
||||
}
|
||||
|
||||
_audio.PlayPvs(uid.Comp.GylphSFX, tgtpos, AudioParams.Default.WithVolume(+1f));
|
||||
Spawn(uid.Comp.GylphVFX, tgtpos);
|
||||
QueueDel(uid);
|
||||
_audio.PlayPvs(ent.Comp.TriggerSFX, tgtpos, AudioParams.Default.WithVolume(+1f));
|
||||
Spawn(ent.Comp.GlyphVFX, tgtpos);
|
||||
ent.Comp.User = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,14 @@
|
|||
using Content.Shared.Damage;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||
|
||||
namespace Content.Shared._DV.CosmicCult.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
[AutoGenerateComponentPause]
|
||||
public sealed partial class CosmicGlyphComponent : Component
|
||||
{
|
||||
[DataField] public int RequiredCultists = 1;
|
||||
|
|
@ -15,12 +19,51 @@ public sealed partial class CosmicGlyphComponent : Component
|
|||
/// </summary>
|
||||
[DataField] public DamageSpecifier ActivationDamage = new();
|
||||
[DataField] public bool CanBeErased = true;
|
||||
[DataField] public EntProtoId GylphVFX = "CosmicGenericVFX";
|
||||
[DataField] public SoundSpecifier GylphSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/glyph_trigger.ogg");
|
||||
[DataField] public bool EraseOnUse = false;
|
||||
[DataField] public EntProtoId GlyphVFX = "CosmicGenericVFX";
|
||||
[DataField] public SoundSpecifier TriggerSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/glyph_trigger.ogg");
|
||||
[DataField] public SoundSpecifier ChargeSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/glyph_charge.ogg");
|
||||
[DataField] public SoundSpecifier FailSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/glyph_fail.ogg");
|
||||
[DataField] public GlyphStatus State = GlyphStatus.Spawning;
|
||||
[DataField] public EntityUid? User = null;
|
||||
[DataField] public TimeSpan SpawnTime = TimeSpan.FromSeconds(1.2);
|
||||
[DataField] public TimeSpan DespawnTime = TimeSpan.FromSeconds(0.6);
|
||||
[DataField] public TimeSpan ActivationTime = TimeSpan.FromSeconds(0);
|
||||
[DataField] public TimeSpan CooldownTime = TimeSpan.FromSeconds(3.0);
|
||||
[AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
|
||||
public TimeSpan Timer = default!;
|
||||
}
|
||||
|
||||
public sealed class TryActivateGlyphEvent(EntityUid user, HashSet<Entity<CosmicCultComponent>> cultists) : CancellableEntityEventArgs
|
||||
[ByRefEvent]
|
||||
public record struct TryActivateGlyphEvent(EntityUid User, HashSet<Entity<CosmicCultComponent>> Cultists, bool Cancelled = false)
|
||||
{
|
||||
public EntityUid User = user;
|
||||
public HashSet<Entity<CosmicCultComponent>> Cultists = cultists;
|
||||
public void Cancel()
|
||||
{
|
||||
Cancelled = true;
|
||||
}
|
||||
}
|
||||
|
||||
[ByRefEvent]
|
||||
public record struct CheckGlyphConditionsEvent(EntityUid User, HashSet<Entity<CosmicCultComponent>> Cultists, bool Cancelled = false)
|
||||
{
|
||||
public void Cancel()
|
||||
{
|
||||
Cancelled = true;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum GlyphVisuals : byte
|
||||
{
|
||||
Status,
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum GlyphStatus : byte
|
||||
{
|
||||
Spawning,
|
||||
Despawning,
|
||||
Ready,
|
||||
Active,
|
||||
Cooldown
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ using Content.Shared._DV.CosmicCult.Components;
|
|||
using Content.Shared.Antag;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Ghost;
|
||||
using Content.Shared.IdentityManagement.Components;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Roles;
|
||||
using Content.Shared.Verbs;
|
||||
|
|
@ -28,10 +29,13 @@ public abstract class SharedCosmicCultSystem : EntitySystem
|
|||
SubscribeLocalEvent<CosmicCultLeadComponent, ComponentGetStateAttemptEvent>(OnCosmicCultCompGetStateAttempt);
|
||||
SubscribeLocalEvent<CosmicCultComponent, ComponentStartup>(DirtyCosmicCultComps);
|
||||
SubscribeLocalEvent<CosmicCultLeadComponent, ComponentStartup>(DirtyCosmicCultComps);
|
||||
SubscribeLocalEvent<CosmicTransmutableComponent, GetVerbsEvent<ExamineVerb>>(OnDetailedExamine);
|
||||
|
||||
SubscribeLocalEvent<CosmicTransmutableComponent, GetVerbsEvent<ExamineVerb>>(OnTransmutableExamined);
|
||||
SubscribeLocalEvent<CosmicCultExamineComponent, ExaminedEvent>(OnCosmicCultExamined);
|
||||
SubscribeLocalEvent<CosmicSubtleMarkComponent, ExaminedEvent>(OnSubtleMarkExamined);
|
||||
}
|
||||
|
||||
private void OnDetailedExamine(Entity<CosmicTransmutableComponent> ent, ref GetVerbsEvent<ExamineVerb> args)
|
||||
private void OnTransmutableExamined(Entity<CosmicTransmutableComponent> ent, ref GetVerbsEvent<ExamineVerb> args)
|
||||
{
|
||||
if (ent.Comp.TransmutesTo == "" || ent.Comp.RequiredGlyphType == "") return;
|
||||
if (!EntityIsCultist(args.User)) //non-cultists don't need to know this anyway
|
||||
|
|
@ -48,6 +52,20 @@ public abstract class SharedCosmicCultSystem : EntitySystem
|
|||
"/Textures/_DV/CosmicCult/Interface/transmute_inspect.png");
|
||||
}
|
||||
|
||||
private void OnCosmicCultExamined(Entity<CosmicCultExamineComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
args.PushMarkup(Loc.GetString(EntitySeesCult(args.Examiner) ? ent.Comp.CultistText : ent.Comp.OthersText));
|
||||
}
|
||||
|
||||
private void OnSubtleMarkExamined(Entity<CosmicSubtleMarkComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
var ev = new SeeIdentityAttemptEvent();
|
||||
RaiseLocalEvent(ent, ev);
|
||||
if (ev.TotalCoverage.HasFlag(IdentityBlockerCoverage.EYES)) return;
|
||||
|
||||
args.PushMarkup(Loc.GetString(ent.Comp.ExamineText));
|
||||
}
|
||||
|
||||
public bool EntityIsCultist(EntityUid user)
|
||||
{
|
||||
if (!_mind.TryGetMind(user, out var mind, out _))
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
using Content.Shared._DV.CosmicCult.Components;
|
||||
using Content.Shared.Examine;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._DV.CosmicCult;
|
||||
|
||||
public abstract class SharedCosmicGlyphSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SharedCosmicCultSystem _cosmicCult = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<CosmicGlyphComponent, ExaminedEvent>(OnExamine);
|
||||
}
|
||||
|
||||
private void OnExamine(Entity<CosmicGlyphComponent> uid, ref ExaminedEvent args)
|
||||
{
|
||||
if (_cosmicCult.EntityIsCultist(args.Examiner))
|
||||
{
|
||||
args.PushMarkup(Loc.GetString("cosmic-examine-glyph-cultcount", ("COUNT", uid.Comp.RequiredCultists)));
|
||||
}
|
||||
}
|
||||
|
||||
public void EraseGlyph(EntityUid ent)
|
||||
{
|
||||
if (!TryComp<CosmicGlyphComponent>(ent, out var comp)) return;
|
||||
_appearance.SetData(ent, GlyphVisuals.Status, GlyphStatus.Despawning);
|
||||
comp.State = GlyphStatus.Despawning;
|
||||
comp.Timer = _timing.CurTime + comp.DespawnTime;
|
||||
}
|
||||
}
|
||||
|
|
@ -21,6 +21,7 @@ public abstract class SharedMonumentSystem : EntitySystem
|
|||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly SharedCosmicCultSystem _cosmicCult = default!;
|
||||
[Dependency] private readonly SharedCosmicGlyphSystem _glyph = default!;
|
||||
[Dependency] private readonly SharedMapSystem _map = default!;
|
||||
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
|
||||
|
||||
|
|
@ -94,8 +95,7 @@ public abstract class SharedMonumentSystem : EntitySystem
|
|||
var localTile = _map.GetTileRef(xform.GridUid.Value, grid, xform.Coordinates);
|
||||
var targetIndices = localTile.GridIndices + new Vector2i(0, -1);
|
||||
|
||||
if (ent.Comp.CurrentGlyph is not null)
|
||||
QueueDel(ent.Comp.CurrentGlyph);
|
||||
if (ent.Comp.CurrentGlyph is { } curGlyph) _glyph.EraseGlyph(curGlyph);
|
||||
|
||||
var glyphEnt = Spawn(proto.Entity, _map.ToCenterCoordinates(xform.GridUid.Value, targetIndices, grid));
|
||||
ent.Comp.CurrentGlyph = glyphEnt;
|
||||
|
|
@ -107,8 +107,7 @@ public abstract class SharedMonumentSystem : EntitySystem
|
|||
|
||||
private void OnGlyphRemove(Entity<MonumentComponent> ent, ref GlyphRemovedMessage args)
|
||||
{
|
||||
if (ent.Comp.CurrentGlyph is not null)
|
||||
QueueDel(ent.Comp.CurrentGlyph);
|
||||
if (ent.Comp.CurrentGlyph is { } curGlyph) _glyph.EraseGlyph(curGlyph);
|
||||
|
||||
_ui.SetUiState(ent.Owner, MonumentKey.Key, new MonumentBuiState(ent.Comp));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,3 +78,10 @@
|
|||
license: "CC-BY-SA-3.0"
|
||||
copyright: "By widgetbeck for Cosmic Cult. Made using a combination of (Creative Commons 0) samples from freesound.org."
|
||||
source: "https://freesound.org/"
|
||||
|
||||
- files:
|
||||
- glyph_charge.ogg
|
||||
- glyph_fail.ogg
|
||||
license: "CC-BY-SA-3.0"
|
||||
copyright: "By NoElkaTheGod(GitHub) for Cosmic Cult. Made using a combination of (Creative Commons 0) samples from freesound.org."
|
||||
source: "https://freesound.org/"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ cult-glyph-conditions-not-met = No suitable targets within range of glyph!
|
|||
cult-glyph-too-many-targets = Too many targets present on glyph!
|
||||
cult-glyph-target-mindshield = Mental shielding prevents the glyph's influence from taking hold!
|
||||
cult-glyph-target-chaplain = A spark of divine power prevents the glyph's influence from taking hold!
|
||||
cult-glyph-target-mindless = The glyph fails to activate, as the target is currently mindless.
|
||||
|
||||
cult-glyph-name-knowledge = Pact of Knowledge
|
||||
cult-glyph-description-knowledge = Knowledge. Instills the spark of indelible knowledge. Able to convert most to join our ranks.
|
||||
|
|
|
|||
|
|
@ -19,15 +19,25 @@
|
|||
- SlipLayer
|
||||
- type: Physics
|
||||
- type: Clickable
|
||||
- type: CosmicGlyph
|
||||
- type: CosmicCultExamine
|
||||
othersText: cosmic-examine-text-glyphs
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
sprite: _DV/CosmicCult/Objects/glyph_truth.rsi
|
||||
layers:
|
||||
- state: aid
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
drawdepth: Puddles
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.GlyphVisuals.Status:
|
||||
base:
|
||||
Spawning: {state: spawning}
|
||||
Despawning: {state: despawning}
|
||||
Ready: {state: ready}
|
||||
Active: {state: active}
|
||||
Cooldown: {state: cooldown}
|
||||
- type: Appearance
|
||||
- type: InteractionOutline
|
||||
|
||||
- type: entity
|
||||
parent: CosmicGlyphBase
|
||||
|
|
@ -35,13 +45,14 @@
|
|||
name: Glyph of Truth
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
sprite: _DV/CosmicCult/Objects/glyph_truth.rsi
|
||||
layers:
|
||||
- state: truth
|
||||
drawdepth: Puddles
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
- type: CosmicGlyphConversion
|
||||
negateProtection: true
|
||||
- type: CosmicGlyph
|
||||
activationTime: 4 # To prevent people from just using the glyph the moment a target's shunt ends. Go get cuffs.
|
||||
requiredCultists: 3
|
||||
activationDamage:
|
||||
types:
|
||||
|
|
@ -55,12 +66,13 @@
|
|||
name: Glyph of Knowledge
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
sprite: _DV/CosmicCult/Objects/glyph_knowledge.rsi
|
||||
layers:
|
||||
- state: knowledge
|
||||
drawdepth: Puddles
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
- type: CosmicGlyphConversion
|
||||
- type: CosmicGlyph
|
||||
activationTime: 4 # To prevent people from just using the glyph the moment a target's shunt ends. Go get cuffs.
|
||||
requiredCultists: 2
|
||||
activationDamage:
|
||||
types:
|
||||
|
|
@ -74,10 +86,10 @@
|
|||
name: Glyph of Cessation
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyph_cessation.rsi
|
||||
layers:
|
||||
- sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
state: cessation
|
||||
drawdepth: Puddles
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
- type: CosmicGlyphTransmute
|
||||
- type: CosmicGlyph
|
||||
requiredCultists: 1
|
||||
|
|
@ -93,10 +105,10 @@
|
|||
name: Glyph of Blades
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
sprite: _DV/CosmicCult/Objects/glyph_blades.rsi
|
||||
layers:
|
||||
- state: blades
|
||||
drawdepth: Puddles
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
- type: CosmicGlyphTransmute
|
||||
- type: CosmicGlyph
|
||||
requiredCultists: 2
|
||||
|
|
@ -112,10 +124,10 @@
|
|||
name: Glyph of Warding
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
sprite: _DV/CosmicCult/Objects/glyph_warding.rsi
|
||||
layers:
|
||||
- state: warding
|
||||
drawdepth: Puddles
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
- type: CosmicGlyphTransmute
|
||||
- type: CosmicGlyph
|
||||
requiredCultists: 2
|
||||
|
|
@ -131,12 +143,13 @@
|
|||
name: Glyph of Projection
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _DV/CosmicCult/Objects/glyphs_floor.rsi
|
||||
sprite: _DV/CosmicCult/Objects/glyph_projection.rsi
|
||||
layers:
|
||||
- state: projection
|
||||
drawdepth: Puddles
|
||||
- state: spawning
|
||||
map: ["base"]
|
||||
- type: CosmicGlyphAstralProjection
|
||||
- type: CosmicGlyph
|
||||
requiredCultists: 1
|
||||
eraseOnUse: true # This is something that you may use early into the round where there aren't many cultists to hide it for you, so it erases automaticaly.
|
||||
- type: CosmicCultExamine
|
||||
cultistText: cosmic-examine-glyph-projection
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
|
@ -0,0 +1,71 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Default sprite (ready) by AftrLite (Github). Other states (spawning, despawning, cooldown) modified from the original by NoElkaTheGod (GitHub).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "ready"
|
||||
},
|
||||
{
|
||||
"name": "cooldown",
|
||||
"delays": [
|
||||
[
|
||||
1.9,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spawning",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "despawning",
|
||||
"delays": [
|
||||
[
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
60
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 807 B After Width: | Height: | Size: 807 B |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
|
@ -0,0 +1,71 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Default sprite (ready) by AftrLite (Github). Other states (spawning, despawning, cooldown) modified from the original by NoElkaTheGod (GitHub).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "ready"
|
||||
},
|
||||
{
|
||||
"name": "cooldown",
|
||||
"delays": [
|
||||
[
|
||||
1.9,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spawning",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "despawning",
|
||||
"delays": [
|
||||
[
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
60
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 728 B After Width: | Height: | Size: 728 B |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
|
@ -0,0 +1,90 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Default sprite (ready) by AftrLite (Github). Other states (spawning, despawning, cooldown, active) modified from the original by NoElkaTheGod (GitHub).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "ready"
|
||||
},
|
||||
{
|
||||
"name": "cooldown",
|
||||
"delays": [
|
||||
[
|
||||
1.9,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "active",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spawning",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "despawning",
|
||||
"delays": [
|
||||
[
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
60
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 710 B After Width: | Height: | Size: 710 B |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Default sprite (ready) by AftrLite (Github). Other states (spawning, despawning) modified from the original by NoElkaTheGod (GitHub).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "ready"
|
||||
},
|
||||
{
|
||||
"name": "spawning",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "despawning",
|
||||
"delays": [
|
||||
[
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
60
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 758 B After Width: | Height: | Size: 758 B |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
|
@ -0,0 +1,90 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Default sprite (ready) by AftrLite (Github). Other states (spawning, despawning, cooldown, active) modified from the original by NoElkaTheGod (GitHub).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "ready"
|
||||
},
|
||||
{
|
||||
"name": "cooldown",
|
||||
"delays": [
|
||||
[
|
||||
1.9,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "active",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spawning",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "despawning",
|
||||
"delays": [
|
||||
[
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
60
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 747 B After Width: | Height: | Size: 747 B |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
|
@ -0,0 +1,71 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Default sprite (ready) by AftrLite (Github). Other states (spawning, despawning, cooldown) modified from the original by NoElkaTheGod (GitHub).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "ready"
|
||||
},
|
||||
{
|
||||
"name": "cooldown",
|
||||
"delays": [
|
||||
[
|
||||
1.9,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "spawning",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
60
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "despawning",
|
||||
"delays": [
|
||||
[
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
0.05,
|
||||
60
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 811 B After Width: | Height: | Size: 811 B |
|
After Width: | Height: | Size: 3.7 KiB |
|
|
@ -1,29 +0,0 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "A custom item by AftrLite (Github).",
|
||||
"size": {
|
||||
"x": 96,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "cessation"
|
||||
},
|
||||
{
|
||||
"name": "blades"
|
||||
},
|
||||
{
|
||||
"name": "warding"
|
||||
},
|
||||
{
|
||||
"name": "knowledge"
|
||||
},
|
||||
{
|
||||
"name": "truth"
|
||||
},
|
||||
{
|
||||
"name": "projection"
|
||||
}
|
||||
]
|
||||
}
|
||||