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>
This commit is contained in:
No Elka 2025-08-20 13:18:42 +03:00 committed by GitHub
parent dd7bbb1560
commit a021394ebe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
46 changed files with 721 additions and 104 deletions

View File

@ -0,0 +1,8 @@
using Content.Shared._DV.CosmicCult;
namespace Content.Client._DV.CosmicCult;
public sealed class CosmicGlyphSystem : SharedCosmicGlyphSystem
{
}

View File

@ -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)
{

View File

@ -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);

View File

@ -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)

View File

@ -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

View File

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

View File

@ -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 _))

View File

@ -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;
}
}

View File

@ -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));
}

View File

@ -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/"

Binary file not shown.

Binary file not shown.

View File

@ -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.

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -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"
}
]
}