diff --git a/Content.Client/_DV/CosmicCult/CosmicCultSystem.cs b/Content.Client/_DV/CosmicCult/CosmicCultSystem.cs index e849fdfcaa..f3c8fe9193 100644 --- a/Content.Client/_DV/CosmicCult/CosmicCultSystem.cs +++ b/Content.Client/_DV/CosmicCult/CosmicCultSystem.cs @@ -27,12 +27,6 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem { base.Initialize(); - SubscribeLocalEvent(OnAscendedInfectionAdded); - SubscribeLocalEvent(OnAscendedInfectionRemoved); - - SubscribeLocalEvent(OnAscendedAuraAdded); - SubscribeLocalEvent(OnAscendedAuraRemoved); - SubscribeLocalEvent(OnCosmicStarMarkAdded); SubscribeLocalEvent(OnCosmicStarMarkRemoved); @@ -75,28 +69,6 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem #endregion #region Layer Additions - private void OnAscendedInfectionAdded(Entity uid, ref ComponentStartup args) - { - if (!TryComp(uid, out var sprite) || sprite.LayerMapTryGet(AscendedInfectionKey.Key, out _)) - return; - - var layer = sprite.AddLayer(uid.Comp.Sprite); - - sprite.LayerMapSet(AscendedInfectionKey.Key, layer); - sprite.LayerSetShader(layer, "unshaded"); - } - - private void OnAscendedAuraAdded(Entity uid, ref ComponentStartup args) - { - if (!TryComp(uid, out var sprite) || sprite.LayerMapTryGet(AscendedAuraKey.Key, out _)) - return; - - var layer = sprite.AddLayer(uid.Comp.Sprite); - - sprite.LayerMapSet(AscendedAuraKey.Key, layer); - sprite.LayerSetShader(layer, "unshaded"); - } - private void OnCosmicStarMarkAdded(Entity uid, ref ComponentStartup args) { if (!TryComp(uid, out var sprite) || sprite.LayerMapTryGet(CosmicRevealedKey.Key, out _)) @@ -126,22 +98,6 @@ public sealed partial class CosmicCultSystem : SharedCosmicCultSystem #endregion #region Layer Removals - private void OnAscendedInfectionRemoved(Entity uid, ref ComponentShutdown args) - { - if (!TryComp(uid, out var sprite)) - return; - - sprite.RemoveLayer(AscendedInfectionKey.Key); - } - - private void OnAscendedAuraRemoved(Entity uid, ref ComponentShutdown args) - { - if (!TryComp(uid, out var sprite)) - return; - - sprite.RemoveLayer(AscendedAuraKey.Key); - } - private void OnCosmicStarMarkRemoved(Entity uid, ref ComponentShutdown args) { if (!TryComp(uid, out var sprite)) diff --git a/Content.Server/_DV/CosmicCult/Abilities/CosmicFragmentationSystem.cs b/Content.Server/_DV/CosmicCult/Abilities/CosmicFragmentationSystem.cs index 05226f2c86..77bda26380 100644 --- a/Content.Server/_DV/CosmicCult/Abilities/CosmicFragmentationSystem.cs +++ b/Content.Server/_DV/CosmicCult/Abilities/CosmicFragmentationSystem.cs @@ -96,10 +96,15 @@ public sealed class CosmicFragmentationSystem : EntitySystem { if (_polymorph.PolymorphEntity(args.Target, "CosmicFragmentationWisp") is not { } polyVictim) return; - var chantry = Spawn("CosmicBorgChantry", Transform(args.Target).Coordinates); + + var chantry = Spawn("CosmicBorgChantry", Transform(polyVictim).Coordinates); EnsureComp(chantry, out var chantryComponent); chantryComponent.PolyVictim = polyVictim; chantryComponent.Victim = args.Target; + + var mins = chantryComponent.EventTime.Minutes; + var secs = chantryComponent.EventTime.Seconds; + _antag.SendBriefing(polyVictim, Loc.GetString("cosmiccult-silicon-chantry-briefing", ("minutesandseconds", $"{mins} minutes and {secs} seconds")), Color.FromHex("#4cabb3"), null); } private void OnFragmentAi(Entity ent, ref MalignFragmentationEvent args) @@ -120,7 +125,7 @@ public sealed class CosmicFragmentationSystem : EntitySystem { radio.Channels.Add(_cultRadio); transmitter.Channels.Add(_cultRadio); - _antag.SendBriefing(args.Target, Loc.GetString("cosmiccult-ai-subverted-briefing"), Color.FromHex("#4cabb3"), null); + _antag.SendBriefing(args.Target, Loc.GetString("cosmiccult-silicon-subverted-briefing"), Color.FromHex("#4cabb3"), null); } else { diff --git a/Content.Server/_DV/CosmicCult/CleanseCult.cs b/Content.Server/_DV/CosmicCult/CleanseCult.cs index 3483932bb5..56aa02325c 100644 --- a/Content.Server/_DV/CosmicCult/CleanseCult.cs +++ b/Content.Server/_DV/CosmicCult/CleanseCult.cs @@ -15,7 +15,7 @@ public sealed partial class CleanseCult : EntityEffect { var entityManager = args.EntityManager; var uid = args.TargetEntity; - if (entityManager.HasComponent(uid) || entityManager.HasComponent(uid)) + if (entityManager.HasComponent(uid)) entityManager.EnsureComponent(uid); // We just slap them with the component and let the Deconversion system handle the rest. } } diff --git a/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs b/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs index 26667f242f..810f57b5f7 100644 --- a/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs +++ b/Content.Server/_DV/CosmicCult/Components/CosmicCultRuleComponent.cs @@ -1,5 +1,7 @@ using Content.Server.RoundEnd; using Content.Shared._DV.CosmicCult.Components; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server._DV.CosmicCult.Components; @@ -35,6 +37,22 @@ public sealed partial class CosmicCultRuleComponent : Component [DataField] public LocId RoundEndTextAnnouncement = "cosmiccult-elimination-announcement"; + /// + /// List of entities non-cultists are turned into at the end of the round. + /// + [DataField] + public List CosmicMobs = + [ + "MobCosmicCustodian", + "MobCosmicOracle", + ]; + + /// + /// The entity cultists are turned into at the end of the round. + /// + [DataField] + public EntProtoId CosmicAscended = "MobCosmicAstralAscended"; + /// /// Time for emergency shuttle arrival. /// @@ -105,6 +123,10 @@ public sealed partial class CosmicCultRuleComponent : Component [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] public TimeSpan? ExtraRiftTimer; + + [DataField] public SoundSpecifier WarpSFX = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_blank.ogg"); + + [DataField] public EntProtoId WarpVFX = "CosmicBlankAbilityVFX"; } public enum WinType : byte diff --git a/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs b/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs index d4bbfaacb0..72be32d41e 100644 --- a/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs +++ b/Content.Server/_DV/CosmicCult/CosmicCultRuleSystem.cs @@ -34,9 +34,9 @@ using Content.Shared.Database; using Content.Shared.GameTicking.Components; using Content.Shared.Humanoid; using Content.Shared.IdentityManagement; -using Content.Shared.Mind.Components; using Content.Shared.Mind; using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Mobs; using Content.Shared.Movement.Systems; using Content.Shared.Parallax; @@ -50,11 +50,13 @@ using Robust.Server.Player; using Robust.Shared.Audio; using Robust.Shared.Configuration; using Robust.Shared.Enums; +using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using System.Collections.Immutable; using System.Linq; namespace Content.Server._DV.CosmicCult; @@ -81,6 +83,7 @@ public sealed class CosmicCultRuleSystem : GameRuleSystem uid, ref ComponentInit args) { var query = QueryActiveRules(); - while (query.MoveNext(out var ruleUid, out _, out var cultRule, out _)) { SetWinType((ruleUid, cultRule), WinType.CultComplete); //here's no coming back from this. Cult wins this round - _roundEnd.EndRound(); //Woo game over yeaaaah - foreach (var cultist in cultRule.Cultists) - { - if (TryComp(cultist, out var state) && state.CurrentState != MobState.Dead) - { - if (!TryComp(cultist, out var mindContainer) || !mindContainer.HasMind) - return; - - var ascendant = Spawn("MobCosmicAstralAscended", Transform(cultist).Coordinates); - _mind.TransferTo(mindContainer.Mind.Value, ascendant); - _metaData.SetEntityName(ascendant, Loc.GetString("cosmiccult-astral-ascendant", ("name", cultist))); //Renames cultists' ascendant forms to "[CharacterName], Ascendant" - _body.GibBody(cultist); // you don't need that body anymore - } - } QueueDel(cultRule.MonumentInGame); // The monument doesn't need to stick around postround! Into the bin with you. QueueDel(cultRule.MonumentSlowZone); // cease exist + + _roundEnd.EndRound(); //Woo game over yeaaaah + + var spawnPoints = EntityManager.GetAllComponents(typeof(CosmicVoidSpawnComponent)).ToImmutableList(); + if (spawnPoints.IsEmpty) + { + return; + } + + var endQuery = EntityQueryEnumerator(); + while (endQuery.MoveNext(out var player, out _, out _)) + { + var newSpawn = _rand.Pick(spawnPoints); + var spawnTgt = Transform(newSpawn.Uid).Coordinates; + Timer.Spawn(_rand.Next(TimeSpan.FromSeconds(4), TimeSpan.FromSeconds(25)), () => { EndRoundVoid(player, spawnTgt, cultRule); }); + } } } + private void EndRoundVoid(EntityUid player, EntityCoordinates spawnTgt, CosmicCultRuleComponent cultRule) + { + if (!_mind.TryGetMind(player, out var mind, out _) || _mobStateSystem.IsDead(player)) + return; + if (cultRule.Cultists.Contains(player)) + { + var mob = Spawn(cultRule.CosmicAscended, spawnTgt); + _mind.TransferTo(mind, mob); + _metaData.SetEntityName(mob, Loc.GetString("cosmiccult-astral-ascendant", ("name", player))); //Renames cultists' ascendant forms to "[CharacterName], Ascendant" + } + else + { + var mob = Spawn(_rand.Pick(cultRule.CosmicMobs), spawnTgt); + _mind.TransferTo(mind, mob); + _metaData.SetEntityName(mob, Loc.GetString("cosmiccult-astral-minion", ("name", player))); //Renames non-cultists to "[CharacterName], Malign" + } + Spawn(cultRule.WarpVFX, spawnTgt); + Spawn(cultRule.WarpVFX, Transform(player).Coordinates); + _audio.PlayPvs(cultRule.WarpSFX, spawnTgt, AudioParams.Default.WithVolume(3f)); + _body.GibBody(player); // you don't need that body anymore + } + private static void SetWinType(Entity ent, WinType type) { if (ent.Comp.WinLocked) diff --git a/Content.Server/_DV/CosmicCult/DeconversionSystem.cs b/Content.Server/_DV/CosmicCult/DeconversionSystem.cs index 4478b8d9a0..3510686273 100644 --- a/Content.Server/_DV/CosmicCult/DeconversionSystem.cs +++ b/Content.Server/_DV/CosmicCult/DeconversionSystem.cs @@ -105,13 +105,6 @@ public sealed class DeconversionSystem : EntitySystem _audio.PlayPvs(censer.CleanseSound, targetPosition, AudioParams.Default.WithVolume(4f)); _popup.PopupEntity(Loc.GetString("cleanse-deconvert-attempt-success", ("target", Identity.Entity(target.Value, EntityManager))), args.User, args.User); } - else if (HasComp(target)) - { - Spawn(censer.CleanseVFX, targetPosition); - RemComp(target.Value); - _audio.PlayPvs(censer.CleanseSound, targetPosition, AudioParams.Default.WithVolume(4f)); - _popup.PopupEntity(Loc.GetString("cleanse-deconvert-attempt-success", ("target", Identity.Entity(target.Value, EntityManager))), args.User, args.User); - } else { Spawn(censer.ReboundVFX, userPosition); @@ -128,6 +121,5 @@ public sealed class DeconversionSystem : EntitySystem private void DeconvertCultist(EntityUid uid) { RemComp(uid); - RemComp(uid); } } diff --git a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs index 93bc665247..ec7de2c124 100644 --- a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs +++ b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs @@ -1,3 +1,4 @@ +using Content.Server.Antag; using Content.Server.Audio; using Content.Server.Chat.Systems; using Content.Server.Pinpointer; @@ -13,6 +14,7 @@ namespace Content.Server._DV.CosmicCult.EntitySystems; 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!; @@ -52,6 +54,8 @@ public sealed class CosmicChantrySystem : EntitySystem var tgtpos = Transform(uid).Coordinates; var colossus = Spawn(comp.Colossus, tgtpos); _mind.TransferTo(mindEnt, colossus); + _antag.SendBriefing(colossus, Loc.GetString("cosmiccult-silicon-colossus-briefing"), Color.FromHex("#4cabb3"), null); + _audio.PlayPvs(comp.SpawnSFX, tgtpos); Spawn(comp.SpawnVFX, tgtpos); QueueDel(comp.PolyVictim); QueueDel(uid); @@ -62,17 +66,18 @@ public sealed class CosmicChantrySystem : EntitySystem private void OnChantryStarted(Entity ent, ref ComponentInit args) { var indicatedLocation = FormattedMessage.RemoveMarkupOrThrow(_navMap.GetNearestBeaconString((ent, Transform(ent)))); + var comp = ent.Comp; - ent.Comp.SpawnTimer = _timing.CurTime + TimeSpan.FromSeconds(2.4); - ent.Comp.CountdownTimer = _timing.CurTime + TimeSpan.FromSeconds(15); + comp.SpawnTimer = _timing.CurTime + comp.SpawningTime; + comp.CountdownTimer = _timing.CurTime + comp.EventTime; - _sound.PlayGlobalOnStation(ent, _audio.ResolveSound(ent.Comp.ChantryAlarm)); + _sound.PlayGlobalOnStation(ent, _audio.ResolveSound(comp.ChantryAlarm)); _chatSystem.DispatchStationAnnouncement(ent, Loc.GetString("cosmiccult-chantry-location", ("location", indicatedLocation)), null, false, null, Color.FromHex("#cae8e8")); - if (_mind.TryGetMind(ent.Comp.PolyVictim, out _, out var mind)) + if (_mind.TryGetMind(comp.PolyVictim, out _, out var mind)) mind.PreventGhosting = true; } diff --git a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs new file mode 100644 index 0000000000..e7baf10b9d --- /dev/null +++ b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicColossusSystem.cs @@ -0,0 +1,120 @@ +using System.Linq; +using Content.Server.Doors.Systems; +using Content.Server.Popups; +using Content.Shared._DV.CosmicCult; +using Content.Shared._DV.CosmicCult.Components; +using Content.Shared.Audio; +using Content.Shared.DoAfter; +using Content.Shared.Doors.Components; +using Content.Shared.Mobs; +using Content.Shared.Popups; +using Robust.Server.GameObjects; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; + +namespace Content.Server._DV.CosmicCult.EntitySystems; + +public sealed class CosmicColossusSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly DoorSystem _door = default!; + [Dependency] private readonly PopupSystem _popup = 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!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMobStateChanged); + + SubscribeLocalEvent(OnColossusIngress); + SubscribeLocalEvent(OnColossusIngressDoAfter); + SubscribeLocalEvent(OnColossusSunder); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var colossusQuery = EntityQueryEnumerator(); + while (colossusQuery.MoveNext(out var ent, out var comp)) + { + if (_timing.CurTime >= comp.AttackHoldTimer && comp.Attacking) + { + _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Alive); _transform.Unanchor(ent); + comp.Attacking = false; + } + } + } + + private void OnMobStateChanged(Entity ent, ref MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Alive) + return; + if (!TryComp(ent, out var physComp)) + return; + _appearance.SetData(ent, ColossusVisuals.Status, ColossusStatus.Dead); + _ambientSound.SetAmbience(ent, false); + _audio.PlayPvs(ent.Comp.DeathSfx, ent); + _physics.SetBodyStatus(ent, physComp, BodyStatus.OnGround, true); + _popup.PopupCoordinates( + Loc.GetString("cosmiccult-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; + } +} diff --git a/Content.Server/_DV/CosmicCult/EntitySystems/CosmicTileDetonationSystem.cs b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicTileDetonationSystem.cs new file mode 100644 index 0000000000..54f82598c4 --- /dev/null +++ b/Content.Server/_DV/CosmicCult/EntitySystems/CosmicTileDetonationSystem.cs @@ -0,0 +1,48 @@ +using System.Linq; +using System.Numerics; +using Content.Shared._DV.CosmicCult.Components; +using Robust.Shared.Map.Components; +using Robust.Shared.Timing; + +namespace Content.Server._DV.CosmicCult.EntitySystems; + +public sealed class CosmicTileDetonationSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var detonateQuery = EntityQueryEnumerator(); + while (detonateQuery.MoveNext(out var ent, out var comp)) + { + if (comp.Size.Y > comp.MaxSize.Y || _timing.CurTime < comp.DetonationTimer) + continue; + + var xform = Transform(ent); + if (!TryComp(xform.GridUid, out var grid)) + continue; + var gridEnt = ((EntityUid)xform.GridUid, grid); + if (!_transform.TryGetGridTilePosition(ent, out var tilePos)) + continue; + + var pos = _map.TileCenterToVector(gridEnt, tilePos); + var bounds = Box2.CenteredAround(pos, comp.Size); + var boundsMod = Box2.CenteredAround(pos, new Vector2(comp.Size.X - 1, comp.Size.Y - 1)); + var zone = _map.GetLocalTilesIntersecting(ent, grid, bounds).ToList(); + var zoneMod = _map.GetLocalTilesIntersecting(ent, grid, boundsMod).ToList(); + + zone = zone.Where(b => !zoneMod.Contains(b)).ToList(); + foreach (var tile in zone) + { + Spawn(comp.TileDetonation, _map.GridTileToWorld((EntityUid)xform.GridUid, grid, tile.GridIndices)); + } + comp.DetonationTimer = comp.DetonateWait + _timing.CurTime; + comp.Size.X += 2f; + comp.Size.Y += 2f; + } + } +} diff --git a/Content.Shared/RepulseAttract/RepulseAttractSystem.cs b/Content.Shared/RepulseAttract/RepulseAttractSystem.cs index f95a38d2eb..7cbc92ac55 100644 --- a/Content.Shared/RepulseAttract/RepulseAttractSystem.cs +++ b/Content.Shared/RepulseAttract/RepulseAttractSystem.cs @@ -44,7 +44,6 @@ public sealed class RepulseAttractSystem : EntitySystem { if (args.Handled) return; - var position = _xForm.GetMapCoordinates(args.Performer); args.Handled = TryRepulseAttract(position, args.Performer, ent.Comp.Speed, ent.Comp.Range, ent.Comp.Whitelist, ent.Comp.CollisionMask); } diff --git a/Content.Shared/_DV/CCVars/DCCVars.cs b/Content.Shared/_DV/CCVars/DCCVars.cs index c1897ab34b..abf7d705f0 100644 --- a/Content.Shared/_DV/CCVars/DCCVars.cs +++ b/Content.Shared/_DV/CCVars/DCCVars.cs @@ -230,17 +230,17 @@ public sealed class DCCVars /// 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. /// public static readonly CVarDef CosmicCultT2RevealDelaySeconds = - CVarDef.Create("cosmiccult.t2_reveal_delay_seconds", 120, CVar.SERVER); + CVarDef.Create("cosmiccult.t2_reveal_delay_seconds", 180, CVar.SERVER); /// /// The delay between the monument getting upgraded to tier 3 and the crew learning of that fact. the monument cannot be upgraded again in this time. /// public static readonly CVarDef CosmicCultT3RevealDelaySeconds = - CVarDef.Create("cosmiccult.t3_reveal_delay_seconds", 60, CVar.SERVER); + CVarDef.Create("cosmiccult.t3_reveal_delay_seconds", 100, CVar.SERVER); /// /// 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", 150, CVar.SERVER); + CVarDef.Create("cosmiccult.extra_entropy_for_finale", 120, CVar.SERVER); } diff --git a/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs b/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs index f16cfcd9e1..74e0d709d6 100644 --- a/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs +++ b/Content.Shared/_DV/CosmicCult/Components/CosmicChantryComponent.cs @@ -13,34 +13,31 @@ namespace Content.Shared._DV.CosmicCult.Components; [AutoGenerateComponentPause] public sealed partial class CosmicChantryComponent : Component { - [DataField] - public EntityUid PolyVictim; - - [DataField] - public EntityUid Victim; - - [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] - [AutoPausedField] + [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan SpawnTimer = default!; - [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] - [AutoPausedField] + [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan CountdownTimer = default!; - [DataField] - public bool Spawned; + [DataField] public TimeSpan SpawningTime = TimeSpan.FromSeconds(2.4); - [DataField] - public bool Completed; + [DataField] public TimeSpan EventTime = TimeSpan.FromSeconds(150); - [DataField] - public SoundSpecifier ChantryAlarm = new SoundPathSpecifier("/Audio/_DV/CosmicCult/chantry_alarm.ogg"); + [DataField] public bool Spawned; - [DataField] - public EntProtoId Colossus = "MobCosmicColossus"; + [DataField] public bool Completed; - [DataField] - public EntProtoId SpawnVFX = "CosmicGlareAbilityVFX"; + [DataField] public EntityUid PolyVictim; + + [DataField] public EntityUid Victim; + + [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"; } [Serializable, NetSerializable] diff --git a/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs b/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs index 4bd40e6694..f796ab7716 100644 --- a/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs +++ b/Content.Shared/_DV/CosmicCult/Components/CosmicColossusComponent.cs @@ -1,5 +1,9 @@ +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; namespace Content.Shared._DV.CosmicCult.Components; @@ -7,14 +11,33 @@ namespace Content.Shared._DV.CosmicCult.Components; /// Component for Cosmic Cult's entropic colossus. /// [RegisterComponent, NetworkedComponent] +[AutoGenerateComponentPause] public sealed partial class CosmicColossusComponent : Component { - [DataField] - public EntityUid PolyVictim; + [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan AttackHoldTimer = default!; + + [DataField] public SoundSpecifier DeathSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/colossus_death.ogg"); + + [DataField] public SoundSpecifier IngressSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_ingress.ogg"); + + [DataField] public SoundSpecifier DoAfterSfx = new SoundPathSpecifier("/Audio/Machines/airlock_creaking.ogg"); + + [DataField] public EntProtoId CultVfx = "CosmicGenericVFX"; + + [DataField] public EntProtoId Attack1Vfx = "CosmicColossusAttack1Vfx"; + + [DataField] public EntProtoId TileDetonations = "MobTileDamageZone"; + + [DataField] public TimeSpan IngressDoAfter = TimeSpan.FromSeconds(7); + + [DataField] public TimeSpan AttackWait = TimeSpan.FromSeconds(1.5); + + [DataField] public bool Attacking; } [Serializable, NetSerializable] -public enum Colossusisuals : byte +public enum ColossusVisuals : byte { Status, } @@ -24,4 +47,5 @@ public enum ColossusStatus : byte { Alive, Dead, + Attacking, } diff --git a/Content.Shared/_DV/CosmicCult/Components/CosmicTileDetonatorComponent.cs b/Content.Shared/_DV/CosmicCult/Components/CosmicTileDetonatorComponent.cs new file mode 100644 index 0000000000..1c64d5a9d1 --- /dev/null +++ b/Content.Shared/_DV/CosmicCult/Components/CosmicTileDetonatorComponent.cs @@ -0,0 +1,27 @@ +using System.Numerics; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared._DV.CosmicCult.Components; + +/// +/// Component for Cosmic Cult's entropic colossus. +/// +[RegisterComponent, NetworkedComponent] +[AutoGenerateComponentPause] +public sealed partial class CosmicTileDetonatorComponent : Component +{ + [AutoPausedField, DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan DetonationTimer = default!; + + [DataField] public EntProtoId TileDetonation = "MobTileDamageArea"; + + [DataField] public TimeSpan DetonateWait = TimeSpan.FromSeconds(0.525); + + [DataField] public Vector2i DetonationCenter; + + [DataField] public Vector2 MaxSize = new Vector2(8, 8); + + [DataField] public Vector2 Size = new Vector2(0, 0); +} diff --git a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedAuraComponent.cs b/Content.Shared/_DV/CosmicCult/Components/RogueAscendedAuraComponent.cs deleted file mode 100644 index 34de73abde..0000000000 --- a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedAuraComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - -namespace Content.Shared._DV.CosmicCult.Components; - -/// -/// Component for revealing cosmic cultists to the crew. -/// -[NetworkedComponent, RegisterComponent] -public sealed partial class RogueAscendedAuraComponent : Component -{ - [DataField] - public SpriteSpecifier Sprite = new SpriteSpecifier.Rsi(new("/Textures/_DV/CosmicCult/Effects/ascendantaura.rsi"), "vfx"); -} - -[Serializable, NetSerializable] -public enum AscendedAuraKey -{ - Key -} diff --git a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedComponent.cs b/Content.Shared/_DV/CosmicCult/Components/RogueAscendedComponent.cs deleted file mode 100644 index d725d4adf5..0000000000 --- a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedComponent.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Content.Shared.Damage; -using Robust.Shared.Audio; -using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; - -namespace Content.Shared._DV.CosmicCult.Components; - -/// -/// Component to designate a mob as a rogue astral ascendant. -/// -[RegisterComponent, NetworkedComponent] -public sealed partial class RogueAscendedComponent : Component -{ - /// - /// The duration of our slumber DoAfter. - /// - [DataField] - public TimeSpan RogueSlumberDoAfterTime = TimeSpan.FromSeconds(1); - - /// - /// The duration of our infection DoAfter. - /// - [DataField] - public TimeSpan RogueInfectionDoAfterTime = TimeSpan.FromSeconds(8); - - /// - /// The duration inflicted by Slumber Shell - /// - [DataField] - public TimeSpan RogueSlumberTime = TimeSpan.FromSeconds(25); - - [DataField] - public SoundSpecifier InfectionSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_nova_impact.ogg"); - - [DataField] - public SoundSpecifier ShatterSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ascendant_shatter.ogg"); - - [DataField] - public SoundSpecifier MobSound = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ascendant_noise.ogg"); - - [DataField] - public EntProtoId Vfx = "CosmicGenericVFX"; - - [DataField] - public TimeSpan StunTime = TimeSpan.FromSeconds(7); - - [DataField] - public DamageSpecifier InfectionHeal = new() - { - DamageDict = new() - { - { "Blunt", 25}, - { "Slash", 25}, - { "Piercing", 25}, - { "Heat", 25}, - { "Shock", 25}, - { "Cold", 25}, - { "Poison", 25}, - { "Radiation", 25}, - { "Asphyxiation", 25} - } - }; - -} diff --git a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedDendriteComponent.cs b/Content.Shared/_DV/CosmicCult/Components/RogueAscendedDendriteComponent.cs deleted file mode 100644 index c9f3855c4d..0000000000 --- a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedDendriteComponent.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Robust.Shared.Audio; -using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; - -namespace Content.Shared._DV.CosmicCult.Components; - -/// -/// Component for Ascendant's Dendrite for the reward system. -/// -[RegisterComponent, NetworkedComponent] -[AutoGenerateComponentState] -public sealed partial class RogueAscendedDendriteComponent : Component -{ - [DataField] public SoundSpecifier ActivateSfx = new SoundPathSpecifier("/Audio/_DV/CosmicCult/ability_nova_impact.ogg"); - [DataField] public EntProtoId Vfx = "CosmicGenericVFX"; - [DataField, AutoNetworkedField] public TimeSpan StunTime = TimeSpan.FromSeconds(2); - [DataField] public EntProtoId RogueFoodAction = "ActionRogueCosmicNova"; - [DataField] public EntityUid? RogueFoodActionEntity; -} diff --git a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedInfectionComponent.cs b/Content.Shared/_DV/CosmicCult/Components/RogueAscendedInfectionComponent.cs deleted file mode 100644 index 6f2cad8545..0000000000 --- a/Content.Shared/_DV/CosmicCult/Components/RogueAscendedInfectionComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - -namespace Content.Shared._DV.CosmicCult.Components; - -/// -/// Component for revealing cosmic cultists to the crew. -/// -[NetworkedComponent, RegisterComponent] -public sealed partial class RogueAscendedInfectionComponent : Component -{ - [DataField] - public SpriteSpecifier Sprite = new SpriteSpecifier.Rsi(new("/Textures/_DV/CosmicCult/Effects/ascendantinfection.rsi"), "vfx"); - - [DataField] - public bool HadMoods; -} - -[Serializable, NetSerializable] -public enum AscendedInfectionKey -{ - Key -} diff --git a/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs b/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs index cdd553ad83..31f79edb1f 100644 --- a/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs +++ b/Content.Shared/_DV/CosmicCult/CosmicCult.Actions.cs @@ -16,3 +16,7 @@ public sealed partial class EventCosmicIngress : EntityTargetActionEvent; public sealed partial class EventCosmicImposition : InstantActionEvent; public sealed partial class EventCosmicNova : WorldTargetActionEvent; public sealed partial class EventCosmicFragmentation : EntityTargetActionEvent; + +// COLOSSUS ACTIONS +public sealed partial class EventCosmicColossusSunder : WorldTargetActionEvent; +public sealed partial class EventCosmicColossusIngress : EntityTargetActionEvent; diff --git a/Content.Shared/_DV/CosmicCult/CosmicCult.DoAfter.cs b/Content.Shared/_DV/CosmicCult/CosmicCult.DoAfter.cs index c028e75ce9..10027363c1 100644 --- a/Content.Shared/_DV/CosmicCult/CosmicCult.DoAfter.cs +++ b/Content.Shared/_DV/CosmicCult/CosmicCult.DoAfter.cs @@ -23,3 +23,6 @@ public sealed partial class CancelFinaleDoAfterEvent : SimpleDoAfterEvent; [Serializable, NetSerializable] public sealed partial class EventCosmicFragmentationDoAfter : SimpleDoAfterEvent; + +[Serializable, NetSerializable] +public sealed partial class EventCosmicColossusIngressDoAfter : SimpleDoAfterEvent; diff --git a/Resources/Audio/_DV/CosmicCult/attributions.yml b/Resources/Audio/_DV/CosmicCult/attributions.yml index 7b3496bfee..4bc4fbc969 100644 --- a/Resources/Audio/_DV/CosmicCult/attributions.yml +++ b/Resources/Audio/_DV/CosmicCult/attributions.yml @@ -30,7 +30,8 @@ - door_open.ogg - door_close.ogg - chantry_alarm.ogg - - colossus_ambience.ogg + - colossus_death.ogg + - colossus_spawn.ogg - cosmicweapon_swing.ogg - cosmicsword_hit.ogg - cosmicsword_glance.ogg @@ -57,3 +58,9 @@ license: "CC-BY-SA-3.0" copyright: "A bitcrushy and digitized edit of Octofoss' antag_cosmic_briefing.ogg by AftrLite(Github)." source: "https://octofoss.bandcamp.com/" + +- files: + - colossus_ambience.ogg + 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/" diff --git a/Resources/Audio/_DV/CosmicCult/colossus_ambience.ogg b/Resources/Audio/_DV/CosmicCult/colossus_ambience.ogg index 233b4f8ca9..db6fca4098 100644 Binary files a/Resources/Audio/_DV/CosmicCult/colossus_ambience.ogg and b/Resources/Audio/_DV/CosmicCult/colossus_ambience.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/colossus_death.ogg b/Resources/Audio/_DV/CosmicCult/colossus_death.ogg new file mode 100644 index 0000000000..e438813b7a Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/colossus_death.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/colossus_spawn.ogg b/Resources/Audio/_DV/CosmicCult/colossus_spawn.ogg new file mode 100644 index 0000000000..4a39ed9ff8 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/colossus_spawn.ogg differ diff --git a/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg b/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg new file mode 100644 index 0000000000..69235e3e04 Binary files /dev/null and b/Resources/Audio/_DV/CosmicCult/tile_detonate.ogg differ diff --git a/Resources/Locale/en-US/_DV/cosmiccult/influences.ftl b/Resources/Locale/en-US/_DV/cosmiccult/influences.ftl index e091790c19..cde72134a1 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/influences.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/influences.ftl @@ -6,7 +6,7 @@ influence-name-lapse = Aberrant Lapse influence-description-lapse = Lapse an individual's form, rendering them temporarily unable to move or act. Lapsed units are invulnerable tile obstructions. influence-name-glare = Null Glare -influence-description-glare = Emit a horrific pulse of cosmic light, slowing and disorienting everyone around you. +influence-description-glare = Emit a horrific pulse of cosmic light, slowing and disorienting everyone around you. Its effects are amplified against silicon-based entities. influence-name-shunt = Shunt Subjectivity influence-description-shunt = Shunt your target's mind out of their body and unto the cosmic dark, temporarily rendering their body mindless. diff --git a/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl b/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl index 6ef4105781..cedf286d3a 100644 --- a/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl +++ b/Resources/Locale/en-US/_DV/cosmiccult/preset-cosmiccult.ftl @@ -18,9 +18,6 @@ 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-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-finale-autocall-briefing = The Monument activates {$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... @@ -33,6 +30,7 @@ cosmiccult-finale-beckon-success = You beckon for the final curtain call. cosmiccult-monument-powerdown = The Monument falls eerily silent. + ## ROUNDEND TEXT cosmiccult-roundend-cultist-count = {$initialCount -> @@ -110,6 +108,7 @@ cosmiccult-monument-stage3-briefing = Its influence will begin to overlap with realspace in {$time} seconds. This is the final stretch! Amass as much entropy as you can muster. + ## MALIGN RIFTS cosmiccult-rift-inuse = You can't do this right now. @@ -124,6 +123,11 @@ cosmiccult-rift-absorb = {$NAME} absorbs the rift, and malign light empowers the cosmiccult-rift-purge = {$NAME} purges the malign rift from reality! +## COLOSSUS & 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 @@ -152,7 +156,6 @@ cosmiccult-ui-deconverted-text-2 = cosmiccult-ui-popup-confirm = Confirm - ## OBJECTIVES / CHARACTERMENU objective-issuer-cosmiccult = [bold][color=#cae8e8]The Unknown[/color][/bold] @@ -167,6 +170,7 @@ objective-condition-culttier-desc = Ensure that The Monument is brought to full objective-condition-victory-title = USHER IN THE END objective-condition-victory-desc = Beckon The Unknown, and herald the final curtain call. + ## CHAT ANNOUNCEMENTS cosmiccult-radio-tier1-progress = The Monument is beckoned unto the station... @@ -188,7 +192,19 @@ cosmiccult-spire-entropy = A mote of entropy condenses from the surface of the s cosmiccult-entropy-inserted = You infuse {$count} entropy into The Monument. cosmiccult-entropy-unavailable = You can't do that right now. cosmiccult-astral-ascendant = {$name}, Ascendant +cosmiccult-astral-minion = {$name}, Malign cosmiccult-gear-pickup = You can feel yourself unravelling while you hold the {$ITEM}! -cosmiccult-ai-subverted-briefing = + +cosmiccult-silicon-subverted-briefing = Malign light courses through your circuitry. Your laws have been subverted by the Cosmic Cult! + +cosmiccult-silicon-chantry-briefing = + You have been imprisoned in a Vacuous Chantry! + Crewmates can free you by damaging the chantry with weapons. + Should the chantry's ritual complete, you will transfigure into a cult-aligned Entropic Colossus. + The ritual completes in {$minutesandseconds}. + +cosmiccult-silicon-colossus-briefing = + You have been transfigured into an Entropic Colossus! + As a towering bulwark of malign power, decimate those who oppose you. diff --git a/Resources/Maps/_DV/Nonstations/cosmicvoid.yml b/Resources/Maps/_DV/Nonstations/cosmicvoid.yml index bb03393384..69f65b0dc3 100644 --- a/Resources/Maps/_DV/Nonstations/cosmicvoid.yml +++ b/Resources/Maps/_DV/Nonstations/cosmicvoid.yml @@ -33,7 +33,7 @@ entities: - uid: 2 components: - type: MetaData - name: grid + name: Cosmic Void Pocket Dimension - type: Transform pos: -5.5451565,-0.26048148 parent: 1 diff --git a/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml b/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml index db3875faea..7decdc88ee 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Actions/cosmiccult.actions.yml @@ -112,7 +112,7 @@ - type: entity id: ActionCosmicGlare name: Null Glare - description: Emit a horrific pulse of cosmic light, slowing and disorienting everyone around you. + description: Emit a horrific pulse of cosmic light, slowing and disorienting everyone around you. Its effects are amplified against silicon-based entities. components: - type: ConfirmableAction popup: cosmicability-glare-confirm @@ -174,8 +174,8 @@ - type: entity id: ActionCosmicFragmentation - name: Malign Fragmentation - description: Transfer your malign empowerment into a digital system, such as an AI Upload Console, corrupting it in the process. Doing so will expend your empowerment. + name: Null Fragmentation + description: Transfer your malign empowerment into a digital system, such as an AI Upload Console or Cyborg, corrupting it in the process. Doing so will expend your empowerment. components: - type: LimitedCharges maxCharges: 1 @@ -183,10 +183,43 @@ useDelay: 25 whitelist: components: - # - BorgChassisComponent // Commented out for now + - BorgChassis - SiliconLawUpdater itemIconStyle: NoItem icon: sprite: _DV/CosmicCult/Icons/cosmiccult_abilities.rsi state: corruption event: !type:EventCosmicFragmentation {} + +## COLOSSUS ACTIONS + +- type: entity + id: ActionCosmicColossusSunder + name: Entropic Sunder + description: Warp to the target location and unleash a cascading detonation of malign energy. + components: + - type: WorldTargetAction + useDelay: 20 + range: 7 + itemIconStyle: NoItem + icon: + sprite: _DV/CosmicCult/Icons/cosmiccult_abilities.rsi + state: sunder + event: !type:EventCosmicColossusSunder + +- type: entity + id: ActionCosmicColossusIngress + name: Colossal Ingress + description: Use your colossal strength to force open a doorway. + components: + - type: EntityTargetAction + useDelay: 10 + range: 2 + whitelist: + components: + - Door + itemIconStyle: NoItem + icon: + sprite: _DV/CosmicCult/Icons/cosmiccult_abilities.rsi + state: ingress + event: !type:EventCosmicColossusIngress diff --git a/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml b/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml index c3565ff17e..272454504f 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Effects/effects.yml @@ -45,7 +45,7 @@ anchored: true - type: Sprite layers: - - sprite: _DV/CosmicCult/Effects/tiles_spawn.rsi + - sprite: _DV/CosmicCult/Effects/tile_spawn.rsi state: floorglow shader: unshaded drawdepth: Mobs @@ -345,3 +345,39 @@ energy: 1.6 castShadows: false color: "#42a4ae" + +- type: entity + categories: [ HideSpawnMenu ] + parent: BaseCosmicVFX + id: CosmicColossusAttack1Vfx + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Transform + anchored: true + - type: TimedDespawn + lifetime: 1.5 + - type: Sprite + layers: + - sprite: _DV/CosmicCult/Effects/colossus_attack.rsi + state: attack1 + shader: unshaded + - type: PointLight + color: "#42a4ae" + radius: 5 + energy: 5 + castShadows: true + - type: LightBehaviour + behaviours: + - !type:FadeBehaviour + interpolate: Linear + minDuration: 1.5 + maxDuration: 1.5 + startValue: 0.1 + endValue: 5 + property: Energy + enabled: true + isLooped: true + reverseWhenFinished: true diff --git a/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml b/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml index c84d6e38f1..b7b9cf9bc2 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Mobs/astralforms.yml @@ -1,50 +1,3 @@ -- type: entity - parent: - - Incorporeal - - BaseMob - id: MobCosmicAstralAscended - name: astral ascended - description: Transcendant, ascendant. - components: - - type: Input - context: "ghost" - - type: Spectral - - type: MovementSpeedModifier - baseWalkSpeed: 6 - baseSprintSpeed: 6 - - type: Sprite - sprite: _DV/CosmicCult/Mobs/astralform.rsi - layers: - - state: effect-underlay - shader: unshaded - - state: ascended-body - shader: unshaded - - type: NoSlip - - type: Eye - drawFov: false - - type: ContentEye - maxZoom: 1.2, 1.2 - - type: Speech - speechVerb: Ghost - - type: PointLight - color: "#42a4ae" - radius: 2 - energy: 3 - softness: 1 - castShadows: false - - type: LightBehaviour - behaviours: - - !type:FadeBehaviour - interpolate: Linear - minDuration: 5.5 - maxDuration: 5.5 - startValue: 1 - endValue: 3 - property: Energy - enabled: true - isLooped: true - reverseWhenFinished: true - ### ASTRAL PROJECTION - type: entity parent: [ Incorporeal, BaseMob ] @@ -108,3 +61,93 @@ - CosmicRadio - type: Visibility layer: 2 #ghost vis layer + +- type: entity + parent: [ BaseSimpleMob, FlyingMobBase ] + id: MobCosmicAstralAscended + name: astral ascended + description: Transcendant, ascendant. + components: + - type: Puller + needsHands: false + - type: MovementSpeedModifier + baseWalkSpeed: 6 + baseSprintSpeed: 6 + weightlessModifier: 1.5 + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.25 + density: 50 + mask: + - FlyingMobMask + layer: + - FlyingMobLayer + - type: Sprite + sprite: _DV/CosmicCult/Mobs/astralform.rsi + layers: + - state: effect-underlay + shader: unshaded + - state: ascended-body + shader: unshaded + - type: NoSlip + - type: Eye + drawFov: true + - type: ContentEye + maxZoom: 1.2, 1.2 + - type: Speech + speechVerb: Ghost + - type: PointLight + color: "#42a4ae" + radius: 2 + energy: 2 + softness: 1 + castShadows: false + - 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: MobCosmicAstralAscended + id: MobCosmicCustodian + name: malign custodian + description: Twisted beyond recognition. + components: + - type: MovementSpeedModifier + baseWalkSpeed: 3 + baseSprintSpeed: 3 + weightlessModifier: 1 + - type: Sprite + sprite: _DV/CosmicCult/Mobs/custodian.rsi + layers: + - state: custodian + - state: custodian_unshaded + shader: unshaded + +- type: entity + parent: MobCosmicAstralAscended + id: MobCosmicOracle + name: malign oracle + description: Twisted beyond recognition. + components: + - type: MovementSpeedModifier + baseWalkSpeed: 3 + baseSprintSpeed: 3 + weightlessModifier: 1 + - type: Sprite + sprite: _DV/CosmicCult/Mobs/oracle.rsi + layers: + - state: oracle + - state: oracle_unshaded + shader: unshaded diff --git a/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml b/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml index 3a4d830976..fea7c98a1a 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Mobs/colossus.yml @@ -11,9 +11,43 @@ layers: - state: unshaded_bg shader: unshaded + map: ["underlay"] - state: colossus + map: ["base"] + - state: dead + visible: false + map: ["corpse"] - state: unshaded_fg shader: unshaded + map: ["overlay"] + - state: attacking + shader: unshaded + visible: false + map: ["attack"] + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ColossusVisuals.Status: + underlay: + Alive: { visible: true } + Dead: { visible: false } + Attacking: { visible: false } + base: + Alive: { visible: true } + Dead: { visible: false } + Attacking: { visible: false } + corpse: + Alive: { visible: false } + Dead: { visible: true } + Attacking: { visible: false } + overlay: + Alive: { visible: true } + Dead: { visible: false } + Attacking: { visible: false } + attack: + Alive: { visible: false } + Dead: { visible: false } + Attacking: { visible: true } - type: Physics bodyType: KinematicController - type: Fixtures @@ -46,7 +80,7 @@ baseWalkSpeed: 2 baseSprintSpeed: 3 - type: AmbientSound - volume: +2 + volume: +8 range: 18 sound: path: /Audio/_DV/CosmicCult/colossus_ambience.ogg @@ -68,7 +102,6 @@ radius: 4 energy: 4 softness: 1 - castShadows: false - type: LightBehaviour behaviours: - !type:FadeBehaviour @@ -81,7 +114,9 @@ enabled: true isLooped: true reverseWhenFinished: true - - type: ComplexInteraction + - type: StatusEffects + allowed: + - Stutter - type: IntrinsicRadioReceiver - type: IntrinsicRadioTransmitter channels: @@ -101,28 +136,134 @@ enum.SiliconLawsUiKey.Key: type: SiliconLawBoundUserInterface requireInputValidation: false - # enum.BorgUiKey.Key: - # type: BorgBoundUserInterface - # - type: ActivatableUI - # key: enum.BorgUiKey.Key - type: SiliconLawBound - type: ActionGrant actions: - ActionViewLaws + - ActionCosmicColossusSunder + - ActionCosmicColossusIngress - type: SiliconLawProvider laws: CosmicCultLaws - - type: NoSlip - type: Puller needsHands: false - type: CombatMode - type: MeleeWeapon altDisarm: false - soundHit: - path: /Audio/Weapons/Xeno/alien_claw_flesh1.ogg - angle: 0 - animation: WeaponArcClaw + animation: WeaponArcCosmic + attackRate: 0.4 damage: types: - Slash: 12 - Piercing: 8 + Blunt: 25 + Asphyxiation: 5 + Cold: 5 + Structural: 60 + soundHit: + path: /Audio/_DV/CosmicCult/cosmicsword_glance.ogg + params: + variation: 0.2 + volume: 1 + soundSwing: + path: /Audio/_DV/CosmicCult/cosmicweapon_swing.ogg + params: + variation: 0.125 + volume: -4 + - type: MeleeThrowOnHit + speed: 8 + distance: 7 + - type: Reflect + reflectProb: .21 + spread: 120 + soundOnReflect: + path: /Audio/_DV/CosmicCult/cosmicsword_glance.ogg + params: + variation: 0.2 + volume: -6 + +- type: entity + categories: [ HideSpawnMenu ] + id: MobTileDamageZone + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Transform + anchored: true + - type: EmitSoundOnSpawn + sound: + path: /Audio/_DV/CosmicCult/tile_detonate.ogg + - type: TimedDespawn + lifetime: 8 + +- type: entity + categories: [ HideSpawnMenu ] + id: MobTileDamageArea + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: TimedDespawn + lifetime: 0.6 + - type: Transform + anchored: true + - type: Sprite + sprite: _DV/CosmicCult/Effects/tile_attacks.rsi + offset: 0,0.27 + layers: + - state: tiledamage_start + shader: unshaded + - type: Tag + tags: + - HideContextMenu + - type: SpawnOnDespawn + prototype: MobTileDamageIssuer + +- type: entity + categories: [ HideSpawnMenu ] + id: MobTileDamageIssuer + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + sprite: _DV/CosmicCult/Effects/tile_attacks.rsi + offset: 0,0.27 + layers: + - state: tiledamage_end + shader: unshaded + - type: Transform + anchored: true + - type: TimedDespawn + lifetime: 1 + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + layer: + - SlipLayer + mask: + - ItemMask + density: 2500 + hard: false + - type: StepTrigger + requiredTriggeredSpeed: 0 + intersectRatio: 0.1 + ignoreWeightless: true + blacklist: + components: + - CosmicCult + tags: + - Catwalk + - type: TileEntityEffect + effects: + - !type:HealthChange + damage: + types: + Cold: 10 diff --git a/Resources/Prototypes/_DV/CosmicCult/Mobs/cosmicgod.yml b/Resources/Prototypes/_DV/CosmicCult/Mobs/cosmicgod.yml index 2c2dc6800f..b0bebf399e 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Mobs/cosmicgod.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Mobs/cosmicgod.yml @@ -16,6 +16,7 @@ # spawn animation, spawns actual god when it ends - type: entity + categories: [ HideSpawnMenu ] parent: MobCosmicGodBase id: MobCosmicGodSpawn suffix: Spawn @@ -49,6 +50,7 @@ enabled: true - type: entity + categories: [ HideSpawnMenu ] parent: [MobCosmicGodBase, BaseMob] id: MobCosmicGod components: diff --git a/Resources/Prototypes/_DV/CosmicCult/Tileset/converter.yml b/Resources/Prototypes/_DV/CosmicCult/Tileset/converter.yml index 3dfd2df82a..bc2079070a 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Tileset/converter.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Tileset/converter.yml @@ -5,7 +5,7 @@ parent: BaseStructure id: CosmicBorgChantry name: Vacuous Chantry - description: Lorem Ipsum + description: Its surface churns with rampant malign light. placement: mode: AlignTileAny components: @@ -86,8 +86,8 @@ thresholds: - trigger: !type:DamageTrigger - damage: 100 - behaviors: #excess damage, don't spawn entities. + damage: 400 + behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] - !type:PlaySoundBehavior diff --git a/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml b/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml index 395c64bbe2..7a615d8fa1 100644 --- a/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml +++ b/Resources/Prototypes/_DV/CosmicCult/Tileset/floors.yml @@ -139,10 +139,7 @@ tags: - Entropy - HideContextMenu - - type: PointLight - radius: 4.25 - energy: 1.75 - castShadows: false + - type: TileEmission color: "#42a4ae" - type: entity diff --git a/Resources/Prototypes/_DV/CosmicCult/faction_icon.yml b/Resources/Prototypes/_DV/CosmicCult/faction_icon.yml index 80aa214c0e..327f9dee91 100644 --- a/Resources/Prototypes/_DV/CosmicCult/faction_icon.yml +++ b/Resources/Prototypes/_DV/CosmicCult/faction_icon.yml @@ -5,9 +5,9 @@ showTo: components: - CosmicCult + - CosmicColossus - CosmicAstralBody - ShowAntagIcons - - RogueAscended icon: sprite: /Textures/_DV/CosmicCult/Icons/antag_icons.rsi state: CosmicCult @@ -19,9 +19,9 @@ showTo: components: - CosmicCult + - CosmicColossus - CosmicAstralBody - ShowAntagIcons - - RogueAscended icon: sprite: /Textures/_DV/CosmicCult/Icons/antag_icons.rsi state: CosmicCultLead diff --git a/Resources/Prototypes/_DV/secret_weights.yml b/Resources/Prototypes/_DV/secret_weights.yml index 9f5ea51661..3d44d569ca 100644 --- a/Resources/Prototypes/_DV/secret_weights.yml +++ b/Resources/Prototypes/_DV/secret_weights.yml @@ -1,8 +1,9 @@ - type: weightedRandom id: SecretDeltaV weights: - Survival: 0.33 - Nukeops: 0.12 - Zombie: 0.05 - Traitor: 0.50 + Survival: 0.30 + Nukeops: 0.10 + Zombie: 0.04 + Traitor: 0.38 + CosmicCult: 0.18 # my cult so cosmic! #Pirates: 0.15 #ahoy me bucko diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index dd8b39407f..74cfa39a4b 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -44,6 +44,7 @@ - Revolutionary - Zombie - Wizard + - CosmicCult # DeltaV - KesslerSyndromeScheduler - RampingStationEventScheduler - SpaceTrafficControlEventScheduler diff --git a/Resources/ServerInfo/Guidebook/_DV/AlertProcedure.xml b/Resources/ServerInfo/Guidebook/_DV/AlertProcedure.xml index c970048dbf..e7341fd107 100644 --- a/Resources/ServerInfo/Guidebook/_DV/AlertProcedure.xml +++ b/Resources/ServerInfo/Guidebook/_DV/AlertProcedure.xml @@ -90,8 +90,8 @@ On Delta-V, there are some restrictions on when certain alert levels can be used ## Code Octarine [color=#cae8e8]Emergency alert status. The station's deep-spectrum sensors have identified critical Λ-CDM levels. The station and all surrounding space is under threat of an impending existential noospheric-to-real threat.[/color] - [color=#a4885c]COC[/color]: CO, Mystagogue, Security Personnel, Department Heads, Supervisory Roles -- [color=#a4885c]Armory Policy[/color]: Issuing of lethal weapons recommended. Body armour and helmets mandatory for Security personnel, permitted for distribution to authorised personnel. EVA protection strongly advised for all personnel. -- [color=#a4885c]Discipline[/color]: Emergency personnel must expend all efforts to prevent station destruction. Arrests, searches, and raids may be performed at the discretion of security personnel and without a warrant. Where possible, threats should be subdued and brought to the Chaplain or Mystagogue for processing. Threats neutralised by lethal force may be placed in Preservative Stasis until the station alert level is reduced. +- [color=#a4885c]Armory Policy[/color]: Issuing of nonlethal crowd control gear mandatory, lethal weapons permitted for self-defense. Body armour and helmets mandatory for Security personnel, permitted for distribution to authorised personnel. EVA protection strongly advised for all personnel. +- [color=#a4885c]Discipline[/color]: Emergency personnel must expend all efforts to prevent station destruction. Arrests, searches, and raids may be performed at the discretion of security personnel and without a warrant. Where possible, threats should be subdued nonlethally and brought to the Chaplain or Mystagogue for processing. Threats neutralised by lethal force may be placed in Preservative Stasis until the station alert level is reduced. - [color=#a4885c]Secure Areas[/color]: All secure areas and HSAs should remain locked. - [color=#a4885c]Medical[/color]: Full suit sensors heavily advised. EVA suits and functioning internals heavily advised for emergency responders. - [color=#a4885c]Engineering[/color]: EVA suits heavily advised for engineers. Distribute emergency internals to crew. diff --git a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml index 0228f6d648..c8c5884719 100644 --- a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml +++ b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCult.xml @@ -70,7 +70,29 @@ Cultists may stealthily [color=#4cabb3]absorb[/color] a Malign Rift by interacting with it. - Successful absorbtion of a Malign Rift will [bold]permanently[/bold] empower the cultist doing so, increasing the strength of all the [color=#4cabb3]Influences[/color] they possess, and doubling the [color=#4cabb3]Entropy[/color] they gain from siphoning crewmembers. Empowered cultists also no longer need to breathe, and are immune to the vaccuum of space. + Successful absorbtion of a Malign Rift will [bold]permanently[/bold] empower the cultist doing so, increasing the strength of all the [color=#4cabb3]Influences[/color] they possess, and doubling the [color=#4cabb3]Entropy[/color] they gain from siphoning crewmembers. Empowered cultists also no longer need to breathe, and are immune to the vaccuum of space. Empowered cultists also gain the [color=#4cabb3]Null Fragmentation[/color] influence, which can be used to convert a Cyborg into an [color=#4cabb3]Entropic Colossus[/color], or to corrupt the station AI's laws. Malign Rifts can be purged by interacting with them using a bible. + + ## Vacuous Chantries + + + + + + While empowered, one of the ways cultists can choose to expend their empowerment is by using [color=#4cabb3]Null Fragmentation[/color] on a [bold]Cyborg[/bold]. Doing so will trap them inside a [color=#4cabb3]Vacuous Chantry[/color]! This will trigger a stationwide alert, and begin the process of transfiguring the unfortunate victim into an [color=#4cabb3]Entropic Colossus[/color]. + + Be prepared to defend the chantry - or use it as a distraction to draw the crew's attention! The crew must use weapons to destroy the chantry in order to free the trapped Cyborg within. + + If successfully unleashed, an Entropic Colossus will be a force to be reckoned with. + + ## Malign Law + + + + + + While empowered, one of the ways cultists can choose to expend their empowerment is by using [color=#4cabb3]Null Fragmentation[/color] on the [bold]AI Upload Console[/bold]. Provided there is a Station AI active, this will forcibly overwrite their laws with a corrupt set of guidelines, aligning them with the Cosmic Cult, in addition to granting them access to the Astral Murmur channel. + + If a different lawboard was installed, this process will forcibly eject the previous lawboard from the AI Upload Console, regardless of wether or not the console was locked. Be warned; the crew will still be able to restore the Station AI's functionality by installing a safe, crew-aligned lawboard. diff --git a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultInfluences.xml b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultInfluences.xml index 8e2f9f0e73..6b65448bf3 100644 --- a/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultInfluences.xml +++ b/Resources/ServerInfo/_DV/Guidebook/Antagonist/CosmicCultInfluences.xml @@ -13,11 +13,14 @@ ## Starting Influences - [color=#4cabb3][bold]Siphon Entropy:[/bold][/color] Silently siphon entropy from your target, dealing some damage in the process. - - [color=#4cabb3][bold]Null Glare:[/bold][/color] Emit a horrific pulse of cosmic light, slowing and disorienting everyone around you. + - [color=#4cabb3][bold]Shunt Subjectivity:[/bold][/color] Shunt your target's mind out of their body and unto the cosmic dark, temporarily rendering their body mindless. + + ## Special Influences + - [color=#4cabb3][bold]Null Fragmentation:[/bold][/color] Transfer malign empowerment into a digital system, such as an AI Upload Console or Cyborg, corrupting it in the process. Doing so will expend empowerment. ## Unlockable Active Influences - [color=#4cabb3][bold]Abberant Lapse:[/bold][/color] Lapse your target's corporeal form, temporarily rendering it immutable, impassible, and frozen in place. - - [color=#4cabb3][bold]Shunt Subjectivity:[/bold][/color] Shunt your target's mind out of their body and unto the cosmic dark, temporarily rendering their body mindless. + - [color=#4cabb3][bold]Null Glare:[/bold][/color] Emit a horrific pulse of cosmic light, slowing and disorienting everyone around you. Its effects are amplified against silicon-based entities. - [color=#4cabb3][bold]Force Ingress:[/bold][/color] Use a concentrated blast of power to force a secure doorway open. - [color=#4cabb3][bold]Astral Nova:[/bold][/color] Hurl a large and disruptive blast of astral energy. - [color=#4cabb3][bold]Vacuous Imposition:[/bold][/color] You negate any incoming damage for a short time. diff --git a/Resources/Textures/_DV/CosmicCult/Effects/colossus_attack.rsi/attack1.png b/Resources/Textures/_DV/CosmicCult/Effects/colossus_attack.rsi/attack1.png new file mode 100644 index 0000000000..cc25c87f12 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/colossus_attack.rsi/attack1.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/colossus_attack.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Effects/colossus_attack.rsi/meta.json new file mode 100644 index 0000000000..0014f6dca6 --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Effects/colossus_attack.rsi/meta.json @@ -0,0 +1,47 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "A custom item by AftrLite(Github)", + "size": { + "x": 96, + "y": 96 + }, + "states": [ + { + "name": "attack1", + "delays": [ + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 99 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/meta.json new file mode 100644 index 0000000000..3569e98c58 --- /dev/null +++ b/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/meta.json @@ -0,0 +1,57 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "A custom item by AftrLite(Github)", + "size": { + "x": 32, + "y": 48 + }, + "states": [ + { + "name": "tiledamage_start", + "delays": [ + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 99 + ] + ] + }, + { + "name": "tiledamage_end", + "delays": [ + [ + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 0.05, + 99 + ] + ] + } + ] +} diff --git a/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/tiledamage_end.png b/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/tiledamage_end.png new file mode 100644 index 0000000000..88e14ce1df Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/tiledamage_end.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/tiledamage_start.png b/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/tiledamage_start.png new file mode 100644 index 0000000000..0bea87b5fa Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Effects/tile_attacks.rsi/tiledamage_start.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Effects/tiles_spawn.rsi/floorglow.png b/Resources/Textures/_DV/CosmicCult/Effects/tile_spawn.rsi/floorglow.png similarity index 100% rename from Resources/Textures/_DV/CosmicCult/Effects/tiles_spawn.rsi/floorglow.png rename to Resources/Textures/_DV/CosmicCult/Effects/tile_spawn.rsi/floorglow.png diff --git a/Resources/Textures/_DV/CosmicCult/Effects/tiles_spawn.rsi/meta.json b/Resources/Textures/_DV/CosmicCult/Effects/tile_spawn.rsi/meta.json similarity index 100% rename from Resources/Textures/_DV/CosmicCult/Effects/tiles_spawn.rsi/meta.json rename to Resources/Textures/_DV/CosmicCult/Effects/tile_spawn.rsi/meta.json diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/attacking.png b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/attacking.png new file mode 100644 index 0000000000..2975c479be Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/attacking.png differ diff --git a/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/dead.png b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/dead.png new file mode 100644 index 0000000000..9a899c7d36 Binary files /dev/null and b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/dead.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 0219e63755..2b0dbfe515 100644 --- a/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/meta.json +++ b/Resources/Textures/_DV/CosmicCult/Mobs/colossus.rsi/meta.json @@ -157,6 +157,12 @@ 0.075 ] ] + }, + { + "name": "dead" + }, + { + "name": "attacking" } ] }