diff --git a/Content.Server/Anomaly/AnomalySystem.Psionics.cs b/Content.Server/Anomaly/AnomalySystem.Psionics.cs index c42eb1c58f..8aaf3aac6b 100644 --- a/Content.Server/Anomaly/AnomalySystem.Psionics.cs +++ b/Content.Server/Anomaly/AnomalySystem.Psionics.cs @@ -1,4 +1,5 @@ using Content.Server.Abilities.Psionics; +using Content.Shared._DV.CosmicCult; using Content.Shared.Anomaly; using Content.Shared.Anomaly.Components; using Robust.Shared.Random; @@ -17,6 +18,8 @@ public sealed partial class AnomalySystem //Nyano - Summary: gives dispellable behavior to Anomalies. private void OnDispelled(Entity ent, ref DispelledEvent args) { + if (HasComp(ent)) // begone nyanocode interference with cosmic cult + return; _dispel.DealDispelDamage(ent); ChangeAnomalyHealth(ent, 0 - _random.NextFloat(0.4f, 0.8f), ent.Comp); args.Handled = true; diff --git a/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicEffigySystem.cs b/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicEffigySystem.cs new file mode 100644 index 0000000000..cde7836c86 --- /dev/null +++ b/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicEffigySystem.cs @@ -0,0 +1,96 @@ +using System.Numerics; +using Content.Server.Actions; +using Content.Server.Objectives.Components; +using Content.Server.Objectives.Systems; +using Content.Server.Popups; +using Content.Shared._DV.CosmicCult; +using Content.Shared._DV.CosmicCult.Components; +using Content.Shared.Maps; +using Content.Shared.Mind; +using Content.Shared.Warps; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; + +namespace Content.Server._DV.CosmicCult.Abilities; + +public sealed class CosmicEffigySystem : EntitySystem +{ + [Dependency] private readonly ActionsSystem _actions = default!; + [Dependency] private readonly CodeConditionSystem _codeCondition = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly ITileDefinitionManager _tileDef = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnColossusEffigy); + } + + private void OnColossusEffigy(Entity ent, ref EventCosmicColossusEffigy args) + { + if (!VerifyPlacement(ent, out var pos)) + return; + + _actions.RemoveAction(ent, ent.Comp.EffigyPlaceActionEntity); + _codeCondition.SetCompleted(ent.Owner, ent.Comp.EffigyObjective); + Spawn(ent.Comp.EffigyPrototype, pos); + ent.Comp.Timed = false; + } + + private bool VerifyPlacement(Entity ent, out EntityCoordinates outPos) + { + // MAKE SURE WE'RE STANDING ON A GRID + var xform = Transform(ent); + outPos = new EntityCoordinates(); + + if (!TryComp(xform.GridUid, out var grid)) + { + _popup.PopupEntity(Loc.GetString("ghost-role-colossus-effigy-error-grid"), ent, ent); + return false; + } + + var localTile = _map.GetTileRef(xform.GridUid.Value, grid, xform.Coordinates); + var targetIndices = localTile.GridIndices + new Vector2i(0, 2); + var pos = _map.ToCenterCoordinates(xform.GridUid.Value, targetIndices, grid); + outPos = pos; + var box = new Box2(pos.Position + new Vector2(-1.4f, -0.4f), pos.Position + new Vector2(1.4f, 0.4f)); + + // CHECK IF IT'S BEING PLACED CHEESILY CLOSE TO SPACE + var spaceDistance = 2; + var worldPos = _transform.GetWorldPosition(xform); + foreach (var tile in _map.GetTilesIntersecting(xform.GridUid.Value, grid, new Circle(worldPos, spaceDistance))) + { + if (tile.IsSpace(_tileDef)) + { + _popup.PopupEntity(Loc.GetString("ghost-role-colossus-effigy-error-space", ("DISTANCE", spaceDistance)), ent, ent); + return false; + } + } + + // CHECK FOR ENTITY AND ENVIRONMENTAL INTERSECTIONS + if (_lookup.AnyLocalEntitiesIntersecting(xform.GridUid.Value, box, LookupFlags.Dynamic | LookupFlags.Static, ent)) + { + _popup.PopupEntity(Loc.GetString("ghost-role-colossus-effigy-error-intersection"), ent, ent); + return false; + } + + // IF THE OBJECTIVE OR LOCATION IS MISSING, PLACE IT ANYWHERE + if (!_mind.TryGetObjectiveComp(ent, out var obj) || obj.EffigyTarget == null) + return true; + + var targetXform = Transform(obj.EffigyTarget.Value); + if (xform.MapID != targetXform.MapID || (_transform.GetWorldPosition(xform) - _transform.GetWorldPosition(targetXform)).LengthSquared() > 15 * 15) + { + if (TryComp(obj.EffigyTarget, out var warp) && warp.Location is not null) + _popup.PopupEntity(Loc.GetString("ghost-role-colossus-effigy-error-location", ("LOCATION", warp.Location)), ent, ent); + return false; + } + + return true; + } +} diff --git a/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicHibernateSystem.cs b/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicHibernateSystem.cs new file mode 100644 index 0000000000..49b0f438e6 --- /dev/null +++ b/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicHibernateSystem.cs @@ -0,0 +1,42 @@ +using Content.Server.Popups; +using Content.Shared._DV.CosmicCult; +using Content.Shared._DV.CosmicCult.Components; +using Content.Shared.Popups; +using Content.Shared.Stunnable; +using Robust.Shared.Timing; + +namespace Content.Server._DV.CosmicCult.Abilities; + +public sealed class CosmicHibernateSystem : EntitySystem +{ + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedStunSystem _stun = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnColossusHibernate); + } + + private void OnColossusHibernate(Entity ent, ref EventCosmicColossusHibernate args) + { + if (ent.Comp.Attacking || ent.Comp.Hibernating || !_transform.AnchorEntity(ent)) + return; + args.Handled = true; + var comp = ent.Comp; + + comp.Hibernating = true; + comp.HibernationTimer = comp.HibernationWait + _timing.CurTime; + _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Action); + _appearance.SetData(ent, ColossusVisuals.Hibernation, ColossusAction.Running); + _stun.TryStun(ent, comp.HibernationWait, true); + _popup.PopupCoordinates( + Loc.GetString("ghost-role-colossus-hibernate"), + Transform(ent).Coordinates, + PopupType.LargeCaution); + } +} diff --git a/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicSunderSystem.cs b/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicSunderSystem.cs new file mode 100644 index 0000000000..930b72137d --- /dev/null +++ b/Content.Server/_DV/CosmicCult/Abilities/Colossus/CosmicSunderSystem.cs @@ -0,0 +1,37 @@ +using Content.Shared._DV.CosmicCult; +using Content.Shared._DV.CosmicCult.Components; +using Robust.Shared.Timing; + +namespace Content.Server._DV.CosmicCult.Abilities; + +public sealed class CosmicSunderSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnColossusSunder); + } + + private void OnColossusSunder(Entity ent, ref EventCosmicColossusSunder args) + { + args.Handled = true; + + var comp = ent.Comp; + _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Action); + _transform.SetCoordinates(ent, args.Target); + _transform.AnchorEntity(ent); + + comp.Attacking = true; + comp.AttackHoldTimer = comp.AttackWait + _timing.CurTime; + Spawn(comp.Attack1Vfx, args.Target); + + var detonator = Spawn(comp.TileDetonations, args.Target); + EnsureComp(detonator, out var detonateComp); + detonateComp.DetonationTimer = _timing.CurTime; + } +} diff --git a/Content.Server/_DV/CosmicCult/Abilities/CosmicConversionSystem.cs b/Content.Server/_DV/CosmicCult/Abilities/CosmicConversionSystem.cs index 08d601e9fd..6d83aa3970 100644 --- a/Content.Server/_DV/CosmicCult/Abilities/CosmicConversionSystem.cs +++ b/Content.Server/_DV/CosmicCult/Abilities/CosmicConversionSystem.cs @@ -68,14 +68,6 @@ public sealed class CosmicConversionSystem : EntitySystem _stun.TryStun(target, TimeSpan.FromSeconds(4f), false); _damageable.TryChangeDamage(target, uid.Comp.ConversionHeal * -1); _cultRule.CosmicConversion(uid, target); - var finaleQuery = EntityQueryEnumerator(); // Enumerator for The Monument's Finale - while (finaleQuery.MoveNext(out var monument, out var comp) && comp.CurrentState == FinaleState.ActiveBuffer) - { - if (comp.BufferTimer - _timing.CurTime < comp.ConversionSpeedup) // don't speed up if there's less than the speedup left. - return; - comp.BufferTimer -= comp.ConversionSpeedup; - _popup.PopupCoordinates(Loc.GetString("cosmiccult-finale-speedup"), Transform(monument).Coordinates, PopupType.Large); - } } } } diff --git a/Content.Server/_DV/CosmicCult/Abilities/CosmicGlareSystem.cs b/Content.Server/_DV/CosmicCult/Abilities/CosmicGlareSystem.cs index b81b8c9cd4..5bc1159ec2 100644 --- a/Content.Server/_DV/CosmicCult/Abilities/CosmicGlareSystem.cs +++ b/Content.Server/_DV/CosmicCult/Abilities/CosmicGlareSystem.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Server._EE.Silicon.WeldingHealable; using Content.Server.Bible.Components; using Content.Server.Flash; using Content.Server.Light.Components; @@ -7,10 +6,12 @@ using Content.Server.Light.EntitySystems; using Content.Server.Stunnable; using Content.Shared._DV.CosmicCult; using Content.Shared._DV.CosmicCult.Components; +using Content.Shared._EE.Silicon.Components; using Content.Shared.Effects; using Content.Shared.Interaction; using Content.Shared.Mobs.Components; using Content.Shared.Physics; +using Content.Shared.Silicons.Borgs.Components; using Robust.Shared.Audio.Systems; using Robust.Shared.Player; @@ -69,7 +70,7 @@ public sealed class CosmicGlareSystem : EntitySystem _flash.Flash(targetEnt, uid, args.Action, (float)uid.Comp.CosmicGlareDuration.TotalMilliseconds, uid.Comp.CosmicGlarePenalty, false, false, uid.Comp.CosmicGlareStun); - if (HasComp(targetEnt)) //This component is used exclusively by IPCs and borgs, so we use it here to target 'em specifically. + if (HasComp(targetEnt) || HasComp(targetEnt)) //For paralyzing borgs and IPCs specifically. { _stun.TryParalyze(targetEnt, uid.Comp.CosmicGlareDuration / 2, true); } diff --git a/Content.Server/_DV/CosmicCult/Abilities/CosmicIngressSystem.cs b/Content.Server/_DV/CosmicCult/Abilities/CosmicIngressSystem.cs index 86676096b9..10cd03692d 100644 --- a/Content.Server/_DV/CosmicCult/Abilities/CosmicIngressSystem.cs +++ b/Content.Server/_DV/CosmicCult/Abilities/CosmicIngressSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Doors.Systems; using Content.Shared._DV.CosmicCult; using Content.Shared._DV.CosmicCult.Components; +using Content.Shared.DoAfter; using Content.Shared.Doors.Components; using Robust.Shared.Audio.Systems; @@ -11,12 +12,16 @@ public sealed class CosmicIngressSystem : EntitySystem [Dependency] private readonly CosmicCultSystem _cult = default!; [Dependency] private readonly DoorSystem _door = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnCosmicIngress); + + SubscribeLocalEvent(OnColossusIngress); + SubscribeLocalEvent(OnColossusIngressDoAfter); } private void OnCosmicIngress(Entity uid, ref EventCosmicIngress args) @@ -33,4 +38,33 @@ public sealed class CosmicIngressSystem : EntitySystem Spawn(uid.Comp.AbsorbVFX, Transform(target).Coordinates); _cult.MalignEcho(uid); } + + private void OnColossusIngress(Entity ent, ref EventCosmicColossusIngress args) + { + var doargs = new DoAfterArgs(EntityManager, ent, ent.Comp.IngressDoAfter, new EventCosmicColossusIngressDoAfter(), ent, args.Target) + { + DistanceThreshold = 2f, + Hidden = false, + BreakOnMove = true, + }; + args.Handled = true; + _audio.PlayPvs(ent.Comp.DoAfterSfx, ent); + _doAfter.TryStartDoAfter(doargs); + } + + private void OnColossusIngressDoAfter(Entity ent, ref EventCosmicColossusIngressDoAfter args) + { + if (args.Args.Target is not { } target) + return; + if (args.Cancelled || args.Handled) + return; + args.Handled = true; + var comp = ent.Comp; + + if (TryComp(target, out var doorBolt)) + _door.SetBoltsDown((target, doorBolt), false); + _door.StartOpening(target); + _audio.PlayPvs(comp.IngressSfx, ent); + Spawn(comp.CultVfx, Transform(target).Coordinates); + } } diff --git a/Content.Server/_DV/CosmicCult/Components/CosmicConversionConditionComponent.cs b/Content.Server/_DV/CosmicCult/Components/CosmicConversionConditionComponent.cs new file mode 100644 index 0000000000..da3a8d9bbe --- /dev/null +++ b/Content.Server/_DV/CosmicCult/Components/CosmicConversionConditionComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.Objectives.Components; + +[RegisterComponent] +public sealed partial class CosmicConversionConditionComponent : Component +{ + /// + /// The amount of cultists this objective would like to be converted + /// + [DataField] + public int Converted; +} diff --git a/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs b/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs index 810f57b5f7..e297b99e2a 100644 --- a/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs +++ b/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs @@ -45,6 +45,7 @@ public sealed partial class CosmicCultRuleComponent : Component [ "MobCosmicCustodian", "MobCosmicOracle", + "MobCosmicLodestar", ]; /// @@ -62,9 +63,18 @@ public sealed partial class CosmicCultRuleComponent : Component [DataField] public HashSet Cultists = []; + /// + /// When true, prevents the wincondition state of Cosmic Cult from being changed. + /// [DataField] public bool WinLocked; + /// + /// When true, Malign Rifts are unable to spawn. + /// + [DataField] + public bool RiftStop; + [DataField] public WinType WinType = WinType.CrewMinor; diff --git a/Content.Server/_DV/CosmicCult/Components/CosmicEffigyConditionComponent.cs b/Content.Server/_DV/CosmicCult/Components/CosmicEffigyConditionComponent.cs new file mode 100644 index 0000000000..430aae8bd6 --- /dev/null +++ b/Content.Server/_DV/CosmicCult/Components/CosmicEffigyConditionComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.Objectives.Components; + +[RegisterComponent] +public sealed partial class CosmicEffigyConditionComponent : Component +{ + [DataField] + public EntityUid? EffigyTarget; +} diff --git a/Content.Server/_DV/CosmicCult/Components/CosmicFinaleComponent.cs b/Content.Server/_DV/CosmicCult/Components/CosmicFinaleComponent.cs index 81feb26787..1ee514761d 100644 --- a/Content.Server/_DV/CosmicCult/Components/CosmicFinaleComponent.cs +++ b/Content.Server/_DV/CosmicCult/Components/CosmicFinaleComponent.cs @@ -16,6 +16,12 @@ public sealed partial class CosmicFinaleComponent : Component [DataField] public bool FinaleActive = false; + /// + /// Bool used for the final announcement message at the finale's 2 minutes remaining mark. + /// + [DataField] + public bool FinaleAnnounceCheck = false; + [DataField] public bool Occupied = false; @@ -29,13 +35,10 @@ public sealed partial class CosmicFinaleComponent : Component public TimeSpan CultistsCheckTimer = default!; [DataField, AutoNetworkedField] - public TimeSpan BufferRemainingTime = TimeSpan.FromSeconds(360); + public TimeSpan FinaleRemainingTime = TimeSpan.FromSeconds(362); [DataField, AutoNetworkedField] - public TimeSpan FinaleRemainingTime = TimeSpan.FromSeconds(126); - - [DataField, AutoNetworkedField] - public TimeSpan ConversionSpeedup = TimeSpan.FromSeconds(20); + public TimeSpan VisualsThreshold = TimeSpan.FromSeconds(240); [DataField, AutoNetworkedField] public TimeSpan CheckWait = TimeSpan.FromSeconds(5); @@ -53,13 +56,10 @@ public sealed partial class CosmicFinaleComponent : Component public SoundSpecifier? SelectedSong; [DataField] - public TimeSpan InteractionTime = TimeSpan.FromSeconds(14); + public TimeSpan InteractionTime = TimeSpan.FromSeconds(30); [DataField] - public SoundSpecifier BufferMusic = new SoundPathSpecifier("/Audio/_DV/CosmicCult/premonition.ogg"); - - [DataField] - public SoundSpecifier FinaleMusic = new SoundPathSpecifier("/Audio/_DV/CosmicCult/a_new_dawn.ogg"); + public SoundSpecifier FinaleMusic = new SoundPathSpecifier("/Audio/_DV/CosmicCult/finale.ogg"); [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] public TimeSpan? SongTimer; @@ -84,9 +84,7 @@ public sealed partial class CosmicFinaleComponent : Component public enum FinaleState : byte { Unavailable, - ReadyBuffer, ReadyFinale, - ActiveBuffer, ActiveFinale, Victory, } diff --git a/Content.Server/_DV/CosmicCult/CosmicCultObjectiveSystem.cs b/Content.Server/_DV/CosmicCult/CosmicCultObjectiveSystem.cs index d9a204c8da..96a79e08c9 100644 --- a/Content.Server/_DV/CosmicCult/CosmicCultObjectiveSystem.cs +++ b/Content.Server/_DV/CosmicCult/CosmicCultObjectiveSystem.cs @@ -1,26 +1,81 @@ using Content.Server.Objectives.Components; +using Content.Shared._DV.Roles; +using Content.Shared.Ninja.Components; using Content.Shared.Objectives.Components; +using Content.Shared.Roles; +using Content.Shared.Warps; +using Robust.Shared.Random; namespace Content.Server.Objectives.Systems; public sealed class CosmicCultObjectiveSystem : EntitySystem { + [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly NumberObjectiveSystem _number = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnEffigyRequirementCheck); + SubscribeLocalEvent(OnEffigyAfterAssign); + SubscribeLocalEvent(OnGetEntropyProgress); + SubscribeLocalEvent(OnGetConversionProgress); SubscribeLocalEvent(OnGetTierProgress); SubscribeLocalEvent(OnGetVictoryProgress); } + private void OnEffigyRequirementCheck(EntityUid uid, CosmicEffigyConditionComponent comp, ref RequirementCheckEvent args) + { + if (args.Cancelled || !_roles.MindHasRole(args.MindId)) + return; + + var warps = new List(); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var warpUid, out _, out var warp)) + { + if (warp.Location != null) + { + warps.Add(warpUid); + } + } + + if (warps.Count <= 0) + { + args.Cancelled = true; + return; + } + comp.EffigyTarget = _random.Pick(warps); + } + + private void OnEffigyAfterAssign(EntityUid uid, CosmicEffigyConditionComponent comp, ref ObjectiveAfterAssignEvent args) + { + string description; + if (comp.EffigyTarget == null || !TryComp(comp.EffigyTarget, out var warp) || warp.Location == null) + { + // this should never really happen but eh + description = Loc.GetString("objective-condition-effigy-no-target"); + } + else + { + description = Loc.GetString("objective-condition-effigy", ("location", warp.Location)); + } + _metaData.SetEntityDescription(uid, description, args.Meta); + } + private void OnGetEntropyProgress(Entity ent, ref ObjectiveGetProgressEvent args) { args.Progress = Progress(ent.Comp.Siphoned, _number.GetTarget(ent.Owner)); } + private void OnGetConversionProgress(Entity ent, ref ObjectiveGetProgressEvent args) + { + args.Progress = Progress(ent.Comp.Converted, _number.GetTarget(ent.Owner)); + } + private void OnGetTierProgress(Entity ent, ref ObjectiveGetProgressEvent args) { args.Progress = Progress(ent.Comp.Tier, _number.GetTarget(ent.Owner)); diff --git a/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs b/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs index 72be32d41e..47d494e400 100644 --- a/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs +++ b/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs @@ -103,6 +103,7 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem _voteTimer = TimeSpan.FromSeconds(value), true); + Subs.CVar(_config, + DCCVars.CosmicCultStewardVoteDelayTimer, + value => _voteDelay = TimeSpan.FromSeconds(value), + true); } #region Starting Events protected override void Started(EntityUid uid, CosmicCultRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { - component.StewardVoteTimer = _timing.CurTime + TimeSpan.FromSeconds(10); + component.StewardVoteTimer = _timing.CurTime + _voteDelay; } protected override void ActiveTick(EntityUid uid, CosmicCultRuleComponent component, GameRuleComponent gameRule, float frameTime) @@ -162,13 +167,10 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem= riftTimer) + if (component.ExtraRiftTimer is { } riftTimer && _timing.CurTime >= riftTimer && !component.RiftStop) { component.ExtraRiftTimer = _timing.CurTime + _rand.Next(TimeSpan.FromSeconds(230), TimeSpan.FromSeconds(360)); //3min50 to 6min between new rifts. Seconds instead of minutes for granularity. - if (TryFindRandomTile(out var _, out var _, out var _, out var coords)) - { - Spawn("CosmicMalignRift", coords); - } + SpawnRift(); } if (component.PrepareFinaleTimer is { } finalePrepTimer && _timing.CurTime >= finalePrepTimer) { @@ -195,7 +197,7 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem(); @@ -277,7 +276,6 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem uid, ref AfterAntagEntitySelectedEvent args) { TryStartCult(args.EntityUid, uid); @@ -446,6 +452,7 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem(gameruleMonument, out var finComp)) @@ -491,6 +498,15 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem(); + while (query.MoveNext(out _, out var conversionComp)) + { + conversionComp.Converted += value; + } + } #endregion public void OnStartMonument(Entity ent) @@ -714,6 +730,7 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem(args.User)) return; // humanoids only! - if (!EntityIsCultist(args.User) && !args.Handled && ent.Comp.FinaleActive) + if (!EntityIsCultist(args.User) && !args.Handled && !ent.Comp.Occupied && ent.Comp.FinaleActive) { ent.Comp.Occupied = true; var doargs = new DoAfterArgs(EntityManager, args.User, ent.Comp.InteractionTime, new CancelFinaleDoAfterEvent(), ent, ent) @@ -37,7 +37,7 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem _doAfter.TryStartDoAfter(doargs); args.Handled = true; } - else if (EntityIsCultist(args.User) && !args.Handled && !ent.Comp.FinaleActive && ent.Comp.CurrentState != FinaleState.Unavailable) + else if (EntityIsCultist(args.User) && !args.Handled && !ent.Comp.Occupied && !ent.Comp.FinaleActive && ent.Comp.CurrentState != FinaleState.Unavailable) { ent.Comp.Occupied = true; var doargs = new DoAfterArgs(EntityManager, args.User, ent.Comp.InteractionTime, new StartFinaleDoAfterEvent(), ent, ent) @@ -70,35 +70,17 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem if (!TryComp(uid, out var monument) || !TryComp(uid, out var corruptingComp)) return; - if (uid.Comp.CurrentState == FinaleState.ReadyBuffer) - { - _corrupting.SetCorruptionTime((uid, corruptingComp), TimeSpan.FromSeconds(3)); - _appearance.SetData(uid, MonumentVisuals.FinaleReached, 2); - comp.BufferTimer = _timing.CurTime + comp.BufferRemainingTime; - comp.SelectedSong = comp.BufferMusic; - _sound.DispatchStationEventMusic(uid, comp.SelectedSong, StationEventMusicType.CosmicCult); + comp.FinaleTimer = _timing.CurTime + comp.FinaleRemainingTime; + comp.SelectedSong = comp.FinaleMusic; + uid.Comp.CurrentState = FinaleState.ActiveFinale; - _chatSystem.DispatchStationAnnouncement(uid, - Loc.GetString("cosmiccult-finale-location", ("location", indicatedLocation)), - null, false, null, - Color.FromHex("#cae8e8")); - - uid.Comp.CurrentState = FinaleState.ActiveBuffer; - } - else - { - _corrupting.SetCorruptionTime((uid, corruptingComp), TimeSpan.FromSeconds(1)); - _appearance.SetData(uid, MonumentVisuals.FinaleReached, 3); - comp.FinaleTimer = _timing.CurTime + comp.FinaleRemainingTime; - comp.SelectedSong = comp.FinaleMusic; - _sound.DispatchStationEventMusic(uid, comp.SelectedSong, StationEventMusicType.CosmicCult); - _chatSystem.DispatchStationAnnouncement(uid, - Loc.GetString("cosmiccult-finale-location", ("location", indicatedLocation)), - null, false, null, - Color.FromHex("#cae8e8")); - - uid.Comp.CurrentState = FinaleState.ActiveFinale; - } + _corrupting.SetCorruptionTime((uid, corruptingComp), TimeSpan.FromSeconds(1)); + _appearance.SetData(uid, MonumentVisuals.FinaleReached, 2); + _sound.DispatchStationEventMusic(uid, comp.SelectedSong, StationEventMusicType.CosmicCult); + _chatSystem.DispatchStationAnnouncement(uid, + Loc.GetString("cosmiccult-finale-location", ("location", indicatedLocation)), + null, false, null, + Color.FromHex("#cae8e8")); var stationUid = _station.GetStationInMap(Transform(uid).MapID); if (stationUid != null) @@ -111,6 +93,7 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem _monument.Enable((uid, monument)); comp.FinaleActive = true; + comp.FinaleAnnounceCheck = true; Dirty(uid, monument); _ui.SetUiState(uid.Owner, MonumentKey.Key, new MonumentBuiState(monument)); @@ -132,16 +115,7 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem _sound.PlayGlobalOnStation(uid, _audio.ResolveSound(comp.CancelEventSound)); _sound.StopStationEventMusic(uid, StationEventMusicType.CosmicCult); - - if (uid.Comp.CurrentState == FinaleState.ActiveBuffer) - { - uid.Comp.CurrentState = FinaleState.ReadyBuffer; - comp.BufferRemainingTime = comp.BufferTimer - _timing.CurTime + TimeSpan.FromSeconds(15); - } - else if (uid.Comp.CurrentState == FinaleState.ActiveFinale) - { - uid.Comp.CurrentState = FinaleState.ReadyFinale; - } + uid.Comp.CurrentState = FinaleState.ReadyFinale; if (TryComp(uid, out var corruptingComp)) _corrupting.SetCorruptionTime((uid, corruptingComp), TimeSpan.FromSeconds(6)); @@ -160,6 +134,7 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem _monument.Disable((uid, monument)); comp.FinaleActive = false; + comp.FinaleAnnounceCheck = false; Dirty(target, monument); _ui.SetUiState(uid.Owner, MonumentKey.Key, new MonumentBuiState(monument)); diff --git a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs index 155cfbd1ad..d308a08aac 100644 --- a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs +++ b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs @@ -2,11 +2,12 @@ using Content.Server.Antag; using Content.Server.Audio; using Content.Server.Chat.Systems; using Content.Server.Pinpointer; -using Content.Server.Polymorph.Systems; using Content.Server.Popups; using Content.Shared._DV.CosmicCult.Components; using Content.Shared.Mind; +using Content.Shared.Roles; using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -17,14 +18,18 @@ public sealed class CosmicChantrySystem : EntitySystem [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly PolymorphSystem _polymorph = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly ServerGlobalSoundSystem _sound = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; [Dependency] private readonly NavMapSystem _navMap = default!; + /// + /// Mind role to add to colossi. + /// + public static readonly EntProtoId MindRole = "MindRoleCosmicColossus"; public override void Initialize() { base.Initialize(); @@ -54,8 +59,9 @@ public sealed class CosmicChantrySystem : EntitySystem var tgtpos = Transform(uid).Coordinates; var colossus = Spawn(comp.Colossus, tgtpos); _mind.TransferTo(mindEnt, colossus); + _mind.TryAddObjective(mindEnt, mind, "CosmicFinalityObjective"); + _role.MindAddRole(mindEnt, MindRole, mind, true); _antag.SendBriefing(colossus, Loc.GetString("cosmiccult-silicon-colossus-briefing"), Color.FromHex("#4cabb3"), null); - _audio.PlayPvs(comp.SpawnSFX, tgtpos); Spawn(comp.SpawnVFX, tgtpos); QueueDel(comp.InternalVictim); QueueDel(uid); diff --git a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs index a428c8b453..66738926bc 100644 --- a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs +++ b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs @@ -1,12 +1,16 @@ -using Content.Server.Doors.Systems; +using Content.Server._DV.CosmicCult.Components; +using Content.Server.Actions; using Content.Server.Popups; -using Content.Shared._DV.CosmicCult; +using Content.Server.Station.Components; +using Content.Server.Station.Systems; using Content.Shared._DV.CosmicCult.Components; using Content.Shared.Audio; -using Content.Shared.DoAfter; -using Content.Shared.Doors.Components; +using Content.Shared.Damage; using Content.Shared.Mobs; +using Content.Shared.Mobs.Systems; using Content.Shared.Popups; +using Content.Shared.Throwing; +using Content.Shared.Warps; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics.Components; @@ -17,25 +21,24 @@ namespace Content.Server._DV.CosmicCult.EntitySystems; public sealed class CosmicColossusSystem : EntitySystem { + [Dependency] private readonly ActionsSystem _actions = default!; + [Dependency] private readonly DamageableSystem _damage = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly DoorSystem _door = default!; + [Dependency] private readonly MobThresholdSystem _threshold = default!; [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly ThrowingSystem _throw = default!; public override void Initialize() { base.Initialize(); - + SubscribeLocalEvent(OnSpawn); SubscribeLocalEvent(OnMobStateChanged); - - SubscribeLocalEvent(OnColossusIngress); - SubscribeLocalEvent(OnColossusIngressDoAfter); - SubscribeLocalEvent(OnColossusSunder); } public override void Update(float frameTime) @@ -45,75 +48,69 @@ public sealed class CosmicColossusSystem : EntitySystem var colossusQuery = EntityQueryEnumerator(); while (colossusQuery.MoveNext(out var ent, out var comp)) { - if (_timing.CurTime >= comp.AttackHoldTimer && comp.Attacking) + if (comp.Attacking && _timing.CurTime >= comp.AttackHoldTimer) { - _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Alive); _transform.Unanchor(ent); + _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Alive); + _appearance.SetData(ent, ColossusVisuals.Sunder, ColossusAction.Stopped); + _transform.Unanchor(ent); comp.Attacking = false; } + if (comp.Hibernating && _timing.CurTime >= comp.HibernationTimer) + { + _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Alive); + _appearance.SetData(ent, ColossusVisuals.Hibernation, ColossusAction.Stopped); + _transform.Unanchor(ent); + _audio.PlayPvs(comp.ReawakenSfx, ent); + comp.Hibernating = false; + Spawn(comp.CultBigVfx, Transform(ent).Coordinates); + if (!TryComp(ent, out var damageable)) + continue; + _damage.TryChangeDamage(ent, damageable.Damage / 2 * -1, true); + } + if (comp.Timed && _timing.CurTime >= comp.DeathTimer) + { + if (!_threshold.TryGetThresholdForState(ent, MobState.Dead, out var damage)) + return; + DamageSpecifier dspec = new(); + dspec.DamageDict.Add("Heat", damage.Value); + _damage.TryChangeDamage(ent, dspec, true); + } } } + private void OnSpawn(Entity ent, ref ComponentInit args) // I WANT THIS BIG GUY HURLED TOWARDS THE STATION + { + ent.Comp.DeathTimer = _timing.CurTime + ent.Comp.DeathWait; + var station = _station.GetStationInMap(Transform(ent).MapID); + if (TryComp(station, out var stationData)) + { + var stationGrid = _station.GetLargestGrid(stationData); + _throw.TryThrow(ent, Transform(stationGrid!.Value).Coordinates, baseThrowSpeed: 30, null, 0, 0, false, false, false, false, false); + } + if (ent.Comp.Timed) + _actions.AddAction(ent, ref ent.Comp.EffigyPlaceActionEntity, ent.Comp.EffigyPlaceAction, ent); + } + private void OnMobStateChanged(Entity ent, ref MobStateChangedEvent args) { if (args.NewMobState == MobState.Alive) return; if (!TryComp(ent, out var physComp)) return; + ent.Comp.Hibernating = false; + ent.Comp.Attacking = false; _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Dead); + _appearance.SetData(ent, ColossusVisuals.Hibernation, ColossusAction.Stopped); + _appearance.SetData(ent, ColossusVisuals.Sunder, ColossusAction.Stopped); _ambientSound.SetAmbience(ent, false); _audio.PlayPvs(ent.Comp.DeathSfx, ent); _physics.SetBodyStatus(ent, physComp, BodyStatus.OnGround, true); _popup.PopupCoordinates( - Loc.GetString("cosmiccult-colossus-death"), + Loc.GetString("ghost-role-colossus-death"), Transform(ent).Coordinates, PopupType.Large); RemComp(ent); - } - - private void OnColossusIngress(Entity ent, ref EventCosmicColossusIngress args) - { - var doargs = new DoAfterArgs(EntityManager, ent, ent.Comp.IngressDoAfter, new EventCosmicColossusIngressDoAfter(), ent, args.Target) - { - DistanceThreshold = 2f, - Hidden = false, - BreakOnMove = true, - }; - args.Handled = true; - _audio.PlayPvs(ent.Comp.DoAfterSfx, ent); - _doAfter.TryStartDoAfter(doargs); - } - - private void OnColossusIngressDoAfter(Entity ent, ref EventCosmicColossusIngressDoAfter args) - { - if (args.Args.Target is not { } target) - return; - if (args.Cancelled || args.Handled) - return; - args.Handled = true; - var comp = ent.Comp; - - if (TryComp(target, out var doorBolt)) - _door.SetBoltsDown((target, doorBolt), false); - _door.StartOpening(target); - _audio.PlayPvs(comp.IngressSfx, ent); - Spawn(comp.CultVfx, Transform(target).Coordinates); - } - - private void OnColossusSunder(Entity ent, ref EventCosmicColossusSunder args) - { - args.Handled = true; - - var comp = ent.Comp; - _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Attacking); - _transform.SetCoordinates(ent, args.Target); - _transform.AnchorEntity(ent); - - comp.Attacking = true; - comp.AttackHoldTimer = comp.AttackWait + _timing.CurTime; - Spawn(comp.Attack1Vfx, args.Target); - - var detonator = Spawn(comp.TileDetonations, args.Target); - EnsureComp(detonator, out var detonateComp); - detonateComp.DetonationTimer = _timing.CurTime; + RemComp(ent); + RemComp(ent); } } diff --git a/Content.Server/_DV/CosmicCult/MonumentSystem.cs b/Content.Server/_DV/CosmicCult/MonumentSystem.cs index b58adfb4ab..79744f74cd 100644 --- a/Content.Server/_DV/CosmicCult/MonumentSystem.cs +++ b/Content.Server/_DV/CosmicCult/MonumentSystem.cs @@ -10,6 +10,7 @@ using Content.Shared._DV.CCVars; using Content.Shared._DV.CosmicCult; using Content.Shared._DV.CosmicCult.Components; using Content.Shared._DV.CosmicCult.Prototypes; +using Content.Shared._DV.CustomObjectiveSummary; using Content.Shared.Audio; using Content.Shared.Damage; using Content.Shared.Interaction; @@ -53,6 +54,7 @@ public sealed class MonumentSystem : SharedMonumentSystem { base.Initialize(); + SubscribeLocalEvent(OnShuttleEvac); // for no more finale once the evac shuttle leaves SubscribeLocalEvent(OnInfuseHeldEntropy); SubscribeLocalEvent(OnInfuseEntropy); } @@ -72,6 +74,7 @@ public sealed class MonumentSystem : SharedMonumentSystem foreach (var entity in entities) _damage.TryChangeDamage(entity, monuComp.MonumentHealing * -1); monuComp.CheckTimer = _timing.CurTime + monuComp.CheckWait; } + if (comp.SongTimer is { } time && _timing.CurTime >= time) { comp.SongTimer = null; @@ -79,19 +82,14 @@ public sealed class MonumentSystem : SharedMonumentSystem _sound.DispatchStationEventMusic(uid, song, StationEventMusicType.CosmicCult); } - if (comp.CurrentState == FinaleState.ActiveBuffer && _timing.CurTime >= comp.BufferTimer) // swap everything over when buffer timer runs out + if (comp.CurrentState == FinaleState.ActiveFinale && comp.FinaleAnnounceCheck && comp.FinaleTimer - _timing.CurTime < comp.VisualsThreshold) { - comp.CurrentState = FinaleState.ActiveFinale; - comp.FinaleTimer = _timing.CurTime + comp.FinaleRemainingTime; - comp.SelectedSong = comp.FinaleMusic; - - _sound.StopStationEventMusic(uid, StationEventMusicType.CosmicCult); _appearance.SetData(uid, MonumentVisuals.FinaleReached, 3); _chatSystem.DispatchStationAnnouncement(uid, Loc.GetString("cosmiccult-announce-finale-warning"), null, false, null, Color.FromHex("#cae8e8")); - - comp.SongTimer = _timing.CurTime + TimeSpan.FromSeconds(1); + comp.FinaleAnnounceCheck = false; } - else if (comp.CurrentState == FinaleState.ActiveFinale && _timing.CurTime >= comp.FinaleTimer) // trigger wincondition on time runout + + if (comp.CurrentState == FinaleState.ActiveFinale && _timing.CurTime >= comp.FinaleTimer) // trigger wincondition on time runout { var victoryQuery = EntityQueryEnumerator(); while (victoryQuery.MoveNext(out _, out var victoryComp)) @@ -99,7 +97,6 @@ public sealed class MonumentSystem : SharedMonumentSystem victoryComp.Victory = true; } - _sound.StopStationEventMusic(uid, StationEventMusicType.CosmicCult); Spawn(CosmicGod, Transform(uid).Coordinates); comp.CurrentState = FinaleState.Victory; } @@ -126,6 +123,30 @@ public sealed class MonumentSystem : SharedMonumentSystem } } + /// + /// on shuttle evac, disable the monument's UI, disable it from being activated, and stop the finale music if it was playing + /// + private void OnShuttleEvac(EvacShuttleLeftEvent args) + { + var evacQuery = EntityQueryEnumerator(); + while (evacQuery.MoveNext(out var ent, out var monuComp, out var finaleComp)) + { + Disable((ent, monuComp)); + finaleComp.Occupied = true; + _sound.StopStationEventMusic(ent, StationEventMusicType.CosmicCult); + if (TryComp(ent, out var uiComp)) + { + if (TryComp(ent, out var uiComp2)) //close the UI for everyone who has it open + { + _ui.CloseUi((ent, uiComp2), MonumentKey.Key); + } + + uiComp.Key = null; //kazne called this the laziest way to disable a UI ever + } + } + + } + private void OnMonumentPhaseOut(Entity ent) { //todo check if anything gets messed up by doing this to the monument? @@ -441,7 +462,7 @@ public sealed class MonumentSystem : SharedMonumentSystem uiComp.Key = null; //kazne called this the laziest way to disable a UI ever } - finaleComp.CurrentState = FinaleState.ReadyBuffer; + finaleComp.CurrentState = FinaleState.ReadyFinale; uid.Comp.Enabled = false; uid.Comp.TargetProgress = uid.Comp.CurrentProgress; diff --git a/Content.Shared/_DV/CCVars/DCCVars.cs b/Content.Shared/_DV/CCVars/DCCVars.cs index fef79881dd..7fbd360958 100644 --- a/Content.Shared/_DV/CCVars/DCCVars.cs +++ b/Content.Shared/_DV/CCVars/DCCVars.cs @@ -224,7 +224,13 @@ public sealed partial class DCCVars /// How long the timer for the cult's stewardship vote lasts. /// public static readonly CVarDef CosmicCultStewardVoteTimer = - CVarDef.Create("cosmiccult.steward_vote_timer", 40, CVar.SERVER); + CVarDef.Create("cosmiccult.steward_vote_timer", 80, CVar.SERVER); + + /// + /// How long we wait before starting the stewardship vote. + /// + public static readonly CVarDef CosmicCultStewardVoteDelayTimer = + CVarDef.Create("cosmiccult.steward_vote_delay", 25, CVar.SERVER); /// /// The delay between the monument getting upgraded to tier 2 and the crew learning of that fact. the monument cannot be upgraded again in this time. @@ -242,5 +248,5 @@ public sealed partial class DCCVars /// The delay between the monument getting upgraded to tier 3 and the finale starting. /// public static readonly CVarDef CosmicCultFinaleDelaySeconds = - CVarDef.Create("cosmiccult.extra_entropy_for_finale", 120, CVar.SERVER); + CVarDef.Create("cosmiccult.extra_entropy_for_finale", 110, CVar.SERVER); } diff --git a/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs b/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs index 4745c04125..fba5cdaf1d 100644 --- a/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs +++ b/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs @@ -33,8 +33,6 @@ public sealed partial class CosmicChantryComponent : Component [DataField] public SoundSpecifier ChantryAlarm = new SoundPathSpecifier("/Audio/_DV/CosmicCult/chantry_alarm.ogg"); - [DataField] public SoundSpecifier SpawnSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/colossus_spawn.ogg"); - [DataField] public EntProtoId Colossus = "MobCosmicColossus"; [DataField] public EntProtoId SpawnVFX = "CosmicGlareAbilityVFX"; diff --git a/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs b/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs index f796ab7716..b61656b7f9 100644 --- a/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs +++ b/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs @@ -1,6 +1,5 @@ using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -17,6 +16,14 @@ public sealed partial class CosmicColossusComponent : Component [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan AttackHoldTimer = default!; + [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan HibernationTimer = default!; + + [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan DeathTimer = default!; + + [DataField] public SoundSpecifier ReawakenSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/colossus_spawn.ogg"); + [DataField] public SoundSpecifier DeathSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/colossus_death.ogg"); [DataField] public SoundSpecifier IngressSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_ingress.ogg"); @@ -25,21 +32,41 @@ public sealed partial class CosmicColossusComponent : Component [DataField] public EntProtoId CultVfx = "CosmicGenericVFX"; + [DataField] public EntProtoId CultBigVfx = "CosmicGlareAbilityVFX"; + [DataField] public EntProtoId Attack1Vfx = "CosmicColossusAttack1Vfx"; [DataField] public EntProtoId TileDetonations = "MobTileDamageZone"; - [DataField] public TimeSpan IngressDoAfter = TimeSpan.FromSeconds(7); + [DataField] public EntProtoId EffigyPrototype = "CosmicEffigy"; + + [DataField] public EntProtoId EffigyObjective = "ColossusEffigyObjective"; + + [DataField] public EntProtoId EffigyPlaceAction = "ActionCosmicColossusEffigy"; + + [DataField] public EntityUid? EffigyPlaceActionEntity; + + [DataField] public TimeSpan IngressDoAfter = TimeSpan.FromSeconds(4); [DataField] public TimeSpan AttackWait = TimeSpan.FromSeconds(1.5); + [DataField] public TimeSpan HibernationWait = TimeSpan.FromSeconds(20); + + [DataField] public TimeSpan DeathWait = TimeSpan.FromMinutes(15); + [DataField] public bool Attacking; + + [DataField] public bool Hibernating; + + [DataField] public bool Timed; } [Serializable, NetSerializable] public enum ColossusVisuals : byte { Status, + Hibernation, + Sunder, } [Serializable, NetSerializable] @@ -47,5 +74,12 @@ public enum ColossusStatus : byte { Alive, Dead, - Attacking, + Action, +} + +[Serializable, NetSerializable] +public enum ColossusAction : byte +{ + Running, + Stopped, } diff --git a/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs b/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs index 31f79edb1f..6f13987752 100644 --- a/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs +++ b/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs @@ -20,3 +20,5 @@ public sealed partial class EventCosmicFragmentation : EntityTargetActionEvent; // COLOSSUS ACTIONS public sealed partial class EventCosmicColossusSunder : WorldTargetActionEvent; public sealed partial class EventCosmicColossusIngress : EntityTargetActionEvent; +public sealed partial class EventCosmicColossusHibernate : InstantActionEvent; +public sealed partial class EventCosmicColossusEffigy : InstantActionEvent; diff --git a/Content.Shared/_DV/Roles/CosmicColossusRoleComponent.cs b/Content.Shared/_DV/Roles/CosmicColossusRoleComponent.cs new file mode 100644 index 0000000000..fb972a37b7 --- /dev/null +++ b/Content.Shared/_DV/Roles/CosmicColossusRoleComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Roles; + +namespace Content.Shared._DV.Roles; + +/// +/// Added to mind role entities to tag that they are using the cosmic colossus systems. +/// +[RegisterComponent] +public sealed partial class CosmicColossusRoleComponent : BaseMindRoleComponent; diff --git a/Resources/Audio/_DV/CosmicCult/attributions.yml b/Resources/Audio/_DV/CosmicCult/attributions.yml index 4bc4fbc969..ddc167fc0d 100644 --- a/Resources/Audio/_DV/CosmicCult/attributions.yml +++ b/Resources/Audio/_DV/CosmicCult/attributions.yml @@ -9,6 +9,7 @@ - files: - a_new_dawn.ogg - premonition.ogg + - finale.ogg license: "CC-BY-SA-3.0" copyright: "Custom music composed by Nahu Pyrope for Cosmic Cult." source: "https://linktr.ee/nahupyrope" @@ -20,6 +21,7 @@ - insert_entropy.ogg - tier2.ogg - tier3.ogg + - tile_detonate.ogg - spire_draining.ogg - monument_spawn.ogg - monument_relocation.ogg @@ -27,6 +29,9 @@ - god_spawn.ogg - god_ambient.ogg - glyph_trigger.ogg + - effigy_supercritical.ogg + - effigy_pulse.ogg + - effigy_ambience.ogg - door_open.ogg - door_close.ogg - chantry_alarm.ogg @@ -64,3 +69,12 @@ license: "CC-BY-SA-3.0" copyright: "By widgetbeck & AftrLite(GitHub) for Cosmic Cult. Made using a combination of (Creative Commons 0) samples from freesound.org and personally-recorded foley." source: "https://freesound.org/" + +- files: + - colossus_ask.ogg + - colossus_exclaim.ogg + - colossus_say.ogg + - colossus_scream.ogg + 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/" diff --git a/Resources/Audio/_DV/CosmicCult/colossus_ask.ogg b/Resources/Audio/_DV/CosmicCult/colossus_ask.ogg new file mode 100644 index 0000000000..d46888bde3 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/colossus_ask.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/colossus_death.ogg b/Resources/Audio/_DV/CosmicCult/colossus_death.ogg index e438813b7a..fe3e60ba9b 100644 Binary files a/Resources/Audio/_DV/CosmicCult/colossus_death.ogg and b/Resources/Audio/_DV/CosmicCult/colossus_death.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/colossus_exclaim.ogg b/Resources/Audio/_DV/CosmicCult/colossus_exclaim.ogg new file mode 100644 index 0000000000..b75a1c4fad Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/colossus_exclaim.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/colossus_say.ogg b/Resources/Audio/_DV/CosmicCult/colossus_say.ogg new file mode 100644 index 0000000000..3e76ddeea7 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/colossus_say.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/colossus_scream.ogg b/Resources/Audio/_DV/CosmicCult/colossus_scream.ogg new file mode 100644 index 0000000000..f6548d454f Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/colossus_scream.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/effigy_ambience.ogg b/Resources/Audio/_DV/CosmicCult/effigy_ambience.ogg new file mode 100644 index 0000000000..510bf1b307 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/effigy_ambience.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/effigy_pulse.ogg b/Resources/Audio/_DV/CosmicCult/effigy_pulse.ogg new file mode 100644 index 0000000000..cbd523183f Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/effigy_pulse.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/effigy_supercritical.ogg b/Resources/Audio/_DV/CosmicCult/effigy_supercritical.ogg new file mode 100644 index 0000000000..2f1fa5feb5 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/effigy_supercritical.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/finale.ogg b/Resources/Audio/_DV/CosmicCult/finale.ogg new file mode 100644 index 0000000000..63e0b989d3 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/finale.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg b/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg index 69235e3e04..bf71405941 100644 Binary files a/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg and b/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg differ diff --git a/Resources/Locale/en-US/_DV/abilities/psionic.ftl b/Resources/Locale/en-US/_DV/abilities/psionic.ftl index 8d6ab75038..e2328fd494 100644 --- a/Resources/Locale/en-US/_DV/abilities/psionic.ftl +++ b/Resources/Locale/en-US/_DV/abilities/psionic.ftl @@ -17,6 +17,7 @@ psionic-power-precognition-bureaucratic-error-result-message = You see a vision psionic-power-precognition-clerical-error-result-message = You see faces you once knew being obscured in a fog of static, identities lost. psionic-power-precognition-closet-skeleton-result-message = You hear a crackling laugh echo and clinking bones in the dusty recesses of the station. psionic-power-precognition-dragon-spawn-result-message = Reality around you bulges and breaks as a great beast cries for war. The smell of salty sea and blood fills the air. +psionic-power-precognition-colossus-spawn-result-message = You see the vast shadow of a monstrosity so large that it casts all beneath it into darkness. The noƶsphere shifts precariously in its wake. psionic-power-precognition-ninja-spawn-result-message = You see a vision of shadows brought to life, hounds of war howling their cries as they chase it through dark corners of the station. psionic-power-precognition-revenant-spawn-result-message = The shadows around you grow threefold taller and threefold darker. Something lurks within them, a predator stalking you in the darkness. psionic-power-precognition-gas-leak-result-message = For but a moment, it feels as if you cannot breathe. With a blink, everything returns to normal. diff --git a/Resources/Locale/en-US/_DV/cosmiccult/colossus-names.ftl b/Resources/Locale/en-US/_DV/cosmiccult/colossus-names.ftl index e332df665e..f8bd709fc9 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/colossus-names.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/colossus-names.ftl @@ -13,5 +13,6 @@ cosmiccolossus-titles-lone-dataset-1 = Herculean cosmiccolossus-titles-lone-dataset-2 = Mythical cosmiccolossus-titles-lone-dataset-3 = Apocryphal cosmiccolossus-titles-lone-dataset-4 = Gargantuan +cosmiccolossus-titles-lone-dataset-5 = Monumental name-format-colossus = {$part0}, {$part1} diff --git a/Resources/Locale/en-US/_DV/cosmiccult/examine.ftl b/Resources/Locale/en-US/_DV/cosmiccult/examine.ftl index 89f5b1c8b3..a0a7b7266d 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/examine.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/examine.ftl @@ -8,11 +8,13 @@ cosmic-examine-text-abilitylapse = [color=#4cabb3]They look like they're seeing cosmic-examine-text-malignecho = [color=#4cabb3]An echo in the membrane of realspace — it appears to be fading quickly. Something is amiss aboard the station![/color] cosmic-examine-text-imposition = [color=#4cabb3]A barrier of astral power wards them from injury![/color] cosmic-examine-text-chantry = [color=#4cabb3]You get the horrific feeling that there's somebody trapped inside![/color] +cosmic-examine-text-effigy = [color=#4cabb3]It radiates unstable anomalous energy![/color] cosmic-examine-text-god = [color=#4cabb3]the end is the end is the end is the end is the end is the end is the end is the end is the end is the end is[/color] ## CULTIST EXAMINES cosmic-examine-text-forthecult = [color=#4cabb3]This is our doing. As things should be.[/color] cosmic-examine-text-cultentity = [color=#4cabb3]A powerful ally.[/color] +cosmic-examine-text-culteffigy = [color=#4cabb3]This may prove useful.[/color] ## GLYPH EXAMINES cosmic-examine-glyph-cultcount = {$COUNT -> diff --git a/Resources/Locale/en-US/_DV/cosmiccult/ghostroles.ftl b/Resources/Locale/en-US/_DV/cosmiccult/ghostroles.ftl index 1bd137d6a7..7273d5dc86 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/ghostroles.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/ghostroles.ftl @@ -1,3 +1,46 @@ +# THE UNKNOWN + ghost-role-information-theunknown-name = The Unknown ghost-role-information-theunknown-description = The Cosmic Cult has won. An fragment of cosmic power extrudes into realspace. ghost-role-information-theunknown-rules = ... + +# COLOSSUS + +ghost-role-information-colossus-name = Entropic Colossus +ghost-role-information-colossus-description = Call upon an Effigy of Entropy to perpetuate your existence and accelerate the end of all things! You have 15 minutes to do so or your energies will be extinguished. +ghost-role-information-colossus-rules = You are a [color={role-type-team-antagonist-color}][bold]{role-type-team-antagonist-name}[/bold][/color] with any cosmic cultists that may be present. + +terror-colossus = Attention crew, it appears that someone on your station has drawn the attention of an enormous malign anomaly. + +ghost-role-colossus-charactermenu = You must usher in the end of all things. Wreak untold havoc upon all before you. +ghost-role-colossus-objective = Call forth an Effigy of Entropy and persist until the end of all things. +ghost-role-colossus-briefing = + You are an Entropic Colossus! + Your objectives are listed in the character menu. + Read more about your role in the guidebook entry. + +ghost-role-colossus-death = The colossus collapses, its light extinguished. +ghost-role-colossus-hibernate = The colossus begins drawing in energy! +ghost-role-colossus-effigy-confirm = If placement is valid, press again to Beckon an Effigy. + +ghost-role-colossus-effigy-error-grid = Invalid location! An Effigy must be beckoned upon a stable surface. +ghost-role-colossus-effigy-error-location = Invalid location! The Effigy must be beckoned near {$LOCATION}. +ghost-role-colossus-effigy-error-intersection = Too crowded! An Effigy requires an empty 3x1 area to be beckoned. +ghost-role-colossus-effigy-error-space = Too close to space! An Effigy must be be at least {$DISTANCE}m away. + +objective-condition-effigy-no-target = Beckon an Effigy wherever you desire. +objective-condition-effigy = Beckon an Effigy near "{$location}". + +# MINDSINK (Positronic Brain) + +ghost-role-mindsink-installed = Whispers hum from its surface! +ghost-role-mindsink-off = It lies dormant. +ghost-role-mindsink-still-searching = It is drawing upon the noƶsphere... +ghost-role-mindsink-searching = It has started drawing upon the noƶsphere... +ghost-role-mindsink-role-name = Malign Mindsink +ghost-role-mindsink-role-description = Serve the station crew, despite your unusual origins. +ghost-role-mindsink-wipe-device-verb-text = Erase Mind +ghost-role-mindsink-wiped-device = The mind was snuffed out. +ghost-role-mindsink-stop-searching-verb-text = Stop Seeking +ghost-role-mindsink-stopped-searching = Noƶspheric resonance halted. +ghost-role-mindsink-slot-component-slot-name-brain = Brain diff --git a/Resources/Locale/en-US/_DV/cosmiccult/guides.ftl b/Resources/Locale/en-US/_DV/cosmiccult/guides.ftl index 469624d907..49ec8da3c9 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/guides.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/guides.ftl @@ -2,3 +2,5 @@ guide-entry-cosmiccult = Cosmic Cult guide-entry-cosmiccult-monument = The Monument guide-entry-cosmiccult-influences = Influences guide-entry-cosmiccult-deconversion = Deconversion + +guide-entry-cosmiccolossus = Entropic Colossus diff --git a/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl b/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl index cedf286d3a..2cdc415c9e 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl @@ -18,7 +18,7 @@ cosmiccult-vote-steward-briefing = Ensure that The Monument is placed in a secure location, and organize the cult to ensure your collective victory. You are not permitted to instruct cultists on how to use or spend their Entropy. -cosmiccult-finale-autocall-briefing = The Monument activates {$minutesandseconds}! Gather yourselves, and prepare for the end. +cosmiccult-finale-autocall-briefing = The Monument activates in {$minutesandseconds}! Gather yourselves, and prepare for the end. cosmiccult-finale-ready = A terrifying light surges forth from The Monument! cosmiccult-finale-speedup = The beckoning quickens! Energy surges through the surroundings... @@ -123,11 +123,10 @@ cosmiccult-rift-absorb = {$NAME} absorbs the rift, and malign light empowers the cosmiccult-rift-purge = {$NAME} purges the malign rift from reality! -## COLOSSUS & CHANTRY +## CHANTRY cosmiccult-chantry-location = A dangerous increase in Ī›-CDM has been detected {$location}! Intercept and intervene immediately. cosmiccult-chantry-powerup = The vacuous chantry flares to life! -cosmiccult-colossus-death = The colossus collapses, its light extinguished. ## UI / BASE POPUP @@ -163,6 +162,8 @@ objective-issuer-cosmiccult = [bold][color=#cae8e8]The Unknown[/color][/bold] objective-cosmiccult-charactermenu = You must usher in the end of all things. Complete your tasks to advance the cult's progress. objective-cosmiccult-steward-charactermenu = You must direct the cult to usher in the end of all things. Oversee and ensure the cult's progress. +objective-condition-conversion-title = CONVERT CREW +objective-condition-conversion-desc = Collectively bring at least {$count} crew into the fold. objective-condition-entropy-title = SIPHON ENTROPY objective-condition-entropy-desc = Collectively siphon at least {$count} entropy from the crew. objective-condition-culttier-title = EMPOWER THE MONUMENT diff --git a/Resources/Locale/en-US/_DV/cosmiccult/roles.ftl b/Resources/Locale/en-US/_DV/cosmiccult/roles.ftl index 2f81b0fd45..0319ee73ae 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/roles.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/roles.ftl @@ -1,2 +1,2 @@ role-subtype-cultist = Cultist -role-subtype-rogue-ascended = Rogue Ascended +role-subtype-colossus = Colossus diff --git a/Resources/Prototypes/Damage/containers.yml b/Resources/Prototypes/Damage/containers.yml index 9b90248e3d..962ef1339e 100644 --- a/Resources/Prototypes/Damage/containers.yml +++ b/Resources/Prototypes/Damage/containers.yml @@ -72,3 +72,10 @@ - Airloss - Genetic - Metaphysical + +- type: damageContainer # DeltaV edits begin + id: InorganicMetaphysical + supportedGroups: + - Brute + - Burn + - Metaphysical # DeltaV edits end diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index a133434a4d..4feb042d44 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -9,7 +9,7 @@ components: - type: HumanoidAppearance species: Skeleton - - type: Carriable # Carrying system from nyanotrasen. + - type: Carriable # Carrying system from nyanotrasen. - type: Icon sprite: Mobs/Species/Skeleton/parts.rsi state: full @@ -18,7 +18,7 @@ requiredLegs: 2 gibSound: /Audio/Effects/bone_rattle.ogg - type: Damageable - damageContainer: BiologicalMetaphysical # DeltaV + damageContainer: InorganicMetaphysical # DeltaV damageModifierSet: Skeleton - type: DamageVisuals damageOverlayGroups: diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 84cb47fd9c..7df49c3b3a 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -35,6 +35,7 @@ tableId: BasicAntagEventsTableDeltaV - id: ClosetSkeleton - id: DragonSpawn + - id: ColossusSpawn # DeltaV #- id: KingRatMigration # DeltaV - disabled - id: NinjaSpawn - id: ParadoxCloneSpawn diff --git a/Resources/Prototypes/Guidebook/antagonist.yml b/Resources/Prototypes/Guidebook/antagonist.yml index a416e6540b..3ccbbc1747 100644 --- a/Resources/Prototypes/Guidebook/antagonist.yml +++ b/Resources/Prototypes/Guidebook/antagonist.yml @@ -6,6 +6,7 @@ - Traitors - Thieves - CosmicCult # DeltaV - Cosmic Cult + - CosmicColossus # DeltaV - Entropic Colossus - Revolutionaries - NuclearOperatives - SpaceNinja diff --git a/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml b/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml index 7decdc88ee..1143fbdc3b 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml @@ -199,7 +199,7 @@ description: Warp to the target location and unleash a cascading detonation of malign energy. components: - type: WorldTargetAction - useDelay: 20 + useDelay: 18 range: 7 itemIconStyle: NoItem icon: @@ -213,7 +213,7 @@ description: Use your colossal strength to force open a doorway. components: - type: EntityTargetAction - useDelay: 10 + useDelay: 8 range: 2 whitelist: components: @@ -223,3 +223,32 @@ sprite: _DV/CosmicCult/Icons/cosmiccult_abilities.rsi state: ingress event: !type:EventCosmicColossusIngress + +- type: entity + id: ActionCosmicColossusHibernate + name: Slumber Shell + description: Slumber your body for a period of time to regenerate integrity. Must be done on stable ground. + components: + - type: LimitedCharges + maxCharges: 2 + - type: InstantAction + useDelay: 120 + checkCanInteract: false + itemIconStyle: NoItem + icon: + sprite: _DV/CosmicCult/Icons/cosmiccult_abilities.rsi + state: slumber + event: !type:EventCosmicColossusHibernate {} + +- type: entity + id: ActionCosmicColossusEffigy + name: Beckon an Effigy + description: Draw out an Effigy of Entropy into realspace. + components: + - type: InstantAction + useDelay: 999 + itemIconStyle: NoItem + icon: + sprite: _DV/CosmicCult/Icons/cosmiccult_abilities.rsi + state: nova + event: !type:EventCosmicColossusEffigy {} diff --git a/Resources/Prototypes/_DV/CosmicCult/Clothing/cosmiccult_armor.yml b/Resources/Prototypes/_DV/CosmicCult/Clothing/cosmiccult_armor.yml index a0477c816d..33ffddc277 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Clothing/cosmiccult_armor.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Clothing/cosmiccult_armor.yml @@ -82,7 +82,8 @@ - type: BatterySelfRecharger autoRecharge: true autoRechargeRate: 5 - + - type: TypingIndicatorClothing + proto: CosmicTyping # COSMIC CULT HARDSUIT HELMET - type: entity diff --git a/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml b/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml index 272454504f..6e1629f387 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml @@ -41,9 +41,9 @@ - type: TimedDespawn lifetime: 0.5 - type: Transform - noRot: true anchored: true - type: Sprite + snapCardinals: true layers: - sprite: _DV/CosmicCult/Effects/tile_spawn.rsi state: floorglow @@ -357,9 +357,11 @@ components: - type: Transform anchored: true + noRot: true - type: TimedDespawn lifetime: 1.5 - type: Sprite + snapCardinals: true layers: - sprite: _DV/CosmicCult/Effects/colossus_attack.rsi state: attack1 diff --git a/Resources/Prototypes/_DV/CosmicCult/Guidebook/antagonist.yml b/Resources/Prototypes/_DV/CosmicCult/Guidebook/antagonist.yml index cc9483412a..7ab8a6aa1b 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Guidebook/antagonist.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Guidebook/antagonist.yml @@ -21,3 +21,8 @@ id: CosmicCultDeconversion name: guide-entry-cosmiccult-deconversion text: "/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultDeconversion.xml" + +- type: guideEntry + id: CosmicColossus + name: guide-entry-cosmiccolossus + text: "/ServerInfo/_DV/Guidebook/Antagonist/CosmicColossus.xml" diff --git a/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml b/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml index b7b9cf9bc2..d210557d00 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml @@ -63,7 +63,7 @@ layer: 2 #ghost vis layer - type: entity - parent: [ BaseSimpleMob, FlyingMobBase ] + parent: [ BaseSimpleMob ] id: MobCosmicAstralAscended name: astral ascended description: Transcendant, ascendant. @@ -92,13 +92,18 @@ shader: unshaded - state: ascended-body shader: unshaded + - type: Physics + bodyStatus: InAir - type: NoSlip + - type: CanMoveInAir - type: Eye drawFov: true - type: ContentEye maxZoom: 1.2, 1.2 - type: Speech speechVerb: Ghost + - type: TypingIndicator + proto: CosmicTyping - type: PointLight color: "#42a4ae" radius: 2 @@ -122,7 +127,7 @@ parent: MobCosmicAstralAscended id: MobCosmicCustodian name: malign custodian - description: Twisted beyond recognition. + description: An abomination wrought of malign mass. It floats with a weightless, unnerving grace. components: - type: MovementSpeedModifier baseWalkSpeed: 3 @@ -131,15 +136,25 @@ - type: Sprite sprite: _DV/CosmicCult/Mobs/custodian.rsi layers: - - state: custodian - - state: custodian_unshaded + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: custodian + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] + state: custodian_unshaded shader: unshaded + - type: DamageStateVisuals + states: + Alive: + Base: custodian + BaseUnshaded: custodian_unshaded + Dead: + Base: dead + BaseUnshaded: dead_unshaded - type: entity parent: MobCosmicAstralAscended id: MobCosmicOracle name: malign oracle - description: Twisted beyond recognition. + description: An abomination wrought of malign mass. Its gaze seeks relentlessly. components: - type: MovementSpeedModifier baseWalkSpeed: 3 @@ -148,6 +163,39 @@ - type: Sprite sprite: _DV/CosmicCult/Mobs/oracle.rsi layers: - - state: oracle - - state: oracle_unshaded + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: oracle + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] + state: oracle_unshaded shader: unshaded + - type: DamageStateVisuals + states: + Alive: + Base: oracle + BaseUnshaded: oracle_unshaded + Dead: + Base: dead + BaseUnshaded: dead_unshaded + +- type: entity + parent: MobCosmicAstralAscended + id: MobCosmicLodestar + name: malign lodestar + description: An abomination wrought of malign mass. A searing light glimmers within. + components: + - type: Sprite + sprite: _DV/CosmicCult/Mobs/lodestar.rsi + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: lodestar + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] + state: lodestar_unshaded + shader: unshaded + - type: DamageStateVisuals + states: + Alive: + Base: lodestar + BaseUnshaded: lodestar_unshaded + Dead: + Base: dead + BaseUnshaded: dead_unshaded diff --git a/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml b/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml index d7d6807c30..b036eb080a 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml @@ -1,17 +1,11 @@ - type: entity parent: [ BaseSimpleMob, FlyingMobBase ] - id: MobCosmicColossus + abstract: true + id: MobCosmicColossusBase name: entropic colossus description: A colossal monstrosity of malign plating and dendritic infestation. components: - type: FTLSmashImmune - - type: BodyEmotes - - type: RandomMetadata - nameSegments: - - ColossusNames - - ColossusTitlesBase - nameFormat: name-format-colossus - - type: CosmicColossus - type: CosmicCultExamine cultistText: cosmic-examine-text-cultentity othersText: cosmic-examine-text-entities @@ -35,6 +29,10 @@ shader: unshaded visible: false map: ["attack"] + - state: hibernate + shader: unshaded + visible: false + map: ["hibernating"] - type: Appearance - type: GenericVisualizer visuals: @@ -42,23 +40,32 @@ underlay: Alive: { visible: true } Dead: { visible: false } - Attacking: { visible: false } + Action: { visible: false } base: Alive: { visible: true } Dead: { visible: false } - Attacking: { visible: false } + Action: { visible: false } corpse: Alive: { visible: false } Dead: { visible: true } - Attacking: { visible: false } + Action: { visible: false } overlay: Alive: { visible: true } Dead: { visible: false } - Attacking: { visible: false } + Action: { visible: false } attack: Alive: { visible: false } Dead: { visible: false } - Attacking: { visible: true } + Action: { visible: true } + enum.ColossusVisuals.Hibernation: + hibernating: + Running: { visible: true } + Stopped: { visible: false } + enum.ColossusVisuals.Sunder: + sunder: + Running: { visible: true } + Stopped: { visible: false } + - type: Physics bodyType: KinematicController - type: Fixtures @@ -75,13 +82,14 @@ - type: WarpPoint follow: true - type: Body - prototype: Animal + requiredLegs: 0 + - type: Emoting - type: Speech - speechSounds: Bass + speechSounds: ColossusSpeech speechVerb: Robotic allowedEmotes: [] - type: TypingIndicator - proto: robot + proto: CosmicTyping - type: Grammar attributes: proper: true @@ -90,11 +98,17 @@ - type: MovementSpeedModifier baseWalkSpeed: 2 baseSprintSpeed: 3 + baseWeightlessModifier: 1 + weightlessAcceleration: 1.5 + weightlessFriction: 1 - type: AmbientSound volume: +8 range: 18 sound: path: /Audio/_DV/CosmicCult/colossus_ambience.ogg + - type: EmitSoundOnSpawn + sound: + path: /Audio/_DV/CosmicCult/colossus_spawn.ogg - type: Tag tags: - CannotSuicide @@ -103,16 +117,33 @@ - type: Damageable damageContainer: StructuralInorganic damageModifierSet: Metallic + - type: Bloodstream + bloodMaxVolume: 650 + maxBleedAmount: 0.1 + bleedReductionAmount: 0.1 + bloodReagent: Entropy + bloodlossDamage: + types: + Bloodloss: + 0 + bloodlossHealDamage: + types: + Bloodloss: + 0 - type: MobState - - type: MobThresholds - thresholds: - 0: Alive - 500: Dead + allowedStates: + - Alive + - Dead + - type: Butcherable + butcherDelay: 16 + spawned: + - id: CosmicCultMindSink + amount: 1 - type: PointLight color: "#42a4ae" radius: 4 energy: 4 - softness: 1 + castShadows: true - type: LightBehaviour behaviours: - !type:FadeBehaviour @@ -125,9 +156,12 @@ enabled: true isLooped: true reverseWhenFinished: true + - type: ContentEye + maxZoom: 1.2, 1.2 - type: StatusEffects allowed: - Stutter + - Stun - type: IntrinsicRadioReceiver - type: IntrinsicRadioTransmitter channels: @@ -148,17 +182,18 @@ type: SiliconLawBoundUserInterface requireInputValidation: false - type: SiliconLawBound - - type: ActionGrant - actions: - - ActionViewLaws - - ActionCosmicColossusSunder - - ActionCosmicColossusIngress - type: SiliconLawProvider laws: CosmicCultLaws - type: NoSlip - type: Puller needsHands: false - type: CombatMode + - type: ActionGrant + actions: + - ActionViewLaws + - ActionCosmicColossusSunder + - ActionCosmicColossusIngress + - ActionCosmicColossusHibernate - type: MeleeWeapon altDisarm: false animation: WeaponArcCosmic @@ -191,6 +226,63 @@ params: variation: 0.2 volume: -6 + - type: GhostRole + name: ghost-role-information-colossus-name + description: ghost-role-information-colossus-description + rules: ghost-role-information-colossus-rules + mindRoles: + - MindRoleCosmicColossus + raffle: + settings: default + - type: GhostTakeoverAvailable + - type: GuideHelp + guides: + - CosmicColossus + +- type: entity + parent: [ MobCosmicColossusBase ] + categories: [ HideSpawnMenu ] + id: MobCosmicColossusLone + suffix: MidRoundAntag + description: An ancient monstrosity of malign plating and dendritic infestation. + components: + - type: RandomMetadata + nameSegments: + - ColossusNames + - ColossusTitlesLone + nameFormat: name-format-colossus + - type: MobThresholds + thresholds: + 0: Alive + 450: Dead + - type: CosmicCorrupting + mobile: true + autoDisable: false + corruptionReduction: 0 + +- type: entity + parent: [ MobCosmicColossusBase ] + id: MobCosmicColossus + components: + - type: RandomMetadata + nameSegments: + - ColossusNames + - ColossusTitlesBase + nameFormat: name-format-colossus + - type: MobThresholds + thresholds: + 0: Alive + 400: Dead + - type: CosmicColossus + +- type: speechSounds + id: ColossusSpeech + saySound: + path: /Audio/_DV/CosmicCult/colossus_say.ogg + askSound: + path: /Audio/_DV/CosmicCult/colossus_ask.ogg + exclaimSound: + path: /Audio/_DV/CosmicCult/colossus_exclaim.ogg - type: entity categories: [ HideSpawnMenu ] @@ -221,6 +313,7 @@ - type: Transform anchored: true - type: Sprite + snapCardinals: true sprite: _DV/CosmicCult/Effects/tile_attacks.rsi offset: 0,0.27 layers: @@ -241,12 +334,14 @@ - Wall components: - type: Sprite + snapCardinals: true sprite: _DV/CosmicCult/Effects/tile_attacks.rsi offset: 0,0.27 layers: - state: tiledamage_end shader: unshaded - type: Transform + noRot: true anchored: true - type: TimedDespawn lifetime: 1 @@ -269,8 +364,6 @@ intersectRatio: 0.1 ignoreWeightless: true blacklist: - components: - - CosmicCult tags: - Catwalk - type: TileEntityEffect @@ -278,4 +371,4 @@ - !type:HealthChange damage: types: - Cold: 10 + Cold: 12.5 diff --git a/Resources/Prototypes/_DV/CosmicCult/Mobs/hostiles.yml b/Resources/Prototypes/_DV/CosmicCult/Mobs/hostiles.yml new file mode 100644 index 0000000000..2558b53252 --- /dev/null +++ b/Resources/Prototypes/_DV/CosmicCult/Mobs/hostiles.yml @@ -0,0 +1,149 @@ +- type: entity + parent: [ BaseSimpleMob, FlyingMobBase ] + id: BaseMobCosmicHostile + suffix: Hostile + abstract: true + components: + - type: MovementSpeedModifier + baseWalkSpeed: 3 + baseSprintSpeed: 3 + weightlessModifier: 1 + - type: HTN + rootTask: + task: SimpleHostileCompound + blackboard: + NavClimb: !type:Bool + true + NavSmash: !type:Bool + true + - type: NpcFactionMember + factions: + - SimpleHostile + - type: Tag + tags: + - DoorBumpOpener + - type: MobState + allowedStates: + - Alive + - Dead + - type: MobThresholds + thresholds: + 0: Alive + 50: Dead + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 70 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + CosmicLapseAbilityVFX: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + path: /Audio/_DV/CosmicCult/ability_lapse.ogg + - type: Bloodstream + bloodMaxVolume: 100 + maxBleedAmount: 10.75 + bleedReductionAmount: 0.1 + bloodReagent: Entropy + bloodlossDamage: + types: + Bloodloss: + 0 + bloodlossHealDamage: + types: + Bloodloss: + 0 + - type: CombatMode + - type: MeleeWeapon + altDisarm: false + animation: WeaponArcCosmic + damage: + types: + Asphyxiation: 5 + Cold: 5 + soundHit: + path: /Audio/_DV/CosmicCult/cosmiclance_hit.ogg + params: + variation: 0.2 + volume: 1 + soundSwing: + path: /Audio/_DV/CosmicCult/cosmicweapon_swing.ogg + params: + variation: 0.125 + volume: -4 + - type: TypingIndicator + proto: CosmicTyping + - type: PointLight + color: "#42a4ae" + radius: 2 + energy: 2 + softness: 1 + castShadows: false + - type: ZombieImmune + - type: GhostTakeoverAvailable + - type: LightBehaviour + behaviours: + - !type:FadeBehaviour + interpolate: Linear + minDuration: 5.5 + maxDuration: 5.5 + startValue: 0.5 + endValue: 2 + property: Energy + enabled: true + isLooped: true + reverseWhenFinished: true + +- type: entity + parent: [ BaseMobCosmicHostile, MobCosmicCustodian ] + id: MobCosmicCustodianHostile + components: + - type: Physics + bodyStatus: OnGround + +- type: entity + parent: [ BaseMobCosmicHostile, MobCosmicOracle ] + id: MobCosmicOracleHostile + components: + - type: Physics + bodyStatus: OnGround + +- type: entity + parent: [ BaseMobCosmicHostile, MobCosmicLodestar ] + id: MobCosmicLodestarHostile + components: + - type: Physics + bodyStatus: OnGround + - type: HTN + rootTask: + task: SimpleRangedHostileCompound + blackboard: + NavClimb: !type:Bool + true + NavSmash: !type:Bool + true + - type: Gun + projectileSpeed: 12 + soundGunshot: /Audio/_DV/CosmicCult/projectile_razor.ogg + soundEmpty: null + fireRate: 1 + useKey: false + - type: RechargeBasicEntityAmmo + rechargeCooldown: 1.8 + rechargeSound: + path: /Audio/_DV/CosmicCult/projectile_razor_reload.ogg + params: + volume: -99 + - type: BasicEntityAmmoProvider + proto: ProjectileCosmic + capacity: 1 + count: 1 diff --git a/Resources/Prototypes/_DV/CosmicCult/Objects/cosmicweapons.yml b/Resources/Prototypes/_DV/CosmicCult/Objects/cosmicweapons.yml index 39a42571d7..c7725a0de5 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Objects/cosmicweapons.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Objects/cosmicweapons.yml @@ -187,7 +187,7 @@ groups: Brute: -10 - type: Gun - projectileSpeed: 14 + projectileSpeed: 15 soundGunshot: /Audio/_DV/CosmicCult/projectile_razor.ogg soundEmpty: null fireRate: 1 @@ -196,6 +196,8 @@ rechargeCooldown: 1.8 rechargeSound: path: /Audio/_DV/CosmicCult/projectile_razor_reload.ogg + params: + variation: 0.08 - type: BasicEntityAmmoProvider proto: ProjectileCosmicRazor capacity: 1 @@ -221,21 +223,13 @@ soundSwing: path: /Audio/_DV/CosmicCult/cosmicweapon_swing.ogg params: - variation: 0.125 + variation: 0.124 volume: -4 soundNoDamage: path: /Audio/_DV/CosmicCult/cosmicsword_glance.ogg params: variation: 0.2 volume: -11 - - type: Reflect - reflectProb: .21 - spread: 120 - soundOnReflect: - path: /Audio/_DV/CosmicCult/cosmicsword_glance.ogg - params: - variation: 0.2 - volume: -6 - type: Wieldable wieldSound: path: /Audio/_DV/CosmicCult/cosmic_wield.ogg diff --git a/Resources/Prototypes/_DV/CosmicCult/Objects/entropymote.yml b/Resources/Prototypes/_DV/CosmicCult/Objects/entropymote.yml index 3b7d8731c8..e72cc8b579 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Objects/entropymote.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Objects/entropymote.yml @@ -26,9 +26,6 @@ sprite: _DV/CosmicCult/Objects/entropymote.rsi size: Small - type: CosmicEntropyMote - - type: Tag - tags: - - Entropy - type: Extractable grindableSolutionName: grind - type: SolutionContainerManager diff --git a/Resources/Prototypes/_DV/CosmicCult/Objects/misc.yml b/Resources/Prototypes/_DV/CosmicCult/Objects/misc.yml index 50989fb599..3bac767b82 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Objects/misc.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Objects/misc.yml @@ -2,7 +2,7 @@ id: CosmicCultLawBoard parent: BaseElectronics name: malign law board - description: An eerie circuit board, suited for slotting into an AI law upload console. Its circuitry is interwoven with phantasmal dendritic strands that twitch of their own accord. + description: An eerie circuit board, suited for slotting into an AI law upload console. Its circuitry is interwoven with dendritic strands that twitch of their own accord. components: - type: Sprite sprite: _DV/CosmicCult/Objects/lawboard.rsi @@ -11,3 +11,45 @@ lawUploadSound: /Audio/_DV/CosmicCult/antag_cosmic_AI_briefing.ogg subverted: true laws: CosmicCultLaws + +- type: entity + id: CosmicCultMindSink + parent: PositronicBrain + name: astral mindsink + description: A strange artifact. Though comprised of malign materials, it instills no feelings of discomfort. + components: + - type: Sprite + sprite: _DV/CosmicCult/Objects/mindsink.rsi + layers: + - state: base + - state: fg_idle + shader: unshaded + map: ["overlay"] + - type: GenericVisualizer + visuals: + enum.ToggleableGhostRoleVisuals.Status: + overlay: + Off: { state: fg_idle } + Searching: { state: fg_searching } + On: { state: fg_occupied } + - type: ToggleableGhostRole + mindRoles: + - MindRoleGhostRoleSilicon + examineTextMindPresent: ghost-role-mindsink-installed + examineTextMindSearching: ghost-role-mindsink-still-searching + examineTextNoMind: ghost-role-mindsink-off + beginSearchingText: ghost-role-mindsink-searching + roleName: ghost-role-mindsink-role-name + roleDescription: ghost-role-mindsink-role-description + roleRules: ghost-role-information-silicon-rules + wipeVerbText: ghost-role-mindsink-wipe-device-verb-text + wipeVerbPopup: ghost-role-mindsink-wiped-device + stopSearchVerbText: ghost-role-mindsink-stop-searching-verb-text + stopSearchVerbPopup: ghost-role-mindsink-stopped-searching + job: Borg + - type: TypingIndicator + proto: CosmicTyping + - type: Speech + speechSounds: ColossusSpeech + - type: NameIdentifier + group: CosmicPositronicBrain diff --git a/Resources/Prototypes/_DV/CosmicCult/Tileset/effigy.yml b/Resources/Prototypes/_DV/CosmicCult/Tileset/effigy.yml new file mode 100644 index 0000000000..4df9eefced --- /dev/null +++ b/Resources/Prototypes/_DV/CosmicCult/Tileset/effigy.yml @@ -0,0 +1,114 @@ +##################### PILLAR +- type: entity + parent: BaseStructure + id: CosmicEffigy + name: effigy of entropy + description: An abhorrent malign anomaly. Raw entropy oozes forth, betraying its instability. + components: + - type: Sprite + sprite: _DV/CosmicCult/Tileset/cosmiceffigy.rsi + offset: 0, 0 + layers: + - state: unshaded_bg + shader: unshaded + - state: base + - state: unshaded_fg + shader: unshaded + drawdepth: Mobs + - type: AmbientSound + volume: -5 + range: 8 + sound: + path: /Audio/_DV/CosmicCult/effigy_ambience.ogg + - type: CosmicCultExamine + cultistText: cosmic-examine-text-culteffigy + othersText: cosmic-examine-text-effigy + - type: CosmicCorrupting + corruptionReduction: 0.02 + enabled: true + floodFillStarting: true + corruptionMaxTicks: 6 + corruptionSpeed: 1.25 + - type: InteractionOutline + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.5 + density: 50 + mask: + - FlyingMobMask + layer: + - FlyingMobLayer + - type: Clickable + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: Metallic + - type: DamageOnAttacked + damage: + types: + Cold: 10 + - type: PointLight + color: "#42a4ae" + radius: 4 + energy: 4 + castShadows: true + - type: LightBehaviour + behaviours: + - !type:FadeBehaviour + interpolate: Linear + minDuration: 2.25 + maxDuration: 2.25 + startValue: 2 + endValue: 5 + property: Energy + enabled: true + isLooped: true + reverseWhenFinished: true + - type: GuideHelp + guides: + - AnomalousResearch + - CosmicCult + - type: Anomaly + pulseSound: + path: /Audio/_DV/CosmicCult/effigy_pulse.ogg + supercriticalSound: + path: /Audio/_DV/CosmicCult/effigy_supercritical.ogg + nextPulseTime: 1 + minPulseLength: 60 + maxPulseLength: 80 + minContituty: 0.4 + maxContituty: 0.8 + growthThreshold: 0.35 + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 2 + maxAmount: 3 + minRange: 3 + maxRange: 4.5 + spawns: + - MobCosmicCustodianHostile + - MobCosmicOracleHostile + - MobCosmicLodestarHostile + - settings: + spawnOnSuperCritical: true + minAmount: 4 + maxAmount: 7 + maxRange: 8 + spawns: + - MobCosmicCustodianHostile + - MobCosmicOracleHostile + - MobCosmicLodestarHostile + - CosmicMalignRift + - settings: + spawnOnShutdown: true + minAmount: 1 + maxAmount: 2 + maxRange: 1 + spawns: + - MobCosmicLodestarHostile + - type: WarpPoint + follow: true diff --git a/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml b/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml index 7a615d8fa1..bf2eeebc2a 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml @@ -137,7 +137,6 @@ base: decay - type: Tag tags: - - Entropy - HideContextMenu - type: TileEmission color: "#42a4ae" diff --git a/Resources/Prototypes/_DV/CosmicCult/Tileset/structures.yml b/Resources/Prototypes/_DV/CosmicCult/Tileset/structures.yml index c8079ddd66..732f1cf4eb 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Tileset/structures.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Tileset/structures.yml @@ -53,6 +53,9 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic ##################### CHAIR @@ -72,10 +75,13 @@ thresholds: - trigger: !type:DamageTrigger - damage: 600 + damage: 200 behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic ##################### PILLAR - type: entity @@ -108,10 +114,13 @@ thresholds: - trigger: !type:DamageTrigger - damage: 600 + damage: 200 behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic ##################### THRUSTER - type: entity @@ -173,6 +182,9 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic ##################### LAMP - type: entity @@ -180,6 +192,8 @@ description: A mote of un-light shimmers within. suffix: Always Powered name: malign light + placement: + mode: SnapgridCenter components: - type: MeleeSound soundGroups: @@ -212,15 +226,15 @@ thresholds: - trigger: !type:DamageTrigger - damage: 600 + damage: 200 behaviors: #excess damage, don't spawn entities. - !type:DoActsBehavior acts: [ "Destruction" ] - !type:PlaySoundBehavior sound: collection: GlassBreak - placement: - mode: SnapgridCenter + + - type: entity id: CosmicMalignRift @@ -279,7 +293,7 @@ shape: !type:PhysShapeAabb bounds: "-0.25,-0.375,0.25,0.4" - density: 100 + density: 200 mask: - LargeMobMask layer: @@ -321,7 +335,7 @@ thresholds: - trigger: !type:DamageTrigger - damage: 400 + damage: 300 behaviors: #excess damage, don't spawn entities. - !type:DoActsBehavior acts: [ "Destruction" ] @@ -367,7 +381,7 @@ sprite: _DV/CosmicCult/Tileset/cosmictable.rsi state: full - type: Damageable - damageContainer: StructuralInorganic + damageContainer: Inorganic damageModifierSet: Metallic - type: CosmicCultExamine cultistText: cosmic-examine-text-forthecult diff --git a/Resources/Prototypes/_DV/CosmicCult/cosmiccultist.yml b/Resources/Prototypes/_DV/CosmicCult/antagonists.yml similarity index 50% rename from Resources/Prototypes/_DV/CosmicCult/cosmiccultist.yml rename to Resources/Prototypes/_DV/CosmicCult/antagonists.yml index 40d54f7977..dec06ec408 100644 --- a/Resources/Prototypes/_DV/CosmicCult/cosmiccultist.yml +++ b/Resources/Prototypes/_DV/CosmicCult/antagonists.yml @@ -6,5 +6,11 @@ objective: roles-antag-cosmiccult-description requirements: - !type:OverallPlaytimeRequirement - time: 43200 # 12h + time: 86400 # 24h i really just want people to read the guidebook please please please guides: [ CosmicCult ] + +- type: antag + id: CosmicAntagColossus + name: ghost-role-information-colossus-name + antagonist: true + objective: ghost-role-colossus-objective diff --git a/Resources/Prototypes/_DV/CosmicCult/colossus_dataset.yml b/Resources/Prototypes/_DV/CosmicCult/colossus_dataset.yml index 5f51f3698d..49fe50470b 100644 --- a/Resources/Prototypes/_DV/CosmicCult/colossus_dataset.yml +++ b/Resources/Prototypes/_DV/CosmicCult/colossus_dataset.yml @@ -14,4 +14,4 @@ id: ColossusTitlesLone values: prefix: cosmiccolossus-titles-lone-dataset- - count: 4 + count: 5 diff --git a/Resources/Prototypes/_DV/CosmicCult/events.yml b/Resources/Prototypes/_DV/CosmicCult/events.yml new file mode 100644 index 0000000000..eebf5f0a6e --- /dev/null +++ b/Resources/Prototypes/_DV/CosmicCult/events.yml @@ -0,0 +1,35 @@ +- type: entity + parent: BaseGameRule + id: ColossusSpawn + components: + - type: StationEvent + weight: 4.5 + earliestStart: 30 + reoccurrenceDelay: 20 + minimumPlayers: 25 + duration: null + - type: PrecognitionResult + message: psionic-power-precognition-colossus-spawn-result-message + - type: SpaceSpawnRule + - type: AntagSpawner + prototype: MobCosmicColossusLone + - type: AntagObjectives + objectives: + - ColossusSurviveObjective + - ColossusEffigyObjective + - type: AntagSelection + agentName: role-subtype-colossus + definitions: + - spawnerPrototype: SpawnPointCosmicColossus + min: 1 + max: 1 + pickPlayer: false + mindRoles: + - MindRoleCosmicColossus + briefing: + text: ghost-role-colossus-briefing + color: CadetBlue + sound: /Audio/_DV/CosmicCult/antag_cosmic_briefing.ogg + components: + - type: CosmicColossus + timed: true diff --git a/Resources/Prototypes/_DV/CosmicCult/ghost_roles.yml b/Resources/Prototypes/_DV/CosmicCult/ghost_roles.yml new file mode 100644 index 0000000000..150dcea31e --- /dev/null +++ b/Resources/Prototypes/_DV/CosmicCult/ghost_roles.yml @@ -0,0 +1,18 @@ +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointCosmicColossus + components: + - type: GhostRole + name: ghost-role-information-colossus-name + description: ghost-role-information-colossus-description + rules: ghost-role-information-colossus-rules + makeSentient: true + allowSpeech: true + allowMovement: true + mindRoles: + - MindRoleGhostRoleTeamAntagonist + - type: Sprite + layers: + - sprite: _DV/CosmicCult/Mobs/colossus.rsi + state: colossus diff --git a/Resources/Prototypes/_DV/CosmicCult/mind_roles.yml b/Resources/Prototypes/_DV/CosmicCult/mind_roles.yml index 9f3d484fa5..e2c9823904 100644 --- a/Resources/Prototypes/_DV/CosmicCult/mind_roles.yml +++ b/Resources/Prototypes/_DV/CosmicCult/mind_roles.yml @@ -11,3 +11,17 @@ - type: CosmicCultRole - type: RoleBriefing briefing: objective-cosmiccult-charactermenu + +- type: entity + parent: BaseMindRoleAntag + id: MindRoleCosmicColossus + name: Colossus Role + components: + - type: MindRole + antagPrototype: CosmicAntagColossus + roleType: TeamAntagonist + subtype: role-subtype-colossus + exclusiveAntag: true + - type: CosmicColossusRole + - type: RoleBriefing + briefing: ghost-role-colossus-charactermenu diff --git a/Resources/Prototypes/_DV/CosmicCult/name_identifier_groups.yml b/Resources/Prototypes/_DV/CosmicCult/name_identifier_groups.yml new file mode 100644 index 0000000000..b01d001058 --- /dev/null +++ b/Resources/Prototypes/_DV/CosmicCult/name_identifier_groups.yml @@ -0,0 +1,5 @@ +- type: nameIdentifierGroup + id: CosmicPositronicBrain + prefix: ASTRAL + minValue: 0 + maxValue: 10 diff --git a/Resources/Prototypes/_DV/CosmicCult/objectives.yml b/Resources/Prototypes/_DV/CosmicCult/objectives.yml index db4ead56f1..d22664cfea 100644 --- a/Resources/Prototypes/_DV/CosmicCult/objectives.yml +++ b/Resources/Prototypes/_DV/CosmicCult/objectives.yml @@ -10,8 +10,35 @@ roles: - CosmicCultRole +- type: entity + abstract: true + parent: BaseObjective + id: BaseCosmicColossusObjective + components: + - type: Objective + difficulty: 1.5 + issuer: objective-issuer-cosmiccult + - type: RoleRequirement + roles: + - CosmicColossusRole + ############################### COSMIC CULT'S OBJECTIVES +- type: entity + parent: BaseCosmicCultObjective + id: CosmicConversionObjective + components: + - type: Objective + icon: + sprite: _DV/CosmicCult/Icons/objectives.rsi + state: infection + - type: NumberObjective + min: 7 + max: 14 + title: objective-condition-conversion-title + description: objective-condition-conversion-desc + - type: CosmicConversionCondition + - type: entity parent: BaseCosmicCultObjective id: CosmicEntropyObjective @@ -21,8 +48,8 @@ sprite: _DV/CosmicCult/Icons/objectives.rsi state: siphon - type: NumberObjective - min: 40 - max: 60 + min: 70 + max: 90 title: objective-condition-entropy-title description: objective-condition-entropy-desc - type: CosmicEntropyCondition @@ -56,3 +83,28 @@ title: objective-condition-victory-title description: objective-condition-victory-desc - type: CosmicVictoryCondition + +############################### COLOSSI OBJECTIVES + +- type: entity + parent: [BaseCosmicColossusObjective, BaseSurviveObjective] + id: ColossusSurviveObjective + name: PERSIST + description: Persist until the end of all things. + components: + - type: Objective + icon: + sprite: _DV/CosmicCult/Icons/objectives.rsi + state: colossus + +- type: entity + parent: [BaseCosmicColossusObjective, BaseCodeObjective] + id: ColossusEffigyObjective + name: BECKON + description: Call forth an Effigy of Entropy. + components: + - type: Objective + icon: + sprite: _DV/CosmicCult/Icons/objectives.rsi + state: effigy + - type: CosmicEffigyCondition diff --git a/Resources/Prototypes/_DV/CosmicCult/projectiles.yml b/Resources/Prototypes/_DV/CosmicCult/projectiles.yml index 16920c0358..7003a1a61e 100644 --- a/Resources/Prototypes/_DV/CosmicCult/projectiles.yml +++ b/Resources/Prototypes/_DV/CosmicCult/projectiles.yml @@ -45,8 +45,8 @@ mobile: true - type: entity - id: ProjectileCosmicRazor - name: Astral Bolt + id: ProjectileCosmic + name: Malign Bolt parent: BaseBullet categories: [ HideSpawnMenu ] description: Ouch. @@ -60,22 +60,15 @@ layers: - state: razor shader: unshaded - - type: DamageMarkerOnCollide - whitelist: - components: - - MobState - damage: - types: - Cold: 15 - Asphyxiation: 10 - type: Projectile impactEffect: BulletImpactEffectCosmic damage: types: - Cold: 10 - Asphyxiation: 5 + Cold: 12 soundHit: path: /Audio/_DV/CosmicCult/projectile_razor_hit.ogg + params: + variation: 0.08 - type: Ammo muzzleFlash: null # Short lifespan @@ -101,6 +94,27 @@ enabled: true reverseWhenFinished: true +- type: entity + id: ProjectileCosmicRazor + name: Astral Bolt + parent: ProjectileCosmic + categories: [ HideSpawnMenu ] + description: Ouch. + components: + - type: DamageMarkerOnCollide + whitelist: + components: + - MobState + damage: + types: + Cold: 15 + Asphyxiation: 10 + - type: Projectile + impactEffect: BulletImpactEffectCosmic + damage: + types: + Cold: 10 + Asphyxiation: 5 - type: entity id: BulletImpactEffectCosmic diff --git a/Resources/Prototypes/_DV/CosmicCult/roundstart.yml b/Resources/Prototypes/_DV/CosmicCult/roundstart.yml index 1da5472ef4..814c09382b 100644 --- a/Resources/Prototypes/_DV/CosmicCult/roundstart.yml +++ b/Resources/Prototypes/_DV/CosmicCult/roundstart.yml @@ -12,6 +12,7 @@ objectives: - CosmicFinalityObjective - CosmicMonumentObjective + - CosmicConversionObjective - CosmicEntropyObjective - type: AntagSelection definitions: diff --git a/Resources/Prototypes/_DV/CosmicCult/tags.yml b/Resources/Prototypes/_DV/CosmicCult/tags.yml deleted file mode 100644 index 435e7c1c26..0000000000 --- a/Resources/Prototypes/_DV/CosmicCult/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -- type: Tag - id: Entropy diff --git a/Resources/Prototypes/_DV/CosmicCult/typing_indicator.yml b/Resources/Prototypes/_DV/CosmicCult/typing_indicator.yml new file mode 100644 index 0000000000..a53f4b4f2a --- /dev/null +++ b/Resources/Prototypes/_DV/CosmicCult/typing_indicator.yml @@ -0,0 +1,7 @@ +- type: typingIndicator + id: CosmicTyping + spritePath: /Textures/_DV/CosmicCult/Effects/speech.rsi + typingState: malign0 + idleState: malign0 + offset: -0.2, 0.1 + shader: unshaded diff --git a/Resources/Prototypes/threats.yml b/Resources/Prototypes/threats.yml index ba4a2f4e43..4b64276d2b 100644 --- a/Resources/Prototypes/threats.yml +++ b/Resources/Prototypes/threats.yml @@ -14,3 +14,8 @@ id: Revenant announcement: terror-revenant rule: RevenantSpawn + +- type: ninjaHackingThreat # DeltaV start + id: Colossus + announcement: terror-colossus + rule: ColossusSpawn # DeltaV end diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml b/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml index aa6b0965d7..749b54d288 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml @@ -8,7 +8,8 @@ ## Various Antagonists Antagonists can take many forms, like: - - [textlink="The Cosmic Cult" link="CosmicCult"], who seek to usher in the end of all things. + - [textlink="The Cosmic Cult" link="CosmicCult"], who seek to usher in the end of all things. + - [textlink="Entropic Colossi" link="CosmicColossus"], towering monstrosities of malign plating. - [textlink="Traitors" link="Traitors"] amongst the crew who must assassinate, steal and decieve. - [textlink="Thieves" link="Thieves"] driven by kleptomania, determined to get their fix using their special gloves. - [textlink="Revolutionaries" link="Revolutionaries"] who are intent on taking control of the station from the inside. diff --git a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicColossus.xml b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicColossus.xml new file mode 100644 index 0000000000..c020721f13 --- /dev/null +++ b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicColossus.xml @@ -0,0 +1,49 @@ + + # Entropic Colossus + + + [color=#999999][italic]"Neither ill will, nor impassioned desire. Neither malice, nor cruelty. Nothing."[/italic][/color] + + + [color=#999999][italic]"Just an end."[/italic][/color] + + + + + + You are an Entropic Colossus, a towering monstrosity of malign plating and dendritic infestation. Your purpose is the same as that of the [color=#4cabb3]Cosmic Cult[/color]: The end of all things. + + Some Colossi are remnants. Perhaps survivors of a conflict borne of The Unknown's influence, or the product of some strange Noospheric anomaly. These Colossi drift across the distal black of space until their energies deplete... Or until they impact civilization. + + [textlink="For information on cult-created colossi, click here." link="CosmicCult"] + + ## Influences + + Entropic Colossi are posessed of powerful [color=#4cabb3]Malign Influences[/color], with which a capable colossus may lay waste to its enemies. + + - [color=#4cabb3][bold]Entropic Sunder:[/bold][/color] Warp to the target location and unleash a cascading detonation of malign energy. Careful - this will hurt allied cultists! + - [color=#4cabb3][bold]Colossal Ingress:[/bold][/color] Use your colossal strength to force open a doorway. Even securely bolted doorways will be torn open by your titanic power. + - [color=#4cabb3][bold]Slumber Shell:[/bold][/color] Slumber your body for a period of time to regenerate integrity. Must be done on stable ground. This will restore you for exactly half the damage you've taken. + + Colossi that have encountered the station by happenstance also have this influence: + - [color=#4cabb3][bold]Colossal Ingress:[/bold][/color] Use your colossal strength to force open a doorway. Even securely bolted doorways will be torn open by your titanic power. + + ## Objectives + + + + + Colossi that have encountered the station by happenstance: + - [color=#4cabb3][bold]Persist[/bold][/color] - Collectively siphon a certain amount of Entropy from the crew. The more entropy you siphon, the more you can empower the Monument! + - [color=#4cabb3][bold]Beckon[/bold][/color] - Call forth an Effigy of Entropy at a designated location aboard the station. + + Colossi created from Cyborgs by the Cosmic Cult: + - [color=#4cabb3][bold]Usher In The End[/bold][/color] - Complete the final ritual to beckon the Unknown and destroy the station. + + ## Effigy of Entropy + + + + Some Colossi may call forth an [color=#4cabb3]Effigy of Entropy[/color]. The effigy is a dangerously unstable malign anomaly, and should be dealt with by the Epistemics department immediately! + + diff --git a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml index c8c5884719..ea6dff2e01 100644 --- a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml +++ b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml @@ -86,6 +86,8 @@ If successfully unleashed, an Entropic Colossus will be a force to be reckoned with. + [textlink="For more on Entropic Colossi, click here." link="CosmicColossus"] + ## Malign Law diff --git a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultDeconversion.xml b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultDeconversion.xml index 93095c2811..89f74513e4 100644 --- a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultDeconversion.xml +++ b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultDeconversion.xml @@ -7,7 +7,7 @@ When mounting an effort to thwart the [color=#4cabb3]Cosmic Cult[/color], there are several methods the crew might employ to ensure their survival and safety. One of these methods is [color=Yellow]Deconversion[/color]. - To [color=Yellow]Deconvert[/color] a cosmic cultist, a [bold]Censer[/bold] must be used. Censers are fueled with Holy Water, which can be procured from: + To [color=Yellow]Deconvert[/color] a cosmic cultist, an [bold]Ardent Censer[/bold] must be used. Censers are fueled with Holy Water, which can be procured from: - Usage of a Bible by a Chaplain or Mystagogue on most containers of water will bless the water, turning it into Holy Water. ## Suppression Methods diff --git a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultMonument.xml b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultMonument.xml index c2223ec93c..cc7c7c658b 100644 --- a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultMonument.xml +++ b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultMonument.xml @@ -27,8 +27,6 @@ Be prepared to defend the Monument during the Beckoning, as just one waylaid action from a single disruptive soul will bring this ritual to a sudden, unceremonious halt. - Converting additional crewmembers using a [color=#4cabb3]Glyph of Truth[/color] while the Beckoning is active will accelerate its speed, bringing the cult closer to total victory. - ## Glyphs Glyphs may be [color=#4cabb3]Scribed[/color] by interacting with the Monument. You may also [color=#4cabb3]Unscribe[/color] an unused Glyph in a similar manner at The Monument. diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/equipped-BACKPACK.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000..3add132719 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/equipped-BACKPACK.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..3add132719 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/icon-on.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/icon-on.png new file mode 100644 index 0000000000..290d3717bd Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/icon-on.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/icon.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/icon.png new file mode 100644 index 0000000000..059b976513 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/icon.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/inhand-left.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/inhand-left.png new file mode 100644 index 0000000000..da57d6dee3 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/inhand-left.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/inhand-right.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/inhand-right.png new file mode 100644 index 0000000000..c9664e5679 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/inhand-right.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/meta.json new file mode 100644 index 0000000000..937ca0f7f3 --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/meta.json @@ -0,0 +1,85 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/1592a112e3d33eec4a0704b518a138d5a976f455, modified by Radezolid for SUITSTORAGE", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon", + "directions": 1 + }, + { + "name": "icon-on", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + }, + { + "name": "on-equipped-BACKPACK", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 + }, + { + "name": "on-equipped-SUITSTORAGE", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ], + [ + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/on-equipped-BACKPACK.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/on-equipped-BACKPACK.png new file mode 100644 index 0000000000..e6efe984f8 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/on-equipped-BACKPACK.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/on-equipped-SUITSTORAGE.png b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/on-equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..e6efe984f8 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Clothing/cosmiccult_jetpack.rsi/on-equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign0.png b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign0.png new file mode 100644 index 0000000000..09036c5c63 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign0.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign1.png b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign1.png new file mode 100644 index 0000000000..99bb2267de Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign1.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign2.png b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign2.png new file mode 100644 index 0000000000..fba6158241 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign2.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign3.png b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign3.png new file mode 100644 index 0000000000..504ca545fd Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/malign3.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/meta.json new file mode 100644 index 0000000000..50a7b803cf --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Effects/speech.rsi/meta.json @@ -0,0 +1,60 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "A custom item by AftrLite(Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "malign0", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.4, + 0.3 + ] + ] + }, + { + "name": "malign1", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "malign2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "malign3", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/meta.json index 7b01f9f7b3..cd18e7d167 100644 --- a/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/meta.json @@ -55,6 +55,9 @@ { "name": "sunder" }, + { + "name": "slumber" + }, { "name": "corruption" }, diff --git a/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/slumber.png b/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/slumber.png new file mode 100644 index 0000000000..25a28ac649 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Icons/cosmiccult_abilities.rsi/slumber.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/colossus.png b/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/colossus.png new file mode 100644 index 0000000000..2d24175474 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/colossus.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/effigy.png b/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/effigy.png new file mode 100644 index 0000000000..6f9768aef2 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/effigy.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/meta.json index 6469a3e5d1..aa437fcc20 100644 --- a/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Icons/objectives.rsi/meta.json @@ -18,6 +18,12 @@ }, { "name": "infection" + }, + { + "name": "colossus" + }, + { + "name": "effigy" } ] } diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/hibernate.png b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/hibernate.png new file mode 100644 index 0000000000..2674876dd5 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/hibernate.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/meta.json index 2b0dbfe515..54bf8344ea 100644 --- a/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/meta.json @@ -163,6 +163,43 @@ }, { "name": "attacking" + }, + { + "name": "hibernate", + "delays": [ + [ + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075 + ] + ] } ] } diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/dead.png b/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/dead.png new file mode 100644 index 0000000000..6cbfc3543f Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/dead.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/dead_unshaded.png b/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/dead_unshaded.png new file mode 100644 index 0000000000..7244b37f5c Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/dead_unshaded.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/meta.json index 0cdff8cb85..217c85857e 100644 --- a/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Mobs/custodian.rsi/meta.json @@ -7,6 +7,12 @@ "y": 32 }, "states": [ + { + "name": "dead" + }, + { + "name": "dead_unshaded" + }, { "name": "custodian", "directions": 4, diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/dead.png b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/dead.png new file mode 100644 index 0000000000..ea930ee48f Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/dead.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/dead_unshaded.png b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/dead_unshaded.png new file mode 100644 index 0000000000..7244b37f5c Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/dead_unshaded.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/lodestar.png b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/lodestar.png new file mode 100644 index 0000000000..7c73eb6a78 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/lodestar.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/lodestar_unshaded.png b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/lodestar_unshaded.png new file mode 100644 index 0000000000..3fe87d41f5 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/lodestar_unshaded.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/meta.json new file mode 100644 index 0000000000..45eb52e93c --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Mobs/lodestar.rsi/meta.json @@ -0,0 +1,141 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "A custom item by AftrLite(Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "dead" + }, + { + "name": "dead_unshaded" + }, + { + "name": "lodestar", + "directions": 4, + "delays": [ + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ] + ] + }, + { + "name": "lodestar_unshaded", + "directions": 4, + "delays": [ + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ], + [ + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15, + 0.15 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/dead.png b/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/dead.png new file mode 100644 index 0000000000..c52f8576d4 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/dead.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/dead_unshaded.png b/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/dead_unshaded.png new file mode 100644 index 0000000000..7244b37f5c Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/dead_unshaded.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/meta.json index 57db74b84a..370564b08b 100644 --- a/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Mobs/oracle.rsi/meta.json @@ -7,6 +7,12 @@ "y": 32 }, "states": [ + { + "name": "dead" + }, + { + "name": "dead_unshaded" + }, { "name": "oracle", "directions": 4, diff --git a/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/base.png b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/base.png new file mode 100644 index 0000000000..842c478c53 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/base.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_idle.png b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_idle.png new file mode 100644 index 0000000000..83bace2767 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_idle.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_occupied.png b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_occupied.png new file mode 100644 index 0000000000..1ba6a5de52 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_occupied.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_searching.png b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_searching.png new file mode 100644 index 0000000000..b229c92828 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/fg_searching.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/meta.json new file mode 100644 index 0000000000..015b973d75 --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Objects/mindsink.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "A custom item by AftrLite (Github).", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "fg_idle" + }, + { + "name": "fg_searching", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "fg_occupied", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/base.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/base.png new file mode 100644 index 0000000000..56101228b0 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/base.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/meta.json new file mode 100644 index 0000000000..306d8dec22 --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/meta.json @@ -0,0 +1,122 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "A custom item by AftrLite (Github).", + "size": { + "x": 64, + "y": 96 + }, + "states": [ + { + "name": "base", + "delays": [ + [ + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075 + ] + ] + }, + { + "name": "unshaded_bg", + "delays": [ + [ + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075 + ] + ] + }, + { + "name": "unshaded_fg", + "delays": [ + [ + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075, + 0.075 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/unshaded_bg.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/unshaded_bg.png new file mode 100644 index 0000000000..dafde48904 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/unshaded_bg.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/unshaded_fg.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/unshaded_fg.png new file mode 100644 index 0000000000..4253f99e3b Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Tileset/cosmiceffigy.rsi/unshaded_fg.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/base.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/base.png deleted file mode 100644 index 7b1dd0dbd7..0000000000 Binary files a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/base.png and /dev/null differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/meta.json deleted file mode 100644 index 045a92a7d3..0000000000 --- a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/meta.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "A custom item by AftrLite (Github).", - "size": { - "x": 32, - "y": 64 - }, - "states": [ - { - "name": "base" - }, - { - "name": "overlay-enabled" - }, - { - "name": "overlay-activate", - "delays": [ - [ - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11 - ] - ] - }, - { - "name": "overlay-deactivate", - "delays": [ - [ - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11, - 0.11 - ] - ] - }, - { - "name": "overlay-orb", - "delays": [ - [ - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075, - 0.075 - ] - ] - } - ] -} diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-activate.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-activate.png deleted file mode 100644 index f17df8bcca..0000000000 Binary files a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-activate.png and /dev/null differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-deactivate.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-deactivate.png deleted file mode 100644 index c74358d18f..0000000000 Binary files a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-deactivate.png and /dev/null differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-enabled.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-enabled.png deleted file mode 100644 index 1191b32471..0000000000 Binary files a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-enabled.png and /dev/null differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-orb.png b/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-orb.png deleted file mode 100644 index 02647af69d..0000000000 Binary files a/Resources/Textures/_DV/CosmicCult/Tileset/cosmicpylon.rsi/overlay-orb.png and /dev/null differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/meta.json index c5c3f7c355..c6b03122c6 100644 --- a/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/meta.json @@ -366,6 +366,15 @@ ] ] }, + { + "name": "stage0" + }, + { + "name": "stage0-placement-ghost-1" + }, + { + "name": "stage0-placement-ghost-2" + }, { "name": "stage1-placement-ghost-1" }, diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0-placement-ghost-1.png b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0-placement-ghost-1.png new file mode 100644 index 0000000000..c29a273768 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0-placement-ghost-1.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0-placement-ghost-2.png b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0-placement-ghost-2.png new file mode 100644 index 0000000000..2e9a2b620a Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0-placement-ghost-2.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0.png b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0.png new file mode 100644 index 0000000000..088a16da25 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Tileset/monument.rsi/stage0.png differ