diff --git a/.github/workflows/build-map-renderer.yml b/.github/workflows/build-map-renderer.yml index 35aed1a7f7f..01575f64b9b 100644 --- a/.github/workflows/build-map-renderer.yml +++ b/.github/workflows/build-map-renderer.yml @@ -10,7 +10,7 @@ on: jobs: build: - if: github.actor != 'PJBot' && github.event.pull_request.draft == false + if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'DeltaV-Bot' strategy: matrix: os: [ubuntu-latest] diff --git a/.github/workflows/build-test-debug.yml b/.github/workflows/build-test-debug.yml index 47f9fd1a514..519f5af6f49 100644 --- a/.github/workflows/build-test-debug.yml +++ b/.github/workflows/build-test-debug.yml @@ -10,7 +10,7 @@ on: jobs: build: - if: github.actor != 'PJBot' && github.event.pull_request.draft == false + if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'DeltaV-Bot' strategy: matrix: os: [ubuntu-latest] diff --git a/.github/workflows/conflict-labeler.yml b/.github/workflows/conflict-labeler.yml index 1a9b91601dc..a47965334c5 100644 --- a/.github/workflows/conflict-labeler.yml +++ b/.github/workflows/conflict-labeler.yml @@ -8,7 +8,7 @@ on: jobs: Label: - if: github.actor != 'PJBot' + if: github.actor != 'PJBot' && github.actor != 'DeltaV-Bot' runs-on: ubuntu-latest steps: - name: Check for Merge Conflicts diff --git a/.github/workflows/labeler-pr.yml b/.github/workflows/labeler-pr.yml index 711eb0ccac0..e1755aa26e3 100644 --- a/.github/workflows/labeler-pr.yml +++ b/.github/workflows/labeler-pr.yml @@ -5,7 +5,7 @@ on: jobs: labeler: - if: github.actor != 'PJBot' + if: github.actor != 'PJBot' && github.actor != 'DeltaV-Bot' runs-on: ubuntu-latest steps: - uses: actions/labeler@v3 diff --git a/.github/workflows/test-packaging.yml b/.github/workflows/test-packaging.yml index 2dce502697d..ccece69adb6 100644 --- a/.github/workflows/test-packaging.yml +++ b/.github/workflows/test-packaging.yml @@ -29,7 +29,7 @@ on: jobs: build: name: Test Packaging - if: github.actor != 'PJBot' && github.event.pull_request.draft == false + if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'DeltaV-Bot' runs-on: ubuntu-latest steps: diff --git a/.github/workflows/validate-rgas.yml b/.github/workflows/validate-rgas.yml index 2c4bb40fdf3..0ed04021ebd 100644 --- a/.github/workflows/validate-rgas.yml +++ b/.github/workflows/validate-rgas.yml @@ -9,7 +9,7 @@ on: jobs: yaml-schema-validation: name: YAML RGA schema validator - if: github.actor != 'PJBot' && github.event.pull_request.draft == false + if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'DeltaV-Bot' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3.6.0 diff --git a/.github/workflows/validate_mapfiles.yml b/.github/workflows/validate_mapfiles.yml index fb11e1a4697..43d77841a86 100644 --- a/.github/workflows/validate_mapfiles.yml +++ b/.github/workflows/validate_mapfiles.yml @@ -9,7 +9,7 @@ on: jobs: yaml-schema-validation: name: YAML map schema validator - if: github.actor != 'PJBot' && github.event.pull_request.draft == false + if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'DeltaV-Bot' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3.6.0 diff --git a/.github/workflows/yaml-linter.yml b/.github/workflows/yaml-linter.yml index 691eb29f1de..796795b234d 100644 --- a/.github/workflows/yaml-linter.yml +++ b/.github/workflows/yaml-linter.yml @@ -10,7 +10,7 @@ on: jobs: build: name: YAML Linter - if: github.actor != 'PJBot' && github.event.pull_request.draft == false + if: github.actor != 'PJBot' && github.event.pull_request.draft == false && github.actor != 'DeltaV-Bot' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3.6.0 diff --git a/Content.Client/DeltaV/Harpy/HarpyVisualsComponent.cs b/Content.Client/DeltaV/Harpy/HarpyVisualsComponent.cs new file mode 100644 index 00000000000..1c3253c74ef --- /dev/null +++ b/Content.Client/DeltaV/Harpy/HarpyVisualsComponent.cs @@ -0,0 +1,5 @@ +namespace Content.Client.DeltaV.Harpy; + +[RegisterComponent] +public sealed partial class HarpyVisualsComponent : Component +{ } diff --git a/Content.Client/DeltaV/Overlays/UltraVisionOverlay.cs b/Content.Client/DeltaV/Overlays/UltraVisionOverlay.cs new file mode 100644 index 00000000000..73c05e052b6 --- /dev/null +++ b/Content.Client/DeltaV/Overlays/UltraVisionOverlay.cs @@ -0,0 +1,44 @@ +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; +using Content.Shared.Abilities; + +namespace Content.Client.DeltaV.Overlays; + +public sealed partial class UltraVisionOverlay : Overlay +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] IEntityManager _entityManager = default!; + + + public override bool RequestScreenTexture => true; + public override OverlaySpace Space => OverlaySpace.WorldSpace; + private readonly ShaderInstance _ultraVisionShader; + + public UltraVisionOverlay() + { + IoCManager.InjectDependencies(this); + _ultraVisionShader = _prototypeManager.Index("UltraVision").Instance().Duplicate(); + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture == null) + return; + if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} player) + return; + if (!_entityManager.HasComponent(player)) + return; + + _ultraVisionShader?.SetParameter("SCREEN_TEXTURE", ScreenTexture); + + + var worldHandle = args.WorldHandle; + var viewport = args.WorldBounds; + worldHandle.SetTransform(Matrix3.Identity); + worldHandle.UseShader(_ultraVisionShader); + worldHandle.DrawRect(viewport, Color.White); + } +} diff --git a/Content.Client/DeltaV/Overlays/UltraVisionSystem.cs b/Content.Client/DeltaV/Overlays/UltraVisionSystem.cs new file mode 100644 index 00000000000..00a0f362421 --- /dev/null +++ b/Content.Client/DeltaV/Overlays/UltraVisionSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared.Abilities; +using Robust.Client.Graphics; + +namespace Content.Client.DeltaV.Overlays; + +public sealed partial class UltraVisionSystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlayMan = default!; + + private UltraVisionOverlay _overlay = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUltraVisionInit); + SubscribeLocalEvent(OnUltraVisionShutdown); + + _overlay = new(); + } + + private void OnUltraVisionInit(EntityUid uid, UltraVisionComponent component, ComponentInit args) + { + _overlayMan.AddOverlay(_overlay); + } + + private void OnUltraVisionShutdown(EntityUid uid, UltraVisionComponent component, ComponentShutdown args) + { + _overlayMan.RemoveOverlay(_overlay); + } +} diff --git a/Content.Client/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Client/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs new file mode 100644 index 00000000000..f9427362a66 --- /dev/null +++ b/Content.Client/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Nyanotrasen.Item.PseudoItem; + +namespace Content.Client.Nyanotrasen.Item.PseudoItem; + +public sealed class PseudoItemSystem : SharedPseudoItemSystem +{ +} diff --git a/Content.Server/DeltaV/ParadoxAnomaly/Components/ParadoxAnomalySpawner.cs b/Content.Server/DeltaV/ParadoxAnomaly/Components/ParadoxAnomalySpawner.cs new file mode 100644 index 00000000000..c3264584a1c --- /dev/null +++ b/Content.Server/DeltaV/ParadoxAnomaly/Components/ParadoxAnomalySpawner.cs @@ -0,0 +1,17 @@ +using Content.Server.DeltaV.ParadoxAnomaly.Systems; +using Robust.Shared.Prototypes; + +namespace Content.Server.DeltaV.ParadoxAnomaly.Components; + +/// +/// Creates a random paradox anomaly and tranfers mind to it when taken by a player. +/// +[RegisterComponent, Access(typeof(ParadoxAnomalySystem))] +public sealed partial class ParadoxAnomalySpawnerComponent : Component +{ + /// + /// Antag game rule to start for the paradox anomaly. + /// + [DataField] + public EntProtoId Rule = "ParadoxAnomaly"; +} diff --git a/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs new file mode 100644 index 00000000000..62d994dac34 --- /dev/null +++ b/Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs @@ -0,0 +1,164 @@ +using Content.Server.DeltaV.ParadoxAnomaly.Components; +using Content.Server.DetailExaminable; +using Content.Server.GenericAntag; +using Content.Server.Ghost.Roles; +using Content.Server.Ghost.Roles.Components; +using Content.Server.Psionics; +using Content.Server.Spawners.Components; +using Content.Server.Station.Systems; +using Content.Server.Terminator.Systems; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Utility; +using System.Diagnostics.CodeAnalysis; + +namespace Content.Server.DeltaV.ParadoxAnomaly.Systems; + +/// +/// 90% of the work is done by exterminator since its a reskin. +/// All the logic here is spawning since thats tricky. +/// +public sealed class ParadoxAnomalySystem : EntitySystem +{ + [Dependency] private readonly GenericAntagSystem _genericAntag = default!; + [Dependency] private readonly GhostRoleSystem _ghostRole = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly PsionicsSystem _psionics = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly StationSpawningSystem _stationSpawning = default!; + [Dependency] private readonly TerminatorSystem _terminator = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTakeGhostRole); + } + + private void OnTakeGhostRole(Entity ent, ref TakeGhostRoleEvent args) + { + Log.Info($"Using paradox anomaly spawner {ent}"); + if (!TrySpawnParadoxAnomaly(ent.Comp.Rule, out var twin)) + return; + + Log.Info($"Created paradox anomaly {ToPrettyString(twin):twin}"); + var role = Comp(ent); + _ghostRole.GhostRoleInternalCreateMindAndTransfer(args.Player, ent, twin.Value, role); + _ghostRole.UnregisterGhostRole((ent.Owner, role)); + + args.TookRole = true; + QueueDel(ent); + } + + private bool TrySpawnParadoxAnomaly(string rule, [NotNullWhen(true)] out EntityUid? twin) + { + twin = null; + + // Get a list of potential candidates + var candidates = new List<(EntityUid, EntityUid, SpeciesPrototype, HumanoidCharacterProfile)>(); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var mindContainer, out var humanoid)) + { + if (humanoid.LastProfileLoaded is not {} profile) + continue; + + if (!_proto.TryIndex(humanoid.Species, out var species)) + continue; + + if (_mind.GetMind(uid, mindContainer) is not {} mindId || !HasComp(mindId)) + continue; + + if (_role.MindIsAntagonist(mindId)) + continue; + + // TODO: when metempsychosis real skip whoever has Karma + + candidates.Add((uid, mindId, species, profile)); + } + + twin = SpawnParadoxAnomaly(candidates, rule); + return twin != null; + } + + private EntityUid? SpawnParadoxAnomaly(List<(EntityUid, EntityUid, SpeciesPrototype, HumanoidCharacterProfile)> candidates, string rule) + { + // Select a candidate. + if (candidates.Count == 0) + return null; + + var (uid, mindId, species, profile) = _random.Pick(candidates); + var jobId = Comp(mindId).Prototype; + var job = _proto.Index(jobId!); + + // Find a suitable spawn point. + var station = _station.GetOwningStation(uid); + var latejoins = new List(); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var spawnUid, out var spawnPoint)) + { + if (spawnPoint.SpawnType != SpawnPointType.LateJoin) + continue; + + if (_station.GetOwningStation(spawnUid) == station) + latejoins.Add(spawnUid); + } + + if (latejoins.Count == 0) + return null; + + // Spawn the twin. + var destination = Transform(_random.Pick(latejoins)).Coordinates; + var spawned = Spawn(species.Prototype, destination); + + // Set the kill target to the chosen player + _terminator.SetTarget(spawned, mindId); + _genericAntag.MakeAntag(spawned, rule); + + ////////////////////////// + // /!\ WARNING /!\ // + // MAJOR SHITCODE BELOW // + // /!\ WARNING /!\ // + ////////////////////////// + + // Copy the details. + _humanoid.LoadProfile(spawned, profile); + _metaData.SetEntityName(spawned, Name(uid)); + + if (TryComp(uid, out var detail)) + { + var detailCopy = EnsureComp(spawned); + detailCopy.Content = detail.Content; + } + + if (job.StartingGear != null && _proto.TryIndex(job.StartingGear, out var gear)) + { + _stationSpawning.EquipStartingGear(spawned, gear, profile); + _stationSpawning.EquipIdCard(spawned, + profile.Name, + job, + station); + } + + foreach (var special in job.Special) + { + special.AfterEquip(spawned); + } + + var psi = EnsureComp(spawned); + _psionics.RollPsionics(spawned, psi, false, 100); + + return spawned; + } +} diff --git a/Content.Server/GenericAntag/GenericAntagSystem.cs b/Content.Server/GenericAntag/GenericAntagSystem.cs index 6b1774159c1..8b7a16a4cb2 100644 --- a/Content.Server/GenericAntag/GenericAntagSystem.cs +++ b/Content.Server/GenericAntag/GenericAntagSystem.cs @@ -57,6 +57,14 @@ public void MakeAntag(EntityUid uid, EntityUid mindId, GenericAntagComponent? co _mind.TryAddObjective(mindId, mind, id); } } + + /// + /// DeltaV - used by paradox anomaly + /// + public void MakeAntag(EntityUid uid, string rule) + { + AddComp(uid).Rule = rule; + } } /// diff --git a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs index 36ab038562b..770e9fc39b3 100644 --- a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs +++ b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.cs @@ -64,6 +64,8 @@ public void CloneAppearance(EntityUid source, EntityUid target, HumanoidAppearan grammar.Gender = sourceHumanoid.Gender; } + targetHumanoid.LastProfileLoaded = sourceHumanoid.LastProfileLoaded; // DeltaV - let paradox anomaly be cloned + Dirty(targetHumanoid); } diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs index 03c494332cf..76cfe7d904b 100644 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs +++ b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -1,174 +1,56 @@ -using Content.Server.DoAfter; +using Content.Server.DoAfter; +using Content.Server.Item; using Content.Server.Storage.EntitySystems; using Content.Shared.DoAfter; -using Content.Shared.Hands; using Content.Shared.IdentityManagement; using Content.Shared.Item; using Content.Shared.Item.PseudoItem; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Content.Shared.Storage; using Content.Shared.Tag; using Content.Shared.Verbs; -using Robust.Shared.Containers; -namespace Content.Server.Item.PseudoItem; +namespace Content.Server.Nyanotrasen.Item.PseudoItem; -public sealed class PseudoItemSystem : EntitySystem +public sealed class PseudoItemSystem : SharedPseudoItemSystem { - // [Dependency] private readonly StorageSystem _storageSystem = default!; - // [Dependency] private readonly ItemSystem _itemSystem = default!; - // [Dependency] private readonly DoAfterSystem _doAfter = default!; - // [Dependency] private readonly TagSystem _tagSystem = default!; - // - // [ValidatePrototypeId] - // private const string PreventTag = "PreventLabel"; - // - // public override void Initialize() - // { - // base.Initialize(); - // SubscribeLocalEvent>(AddInsertVerb); - // SubscribeLocalEvent>(AddInsertAltVerb); - // SubscribeLocalEvent(OnEntRemoved); - // SubscribeLocalEvent(OnGettingPickedUpAttempt); - // SubscribeLocalEvent(OnDropAttempt); - // SubscribeLocalEvent(OnDoAfter); - // SubscribeLocalEvent(OnInsertAttempt); - // } - // - // private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) - // { - // if (!args.CanInteract || !args.CanAccess) - // return; - // - // if (component.Active) - // return; - // - // if (!TryComp(args.Target, out var targetStorage)) - // return; - // - // if (component.Size > targetStorage.StorageCapacityMax - targetStorage.StorageUsed) - // return; - // - // if (Transform(args.Target).ParentUid == uid) - // return; - // - // InnateVerb verb = new() - // { - // Act = () => - // { - // TryInsert(args.Target, uid, component, targetStorage); - // }, - // Text = Loc.GetString("action-name-insert-self"), - // Priority = 2 - // }; - // args.Verbs.Add(verb); - // } - // - // private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) - // { - // if (!args.CanInteract || !args.CanAccess) - // return; - // - // if (args.User == args.Target) - // return; - // - // if (args.Hands == null) - // return; - // - // if (!TryComp(args.Hands.ActiveHandEntity, out var targetStorage)) - // return; - // - // AlternativeVerb verb = new() - // { - // Act = () => - // { - // StartInsertDoAfter(args.User, uid, args.Hands.ActiveHandEntity.Value, component); - // }, - // Text = Loc.GetString("action-name-insert-other", ("target", Identity.Entity(args.Target, EntityManager))), - // Priority = 2 - // }; - // args.Verbs.Add(verb); - // } - // - // private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRemovedFromContainerMessage args) - // { - // if (!component.Active) - // return; - // - // RemComp(uid); - // component.Active = false; - // } - // - // private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, - // GettingPickedUpAttemptEvent args) - // { - // if (args.User == args.Item) - // return; - // - // Transform(uid).AttachToGridOrMap(); - // args.Cancel(); - // } - // - // private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args) - // { - // if (component.Active) - // args.Cancel(); - // } - // - // private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args) - // { - // if (args.Handled || args.Cancelled || args.Args.Used == null) - // return; - // - // args.Handled = TryInsert(args.Args.Used.Value, uid, component); - // } - // - // public bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, - // StorageComponent? storage = null) - // { - // if (!Resolve(storageUid, ref storage)) - // return false; - // - // if (component.Size > storage.StorageCapacityMax - storage.StorageUsed) - // return false; - // - // var item = EnsureComp(toInsert); - // _tagSystem.TryAddTag(toInsert, PreventTag); - // _itemSystem.SetSize(toInsert, component.Size, item); - // - // if (!_storageSystem.Insert(storageUid, toInsert, out _, null, storage)) - // { - // component.Active = false; - // RemComp(toInsert); - // return false; - // } - // - // component.Active = true; - // return true; - // } - // - // private void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, EntityUid storageEntity, - // PseudoItemComponent? pseudoItem = null) - // { - // if (!Resolve(toInsert, ref pseudoItem)) - // return; - // - // var ev = new PseudoItemInsertDoAfterEvent(); - // var args = new DoAfterArgs(EntityManager, inserter, 5f, ev, toInsert, toInsert, storageEntity) - // { - // BreakOnTargetMove = true, - // BreakOnUserMove = true, - // NeedHand = true - // }; - // - // _doAfter.TryStartDoAfter(args); - // } - // - // private void OnInsertAttempt(EntityUid uid, PseudoItemComponent component, - // ContainerGettingInsertedAttemptEvent args) - // { - // if (!component.Active) - // return; - // // This hopefully shouldn't trigger, but this is a failsafe just in case so we dont bluespace them cats - // args.Cancel(); - // } + [Dependency] private readonly StorageSystem _storage = default!; + [Dependency] private readonly ItemSystem _item = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddInsertAltVerb); + } + + private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + if (component.Active) + return; + + if (!TryComp(args.Using, out var targetStorage)) + return; + + if (!CheckItemFits((uid, component), (args.Using.Value, targetStorage))) + return; + + if (args.Hands?.ActiveHandEntity == null) + return; + + AlternativeVerb verb = new() + { + Act = () => + { + StartInsertDoAfter(args.User, uid, args.Hands.ActiveHandEntity.Value, component); + }, + Text = Loc.GetString("action-name-insert-other", ("target", Identity.Entity(args.Target, EntityManager))), + Priority = 2 + }; + args.Verbs.Add(verb); + } } diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs index ddd5ac11585..da3b07d6dab 100644 --- a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs @@ -16,6 +16,9 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Construction.Components; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Content.Shared.Weapons.Melee.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; @@ -62,6 +65,7 @@ public override void Initialize() SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnDestroyed); SubscribeLocalEvent(OnUnanchorAttempt); + SubscribeLocalEvent(OnMeleeThrowOnHitAttempt); } /// @@ -314,6 +318,25 @@ private void AnchorOrExplode(EntityUid uid) _destructibleSystem.DestroyEntity(uid); } + private void OnMeleeThrowOnHitAttempt(Entity ent, ref AttemptMeleeThrowOnHitEvent args) + { + var (uid, _) = ent; + + if (_glimmerSystem.GetGlimmerTier() < GlimmerTier.Dangerous) + return; + + args.Cancelled = true; + args.Handled = true; + + _lightning.ShootRandomLightnings(uid, 10, 2, "SuperchargedLightning", 2, false); + + // Check if the parent of the user is alive, which will be the case if the user is an item and is being held. + var zapTarget = _transformSystem.GetParentUid(args.User); + if (TryComp(zapTarget, out _)) + _electrocutionSystem.TryDoElectrocution(zapTarget, uid, 5, TimeSpan.FromSeconds(3), true, + ignoreInsulation: true); + } + private void Reset(RoundRestartCleanupEvent args) { Accumulator = 0; diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/MidRoundAntagRuleComponent.cs b/Content.Server/Nyanotrasen/StationEvents/Components/MidRoundAntagRuleComponent.cs index 429db920dca..df8b687c3e1 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Components/MidRoundAntagRuleComponent.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Components/MidRoundAntagRuleComponent.cs @@ -1,4 +1,5 @@ using Content.Server.StationEvents.Events; +using Robust.Shared.Prototypes; namespace Content.Server.StationEvents.Components; @@ -6,11 +7,11 @@ namespace Content.Server.StationEvents.Components; public sealed partial class MidRoundAntagRuleComponent : Component { [DataField("antags")] - public IReadOnlyList MidRoundAntags = new[] + public List MidRoundAntags = new() { "SpawnPointGhostRatKing", - "SpawnPointGhostVampSpider", - "SpawnPointGhostFugitive", - "MobEvilTwinSpawn" + //"SpawnPointGhostVampSpider", + //"SpawnPointGhostFugitive", + "SpawnPointGhostParadoxAnomaly" }; } diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MidRoundAntagRule.cs b/Content.Server/Nyanotrasen/StationEvents/Events/MidRoundAntagRule.cs index bf307737601..169f7575490 100644 --- a/Content.Server/Nyanotrasen/StationEvents/Events/MidRoundAntagRule.cs +++ b/Content.Server/Nyanotrasen/StationEvents/Events/MidRoundAntagRule.cs @@ -1,41 +1,38 @@ -using System.Linq; -using Robust.Shared.Random; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; +using Robust.Shared.Random; +using System.Linq; namespace Content.Server.StationEvents.Events; -internal sealed class MidRoundAntagRule : StationEventSystem +public sealed class MidRoundAntagRule : StationEventSystem { - [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly IRobustRandom _random = default!; protected override void Started(EntityUid uid, MidRoundAntagRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); - var spawnLocations = EntityManager.EntityQuery().ToList(); - var backupSpawnLocations = EntityManager.EntityQuery().ToList(); + var spawnLocations = EntityQuery().ToList(); + var backupSpawnLocations = EntityQuery().ToList(); TransformComponent? spawn = new(); if (spawnLocations.Count > 0) { - var spawnLoc = _robustRandom.Pick(spawnLocations); + var spawnLoc = _random.Pick(spawnLocations); spawn = spawnLoc.Item2; } else if (backupSpawnLocations.Count > 0) { - var spawnLoc = _robustRandom.Pick(backupSpawnLocations); + var spawnLoc = _random.Pick(backupSpawnLocations); spawn = spawnLoc.Item2; } - if (spawn == null) + if (spawn?.GridUid == null) return; - if (spawn.GridUid == null) - { - return; - } - - Spawn(_robustRandom.Pick(component.MidRoundAntags), spawn.Coordinates); + var proto = _random.Pick(component.MidRoundAntags); + Log.Info($"Spawning midround antag {proto} at {spawn.Coordinates}"); + Spawn(proto, spawn.Coordinates); } } diff --git a/Content.Server/StationEvents/Events/BureaucraticErrorRule.cs b/Content.Server/StationEvents/Events/BureaucraticErrorRule.cs index b82546a55ba..6415aa4c2af 100644 --- a/Content.Server/StationEvents/Events/BureaucraticErrorRule.cs +++ b/Content.Server/StationEvents/Events/BureaucraticErrorRule.cs @@ -33,12 +33,14 @@ protected override void Started(EntityUid uid, BureaucraticErrorRuleComponent co { var chosenJob = RobustRandom.PickAndTake(jobList); _stationJobs.MakeJobUnlimited(chosenStation.Value, chosenJob); // INFINITE chaos. + /* DeltaV - don't close all other jobs foreach (var job in jobList) { if (_stationJobs.IsJobUnlimited(chosenStation.Value, job)) continue; _stationJobs.TrySetJobSlot(chosenStation.Value, job, 0); } + */ } else { diff --git a/Content.Server/Terminator/Systems/TerminatorSystem.cs b/Content.Server/Terminator/Systems/TerminatorSystem.cs index b6699352779..837778d3c41 100644 --- a/Content.Server/Terminator/Systems/TerminatorSystem.cs +++ b/Content.Server/Terminator/Systems/TerminatorSystem.cs @@ -24,7 +24,7 @@ public override void Initialize() private void OnMapInit(EntityUid uid, TerminatorComponent comp, MapInitEvent args) { // cyborg doesn't need to breathe - RemComp(uid); + //RemComp(uid); // DeltaV - paradox anomaly does actually need to breathe } private void OnSpawned(EntityUid uid, TerminatorComponent comp, GhostRoleSpawnerUsedEvent args) @@ -47,6 +47,15 @@ private void OnCreated(EntityUid uid, TerminatorComponent comp, ref GenericAntag _role.MindAddRole(mindId, new TerminatorRoleComponent(), mind); } + /// + /// DeltaV - used for paradox anomaly. + /// + public void SetTarget(Entity ent, EntityUid mindId) + { + ent.Comp ??= EnsureComp(ent); + ent.Comp.Target = mindId; + } + /// /// Create a spawner at a position and return it. /// diff --git a/Content.Shared/DeltaV/Abilities/DefaultVisionComponent.cs b/Content.Shared/DeltaV/Abilities/DefaultVisionComponent.cs new file mode 100644 index 00000000000..0126450e5d4 --- /dev/null +++ b/Content.Shared/DeltaV/Abilities/DefaultVisionComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; +namespace Content.Shared.DeltaV.Abilities; + +[RegisterComponent] +[NetworkedComponent] + +public sealed partial class DefaultVisionComponent : Component +{} diff --git a/Content.Shared/DeltaV/Abilities/DefaultVisionSystem.cs b/Content.Shared/DeltaV/Abilities/DefaultVisionSystem.cs new file mode 100644 index 00000000000..599fc0db140 --- /dev/null +++ b/Content.Shared/DeltaV/Abilities/DefaultVisionSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Abilities; +using Content.Shared.DeltaV.Abilities; + +namespace Content.Client.DeltaV.Overlays; + +public sealed partial class DefaultVisionSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDefaultVisionInit); + } + + private void OnDefaultVisionInit(EntityUid uid, DefaultVisionComponent component, ComponentInit args) + { + RemComp(uid); + } +} diff --git a/Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs b/Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs new file mode 100644 index 00000000000..5f631c54f25 --- /dev/null +++ b/Content.Shared/DeltaV/Abilities/UltraVisionComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; +namespace Content.Shared.Abilities; + +[RegisterComponent] +[NetworkedComponent] + +public sealed partial class UltraVisionComponent : Component +{} diff --git a/Content.Shared/DeltaV/Harpy/HarpySingerComponent.cs b/Content.Shared/DeltaV/Harpy/HarpySingerComponent.cs index 1ee3f795d58..f2edeeb8726 100644 --- a/Content.Shared/DeltaV/Harpy/HarpySingerComponent.cs +++ b/Content.Shared/DeltaV/Harpy/HarpySingerComponent.cs @@ -1,6 +1,7 @@ using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Serialization; namespace Content.Shared.DeltaV.Harpy { diff --git a/Content.Shared/DeltaV/Harpy/HarpyVisualsSystem.cs b/Content.Shared/DeltaV/Harpy/HarpyVisualsSystem.cs new file mode 100644 index 00000000000..f75fcee8d42 --- /dev/null +++ b/Content.Shared/DeltaV/Harpy/HarpyVisualsSystem.cs @@ -0,0 +1,40 @@ +using Content.Shared.Inventory.Events; +using Content.Shared.Tag; +using Content.Shared.Humanoid; + +namespace Content.Shared.DeltaV.Harpy; + +public sealed class HarpyVisualsSystem : EntitySystem +{ + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoidSystem = default!; + + [ValidatePrototypeId] + private const string HarpyWingsTag = "HidesHarpyWings"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDidEquipEvent); + SubscribeLocalEvent(OnDidUnequipEvent); + } + + private void OnDidEquipEvent(EntityUid uid, HarpySingerComponent component, DidEquipEvent args) + { + if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, HarpyWingsTag)) + { + _humanoidSystem.SetLayerVisibility(uid, HumanoidVisualLayers.RArm, false); + _humanoidSystem.SetLayerVisibility(uid, HumanoidVisualLayers.Tail, false); + } + } + + private void OnDidUnequipEvent(EntityUid uid, HarpySingerComponent component, DidUnequipEvent args) + { + if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, HarpyWingsTag)) + { + _humanoidSystem.SetLayerVisibility(uid, HumanoidVisualLayers.RArm, true); + _humanoidSystem.SetLayerVisibility(uid, HumanoidVisualLayers.Tail, true); + } + } +} diff --git a/Content.Shared/DeltaV/Harpy/SharedHarpyVisualsComponent.cs b/Content.Shared/DeltaV/Harpy/SharedHarpyVisualsComponent.cs new file mode 100644 index 00000000000..cc0f7c39354 --- /dev/null +++ b/Content.Shared/DeltaV/Harpy/SharedHarpyVisualsComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.DeltaV.Harpy; + +[Serializable, NetSerializable] +public enum HardsuitWings : byte +{ + Worn +} diff --git a/Content.Shared/DeltaV/StepTrigger/Component/NoShoesSilentFootstepsComponent.cs b/Content.Shared/DeltaV/StepTrigger/Component/NoShoesSilentFootstepsComponent.cs new file mode 100644 index 00000000000..ae2697b0ef0 --- /dev/null +++ b/Content.Shared/DeltaV/StepTrigger/Component/NoShoesSilentFootstepsComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.StepTrigger.Components; + + +[RegisterComponent, NetworkedComponent] +public sealed partial class NoShoesSilentFootstepsComponent : Component +{ +} diff --git a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs index 82d6964522c..b0bc0eb9a0c 100644 --- a/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs +++ b/Content.Shared/Humanoid/HumanoidAppearanceComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Humanoid.Markings; using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; // DeltaV using Robust.Shared.Enums; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -82,6 +83,12 @@ public sealed partial class HumanoidAppearanceComponent : Component /// [ViewVariables(VVAccess.ReadOnly)] public Color? CachedFacialHairColor; + + /// + /// DeltaV - let paradox anomaly be cloned + /// + [ViewVariables] + public HumanoidCharacterProfile? LastProfileLoaded; } [DataDefinition] diff --git a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs index 597afcbda2a..4974e283dd5 100644 --- a/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs +++ b/Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs @@ -329,6 +329,8 @@ public virtual void LoadProfile(EntityUid uid, HumanoidCharacterProfile profile, humanoid.Age = profile.Age; + humanoid.LastProfileLoaded = profile; // DeltaV - let paradox anomaly be cloned + Dirty(humanoid); } diff --git a/Content.Shared/Item/ItemComponent.cs b/Content.Shared/Item/ItemComponent.cs index 9fadfa0783c..0f599ebdbed 100644 --- a/Content.Shared/Item/ItemComponent.cs +++ b/Content.Shared/Item/ItemComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Hands.Components; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -12,11 +13,11 @@ namespace Content.Shared.Item; /// [RegisterComponent] [NetworkedComponent] -[Access(typeof(SharedItemSystem)), AutoGenerateComponentState(true)] +[Access(typeof(SharedItemSystem), typeof(SharedPseudoItemSystem)), AutoGenerateComponentState(true)] // DeltaV - Gave PseudoItem access public sealed partial class ItemComponent : Component { [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] - [Access(typeof(SharedItemSystem))] + [Access(typeof(SharedItemSystem), typeof(SharedPseudoItemSystem))] // DeltaV - Gave PseudoItem access public ProtoId Size = "Small"; [Access(typeof(SharedItemSystem))] diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 7d5e24a15b1..49ad40ae596 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -23,6 +23,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using Robust.Shared.Utility; +using Content.Shared.StepTrigger.Components; // Delta V-NoShoesSilentFootstepsComponent namespace Content.Shared.Movement.Systems { @@ -46,6 +47,7 @@ public abstract partial class SharedMoverController : VirtualController [Dependency] protected readonly SharedPhysicsSystem Physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TagSystem _tags = default!; + [Dependency] private readonly IEntityManager _entities = default!; // Delta V-NoShoesSilentFootstepsComponent protected EntityQuery MoverQuery; protected EntityQuery MobMoverQuery; @@ -443,6 +445,14 @@ private bool TryGetSound( sound = moverModifier.FootstepSoundCollection; return true; } + + // If got the component in yml and no shoes = no sound. Delta V + if (_entities.TryGetComponent(uid, out NoShoesSilentFootstepsComponent? _) & + !_inventory.TryGetSlotEntity(uid, "shoes", out var _)) + { + return false; + } + // Delta V NoShoesSilentFootsteps till here. if (_inventory.TryGetSlotEntity(uid, "shoes", out var shoes) && TryComp(shoes, out var modifier)) diff --git a/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs similarity index 84% rename from Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs rename to Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs index cad826aa6b9..d3774439d36 100644 --- a/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs @@ -1,8 +1,7 @@ - using Content.Shared.Item; using Robust.Shared.Prototypes; -namespace Content.Shared.Nyanotrasen.Item.Components; +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; /// /// For entities that behave like an item under certain conditions, @@ -21,5 +20,8 @@ public sealed partial class PseudoItemComponent : Component [DataField, AutoNetworkedField] public List? Shape; + [DataField, AutoNetworkedField] + public Vector2i StoredOffset; + public bool Active = false; } diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs new file mode 100644 index 00000000000..7000c654048 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.Checks.cs @@ -0,0 +1,165 @@ +using Content.Shared.Item; +using Content.Shared.Storage; + +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +/// +/// Almost all of this is code taken from other systems, but adapted to use PseudoItem. +/// I couldn't use the original functions because the resolve would fuck shit up, even if I passed a constructed itemcomp +/// +/// This is horrible, and I hate it. But such is life +/// +public partial class SharedPseudoItemSystem +{ + protected bool CheckItemFits(Entity itemEnt, Entity storageEnt) + { + if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) + return false; + + if (Transform(itemEnt).Anchored) + return false; + + if (storageEnt.Comp.Whitelist?.IsValid(itemEnt, EntityManager) == false) + return false; + + if (storageEnt.Comp.Blacklist?.IsValid(itemEnt, EntityManager) == true) + return false; + + var maxSize = _storage.GetMaxItemSize(storageEnt); + if (_item.GetSizePrototype(itemEnt.Comp.Size) > maxSize) + return false; + + // The following is shitfucked together straight from TryGetAvailableGridSpace, but eh, it works + + var itemComp = new ItemComponent + { Size = itemEnt.Comp.Size, Shape = itemEnt.Comp.Shape, StoredOffset = itemEnt.Comp.StoredOffset }; + + var storageBounding = storageEnt.Comp.Grid.GetBoundingBox(); + + Angle startAngle; + if (storageEnt.Comp.DefaultStorageOrientation == null) + startAngle = Angle.FromDegrees(-itemComp.StoredRotation); // PseudoItem doesn't support this + else + { + if (storageBounding.Width < storageBounding.Height) + { + startAngle = storageEnt.Comp.DefaultStorageOrientation == StorageDefaultOrientation.Horizontal + ? Angle.Zero + : Angle.FromDegrees(90); + } + else + { + startAngle = storageEnt.Comp.DefaultStorageOrientation == StorageDefaultOrientation.Vertical + ? Angle.Zero + : Angle.FromDegrees(90); + } + } + + for (var y = storageBounding.Bottom; y <= storageBounding.Top; y++) + { + for (var x = storageBounding.Left; x <= storageBounding.Right; x++) + { + for (var angle = startAngle; angle <= Angle.FromDegrees(360 - startAngle); angle += Math.PI / 2f) + { + var location = new ItemStorageLocation(angle, (x, y)); + if (ItemFitsInGridLocation(itemEnt, storageEnt, location.Position, location.Rotation)) + return true; + } + } + } + + return false; + } + + private bool ItemFitsInGridLocation( + Entity itemEnt, + Entity storageEnt, + Vector2i position, + Angle rotation) + { + if (!Resolve(itemEnt, ref itemEnt.Comp) || !Resolve(storageEnt, ref storageEnt.Comp)) + return false; + + var gridBounds = storageEnt.Comp.Grid.GetBoundingBox(); + if (!gridBounds.Contains(position)) + return false; + + var itemShape = GetAdjustedItemShape(itemEnt, rotation, position); + + foreach (var box in itemShape) + { + for (var offsetY = box.Bottom; offsetY <= box.Top; offsetY++) + { + for (var offsetX = box.Left; offsetX <= box.Right; offsetX++) + { + var pos = (offsetX, offsetY); + + if (!IsGridSpaceEmpty(itemEnt, storageEnt, pos, itemShape)) + return false; + } + } + } + + return true; + } + + private IReadOnlyList GetAdjustedItemShape(Entity entity, Angle rotation, + Vector2i position) + { + if (!Resolve(entity, ref entity.Comp)) + return new Box2i[] { }; + + var shapes = entity.Comp.Shape ?? _item.GetSizePrototype(entity.Comp.Size).DefaultShape; + var boundingShape = shapes.GetBoundingBox(); + var boundingCenter = ((Box2) boundingShape).Center; + var matty = Matrix3.CreateTransform(boundingCenter, rotation); + var drift = boundingShape.BottomLeft - matty.TransformBox(boundingShape).BottomLeft; + + var adjustedShapes = new List(); + foreach (var shape in shapes) + { + var transformed = matty.TransformBox(shape).Translated(drift); + var floored = new Box2i(transformed.BottomLeft.Floored(), transformed.TopRight.Floored()); + var translated = floored.Translated(position); + + adjustedShapes.Add(translated); + } + + return adjustedShapes; + } + + private bool IsGridSpaceEmpty(Entity itemEnt, Entity storageEnt, + Vector2i location, IReadOnlyList shape) + { + if (!Resolve(storageEnt, ref storageEnt.Comp)) + return false; + + var validGrid = false; + foreach (var grid in storageEnt.Comp.Grid) + { + if (grid.Contains(location)) + { + validGrid = true; + break; + } + } + + if (!validGrid) + return false; + + foreach (var (ent, storedItem) in storageEnt.Comp.StoredItems) + { + if (ent == itemEnt.Owner) + continue; + + var adjustedShape = shape; + foreach (var box in adjustedShape) + { + if (box.Contains(location)) + return false; + } + } + + return true; + } +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs new file mode 100644 index 00000000000..4b7910746f1 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItem/SharedPseudoItemSystem.cs @@ -0,0 +1,165 @@ +using Content.Shared.DoAfter; +using Content.Shared.Hands; +using Content.Shared.IdentityManagement; +using Content.Shared.Interaction.Events; +using Content.Shared.Item; +using Content.Shared.Item.PseudoItem; +using Content.Shared.Storage; +using Content.Shared.Storage.EntitySystems; +using Content.Shared.Tag; +using Content.Shared.Verbs; +using Robust.Shared.Containers; + +namespace Content.Shared.Nyanotrasen.Item.PseudoItem; + +public abstract partial class SharedPseudoItemSystem : EntitySystem +{ + [Dependency] private readonly SharedStorageSystem _storage = default!; + [Dependency] private readonly SharedItemSystem _item = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly TagSystem _tag = default!; + + [ValidatePrototypeId] + private const string PreventTag = "PreventLabel"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddInsertVerb); + SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent(OnGettingPickedUpAttempt); + SubscribeLocalEvent(OnDropAttempt); + SubscribeLocalEvent(OnInsertAttempt); + SubscribeLocalEvent(OnInteractAttempt); + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent(OnAttackAttempt); + } + + private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + if (component.Active) + return; + + if (!TryComp(args.Target, out var targetStorage)) + return; + + if (!CheckItemFits((uid, component), (args.Target, targetStorage))) + return; + + if (Transform(args.Target).ParentUid == uid) + return; + + InnateVerb verb = new() + { + Act = () => + { + TryInsert(args.Target, uid, component, targetStorage); + }, + Text = Loc.GetString("action-name-insert-self"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, + StorageComponent? storage = null) + { + if (!Resolve(storageUid, ref storage)) + return false; + + if (!CheckItemFits((toInsert, component), (storageUid, storage))) + return false; + + var itemComp = new ItemComponent + { Size = component.Size, Shape = component.Shape, StoredOffset = component.StoredOffset }; + AddComp(toInsert, itemComp); + _item.VisualsChanged(toInsert); + + _tag.TryAddTag(toInsert, PreventTag); + + if (!_storage.Insert(storageUid, toInsert, out _, null, storage)) + { + component.Active = false; + RemComp(toInsert); + return false; + } + + component.Active = true; + return true; + } + + private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRemovedFromContainerMessage args) + { + if (!component.Active) + return; + + RemComp(uid); + component.Active = false; + } + + private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, + GettingPickedUpAttemptEvent args) + { + if (args.User == args.Item) + return; + + Transform(uid).AttachToGridOrMap(); + args.Cancel(); + } + + private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args) + { + if (component.Active) + args.Cancel(); + } + + private void OnInsertAttempt(EntityUid uid, PseudoItemComponent component, + ContainerGettingInsertedAttemptEvent args) + { + if (!component.Active) + return; + // This hopefully shouldn't trigger, but this is a failsafe just in case so we dont bluespace them cats + args.Cancel(); + } + + // Prevents moving within the bag :) + private void OnInteractAttempt(EntityUid uid, PseudoItemComponent component, InteractionAttemptEvent args) + { + if (args.Uid == args.Target && component.Active) + args.Cancel(); + } + + private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Used == null) + return; + + args.Handled = TryInsert(args.Args.Used.Value, uid, component); + } + + protected void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, EntityUid storageEntity, + PseudoItemComponent? pseudoItem = null) + { + if (!Resolve(toInsert, ref pseudoItem)) + return; + + var ev = new PseudoItemInsertDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, inserter, 5f, ev, toInsert, toInsert, storageEntity) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnAttackAttempt(EntityUid uid, PseudoItemComponent component, AttackAttemptEvent args) + { + if (component.Active) + args.Cancel(); + } +} diff --git a/Content.Shared/Roles/StartingGearPrototype.cs b/Content.Shared/Roles/StartingGearPrototype.cs index 0d4122b6466..1e7881113fe 100644 --- a/Content.Shared/Roles/StartingGearPrototype.cs +++ b/Content.Shared/Roles/StartingGearPrototype.cs @@ -1,3 +1,4 @@ +using Content.Shared.DeltaV.Harpy; using Content.Shared.Preferences; using Robust.Shared.Prototypes; @@ -32,7 +33,8 @@ public string GetGear(string slot, HumanoidCharacterProfile? profile) { if (profile != null) { - if (slot == "jumpsuit" && profile.Clothing == ClothingPreference.Jumpskirt && !string.IsNullOrEmpty(InnerClothingSkirt)) + if (slot == "jumpsuit" && profile.Clothing == ClothingPreference.Jumpskirt && !string.IsNullOrEmpty(InnerClothingSkirt) + || slot == "jumpsuit" && profile.Species == "Harpy" && !string.IsNullOrEmpty(InnerClothingSkirt)) //DeltaV adds this line to prevent Harpies from starting with jumpsuits return InnerClothingSkirt; if (slot == "back" && profile.Backpack == BackpackPreference.Satchel && !string.IsNullOrEmpty(Satchel)) return Satchel; diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index eb81a78e3ef..c00df042653 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -10,9 +10,8 @@ using Content.Shared.Implants.Components; using Content.Shared.Interaction; using Content.Shared.Item; -using Content.Shared.Item.PseudoItem; using Content.Shared.Lock; -using Content.Shared.Nyanotrasen.Item.Components; +using Content.Shared.Nyanotrasen.Item.PseudoItem; using Content.Shared.Placeable; using Content.Shared.Popups; using Content.Shared.Stacks; diff --git a/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs b/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs index 82ffc5e51fc..559d58298ba 100644 --- a/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs +++ b/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs @@ -101,9 +101,10 @@ public sealed partial class MeleeThrownComponent : Component /// /// Event raised before an entity is thrown by to see if a throw is allowed. /// If not handled, the enabled field on the component will be used instead. +/// Delta-V modification: Added User field, since it is now also raised on the entity being hit /// [ByRefEvent] -public record struct AttemptMeleeThrowOnHitEvent(EntityUid Hit, bool Cancelled = false, bool Handled = false); +public record struct AttemptMeleeThrowOnHitEvent(EntityUid Hit, Entity User, bool Cancelled = false, bool Handled = false); [ByRefEvent] public record struct MeleeThrowOnHitStartEvent(EntityUid User, EntityUid Used); diff --git a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs index fc364286549..e840bd1ddd5 100644 --- a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs @@ -104,9 +104,14 @@ public bool CanThrowOnHit(Entity ent, EntityUid target { var (uid, comp) = ent; - var ev = new AttemptMeleeThrowOnHitEvent(target); - RaiseLocalEvent(uid, ref ev); + var ev = new AttemptMeleeThrowOnHitEvent(target, ent); + // Delta-V modification: Also raise on the entity being hit, in case it wants to object + RaiseLocalEvent(target, ref ev); + if (ev.Handled) + return !ev.Cancelled; + + RaiseLocalEvent(uid, ref ev); if (ev.Handled) return !ev.Cancelled; diff --git a/Resources/Audio/DeltaV/Voice/Harpy/chirp1.ogg b/Resources/Audio/DeltaV/Voice/Harpy/chirp1.ogg index 07303b6626c..5eeea546775 100644 Binary files a/Resources/Audio/DeltaV/Voice/Harpy/chirp1.ogg and b/Resources/Audio/DeltaV/Voice/Harpy/chirp1.ogg differ diff --git a/Resources/Changelog/DeltaVChangelog.yml b/Resources/Changelog/DeltaVChangelog.yml index 60643480570..baab23e24cc 100644 --- a/Resources/Changelog/DeltaVChangelog.yml +++ b/Resources/Changelog/DeltaVChangelog.yml @@ -1572,3 +1572,75 @@ Entries: message: Fixed glimmer mite being extremely loud for some. id: 236 time: '2024-02-10T23:21:56.0000000+00:00' +- author: Adrian16199 + changes: + - type: Add + message: Added a speech bubble to felinids. Mraow! + id: 237 + time: '2024-02-12T20:51:35.0000000+00:00' +- author: DebugOk + changes: + - type: Add + message: Felinids now fit in bags again! + id: 238 + time: '2024-02-12T20:52:49.0000000+00:00' +- author: Guess-My-Name + changes: + - type: Add + message: >- + Some budget cuts were made in HR department, expect more bureaucratic + errors in near future. + id: 239 + time: '2024-02-12T21:01:44.0000000+00:00' +- author: Adrian16199 + changes: + - type: Tweak + message: Felinid's thieving gloves have been removed for Soft paws mechanic. + id: 240 + time: '2024-02-12T21:10:44.0000000+00:00' +- author: Adrian16199 + changes: + - type: Add + message: Felinids now scream in agony from water. + id: 241 + time: '2024-02-12T21:11:44.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Harpies have received a full visual rework. Featuring clothing sprites, + new markings, a complete overhaul of their layering, as well as visual + systems. + - type: Add + message: Harpies now have bird related speech verbs + - type: Add + message: >- + Two new traits have been added related to birds. Harpies now start by + default with the new Ultraviolet Vision trait, letting them see a whole + new spectrum of colors. This trait can be taken by other curious people. + Harpies that wish to see in RGB colors can instead take the new Normal + Vision trait. + id: 242 + time: '2024-02-12T22:25:02.0000000+00:00' +- author: DebugOk + changes: + - type: Tweak + message: >- + Glimmer probers now react violently to being hit by gorilla gauntlets if + glimmer is above 500 + id: 243 + time: '2024-02-13T00:59:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: Removed the ability of Harpies to destroy people's ears. + id: 244 + time: '2024-02-13T13:29:37.0000000+00:00' +- author: deltanedas + changes: + - type: Add + message: >- + Brought back paradox anomalies. Beware anyone that looks *just* like + you! + id: 245 + time: '2024-02-13T15:55:35.0000000+00:00' diff --git a/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl b/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl index bd8719fd56b..fd5635de4a9 100644 --- a/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl +++ b/Resources/Locale/en-US/deltav/chat/managers/chat_manager.ftl @@ -7,3 +7,8 @@ chat-speech-verb-felinid-1 = mraows chat-speech-verb-felinid-2 = mews chat-speech-verb-felinid-3 = meows chat-speech-verb-felinid-4 = purrs out + +chat-speech-verb-harpy-1 = chirps +chat-speech-verb-harpy-2 = tweets +chat-speech-verb-harpy-3 = caws +chat-speech-verb-harpy-4 = trills diff --git a/Resources/Locale/en-US/deltav/game-ticking/game-rules/rule-paradox-anomaly.ftl b/Resources/Locale/en-US/deltav/game-ticking/game-rules/rule-paradox-anomaly.ftl new file mode 100644 index 00000000000..45bd554deef --- /dev/null +++ b/Resources/Locale/en-US/deltav/game-ticking/game-rules/rule-paradox-anomaly.ftl @@ -0,0 +1,5 @@ +paradox-anomaly-round-end-agent-name = Paradox Anomaly + +objective-issuer-self = [color=#1708EC]Self[/color] + +# briefing is in terminator ftl diff --git a/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl index f2e9238dfbf..977a5f47bcb 100644 --- a/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl @@ -6,3 +6,7 @@ ghost-role-information-nukie-mouse-rules = Normal syndicate antagonist rules app ghost-role-information-listeningop-name = Listening Post Operative ghost-role-information-listeningop-description = You are a Listening Post operative. Get into range, observe the station, intercept communications and assist any operatives in the area! ghost-role-information-listeningop-rules = You are a Syndicate Operative tasked with the continuous reporting and monitoring of the station and its activities, as well as assisting any fellow operatives who may be aboard the station. As an antagonist, do whatever is required for you to complete this task. Make sure your station doesn't fall into enemy hands and DO NOT abandon your station! Hide your existence at any cost! + +ghost-role-information-paradox-anomaly-name = Paradox Anomaly +ghost-role-information-paradox-anomaly-description = Replace your double, or befriend them. +ghost-role-information-paradox-anomaly-rules = Try and replace your twin with this funny roleplay antag rather than plasma flooding the station or something. You can also just befriend them. diff --git a/Resources/Locale/en-US/deltav/markings/harpy.ftl b/Resources/Locale/en-US/deltav/markings/harpy.ftl index c2e9beb5c87..3c1a2e3b9b2 100644 --- a/Resources/Locale/en-US/deltav/markings/harpy.ftl +++ b/Resources/Locale/en-US/deltav/markings/harpy.ftl @@ -1,26 +1,32 @@ marking-HarpyWingDefault = Basic Wings marking-HarpyWingDefault-harpy = Wings -marking-HarpyWing2Tone = Two Tone Wings -marking-HarpyWing2Tone-harpy2tone1 = Top Half -marking-HarpyWing2Tone-harpy2tone2 = Bottom Half +marking-HarpyWingFolded = Folded Wings +marking-HarpyWingFolded-harpyfolded = Wings -marking-HarpyWing3Tone = Three Tone Wings -marking-HarpyWing3Tone-harpy3tone1 = Top Third -marking-HarpyWing3Tone-harpy3tone2 = Middle Third -marking-HarpyWing3tone-harpy3tone3 = Bottom Third +marking-HarpyWingClassic = Classic Wings +marking-HarpyWingClassic-classicharpy = Wings -marking-HarpyWingSpeckled = Speckled Wings -marking-HarpyWingSpeckled-harpyspeckled1 = Main -marking-HarpyWingSpeckled-harpyspeckled2 = Speckles +marking-HarpyWing2ToneClassic = Classic Two Tone Wings +marking-HarpyWing2ToneClassic-harpy2tone1 = Top Half +marking-HarpyWing2ToneClassic-harpy2tone2 = Bottom Half -marking-HarpyWingUndertone = Wings with Undertone -marking-HarpyWingUndertone-harpyundertone1 = Front -marking-HarpyWingUndertone-harpyundertone2 = Back +marking-HarpyWing3ToneClassic = Classic Three Tone Wings +marking-HarpyWing3ToneClassic-harpy3tone1 = Top Third +marking-HarpyWing3ToneClassic-harpy3tone2 = Middle Third +marking-HarpyWing3ToneClassic-harpy3tone3 = Bottom Third -marking-HarpyWingTips = Wings with Feather Tips -marking-HarpyWingTips-harpywingtip1 = Main -marking-HarpyWingTips-harpywingtip2 = Feathertips +marking-HarpyWingSpeckledClassic = Speckled Classic Wings +marking-HarpyWingSpeckledClassic-harpyspeckled1 = Main +marking-HarpyWingSpeckledClassic-harpyspeckled2 = Speckles + +marking-HarpyWingUndertoneClassic = Classic Wings with Undertone +marking-HarpyWingUndertoneClassic-harpyundertone1 = Front +marking-HarpyWingUndertoneClassic-harpyundertone2 = Back + +marking-HarpyWingTipsClassic = Classic Wings with Feather Tips +marking-HarpyWingTipsClassic-harpywingtip1 = Main +marking-HarpyWingTipsClassic-harpywingtip2 = Feathertips marking-HarpyEarsDefault = Feather Tufts marking-HarpyEarsDefault-harpy_ears_default = Tufts @@ -30,3 +36,17 @@ marking-HarpyTailPhoenix-phoenix_tail = Tail marking-HarpyTailRooster = Rooster Tail marking-HarpyTailRooster-rooster_tail = Tail + +marking-HarpyTailFinch = Finch Tail +marking-HarpyTailFinch-finch_tail = Tail + +marking-HarpyChestDefault = Wing & Groin Under-Clothes +marking-HarpyChestDefault-upper = Wing Under-Clothes +marking-HarpyChestDefault-lower = Groin Under-Clothes + +marking-HarpyLegsDefault = Avian Legs +marking-HarpyLegsDefault-thighs = Thighs + +marking-HarpyFeetDefault = Avian Feet +marking-HarpyFeetDefault-feet = Feet +marking-HarpyFeetDefault-talons = Talons diff --git a/Resources/Locale/en-US/deltav/objectives/conditions/paradox-anomaly.ftl b/Resources/Locale/en-US/deltav/objectives/conditions/paradox-anomaly.ftl new file mode 100644 index 00000000000..2eac3339bf4 --- /dev/null +++ b/Resources/Locale/en-US/deltav/objectives/conditions/paradox-anomaly.ftl @@ -0,0 +1,2 @@ +objective-paradox-anomaly-kill-title = Kill this universe's {$targetName} +objective-paradox-anomaly-friend-title = Keep your new friend {$targetName} alive diff --git a/Resources/Locale/en-US/deltav/traits/traits.ftl b/Resources/Locale/en-US/deltav/traits/traits.ftl index 6698832a8cf..0eaff0408a4 100644 --- a/Resources/Locale/en-US/deltav/traits/traits.ftl +++ b/Resources/Locale/en-US/deltav/traits/traits.ftl @@ -1,5 +1,9 @@ trait-scottish-accent-name = Scottish Accent trait-scottish-accent-desc = Fer tha folk who come frae Hielan clan. +trait-ultravision-desc = Whether through custom bionic eyes, random mutation, + or being a Harpy, you perceive the world with ultraviolet light. + +trait-defaultvision-desc = You lack any vision variation from the norm for a non-human species. trait-uncloneable-name = Uncloneable trait-uncloneable-desc = Cannot be cloned diff --git a/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl b/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl index 41237a5c10d..2e167431773 100644 --- a/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl +++ b/Resources/Locale/en-US/game-ticking/game-rules/rule-terminator.ftl @@ -8,7 +8,11 @@ terminator-role-greeting = Use any means at your disposal to complete the mission. Glory to Cybersun. -terminator-role-briefing = Kill the target at all costs. +# DeltaV - paradox anomaly +terminator-role-briefing = + You are a bluespace anomaly that looks and sound identical to someone from this reality. + Kill them and assume their identity, or talk it out and become friends. + Your objectives support either playstyle (and you obviously can't do both). terminator-endoskeleton-gib-popup = All the battered flesh falls apart, revealing a titanium endoskeleton! terminator-endoskeleton-burn-popup = The seared flesh is burned to a crisp, revealing a titanium endoskeleton! diff --git a/Resources/Locale/en-US/prototypes/roles/antags.ftl b/Resources/Locale/en-US/prototypes/roles/antags.ftl index d12f70cda25..40f2c9a6820 100644 --- a/Resources/Locale/en-US/prototypes/roles/antags.ftl +++ b/Resources/Locale/en-US/prototypes/roles/antags.ftl @@ -31,5 +31,5 @@ roles-antag-space-ninja-objective = Use your stealth to sabotage the station, no roles-antag-thief-name = Thief roles-antag-thief-objective = Add some NT property to your personal collection without using violence. -roles-antag-terminator-name = Exterminator -roles-antag-terminator-objective = Kill the target at all costs, the future depends on it. +roles-antag-terminator-name = Paradox Anomaly # DeltaV - paradox anomaly +roles-antag-terminator-objective = Replace your double, or befriend them. # DeltaV - paradox anomaly diff --git a/Resources/Prototypes/DeltaV/Body/Parts/harpy.yml b/Resources/Prototypes/DeltaV/Body/Parts/harpy.yml new file mode 100644 index 00000000000..358cb1de11f --- /dev/null +++ b/Resources/Prototypes/DeltaV/Body/Parts/harpy.yml @@ -0,0 +1,186 @@ +- type: entity + id: PartHarpy + parent: BaseItem + name: "harpy body part" + abstract: true + components: + - type: Damageable + damageContainer: Biological + - type: BodyPart + - type: ContainerContainer + containers: + bodypart: !type:Container + ents: [] + - type: StaticPrice #DynamicPrice + price: 100 + - type: Tag + tags: + - Trash + +- type: entity + id: TorsoHarpy + name: "harpy torso" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "torso_m" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "torso_m" + - type: BodyPart + partType: Torso + +- type: entity + id: HeadHarpy + name: "harpy head" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "head_m" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "head_m" + - type: BodyPart + partType: Head + vital: true + - type: Input + context: "ghost" + - type: InputMover + - type: GhostOnMove + - type: Tag + tags: + - Head + +- type: entity + id: LeftArmHarpy + name: "left harpy arm" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_arm" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_arm" + - type: BodyPart + partType: Arm + symmetry: Left + +- type: entity + id: RightArmHarpy + name: "right harpy arm" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_arm" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_arm" + - type: BodyPart + partType: Arm + symmetry: Right + +- type: entity + id: LeftHandHarpy + name: "left harpy hand" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_hand" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_hand" + - type: BodyPart + partType: Hand + symmetry: Left + +- type: entity + id: RightHandHarpy + name: "right harpy hand" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_hand" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_hand" + - type: BodyPart + partType: Hand + symmetry: Right + +- type: entity + id: LeftLegHarpy + name: "left harpy leg" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_leg" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_leg" + - type: BodyPart + partType: Leg + symmetry: Left + - type: MovementBodyPart + +- type: entity + id: RightLegHarpy + name: "right harpy leg" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_leg" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_leg" + - type: BodyPart + partType: Leg + symmetry: Right + - type: MovementBodyPart + +- type: entity + id: LeftFootHarpy + name: "left harpy foot" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_foot" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "l_foot" + - type: BodyPart + partType: Foot + symmetry: Left + +- type: entity + id: RightFootHarpy + name: "right harpy foot" + parent: PartHarpy + components: + - type: Sprite + netsync: false + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_foot" + - type: Icon + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: "r_foot" + - type: BodyPart + partType: Foot + symmetry: Right diff --git a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml index 65073a778fa..5b3615c55d8 100644 --- a/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml +++ b/Resources/Prototypes/DeltaV/Body/Prototypes/harpy.yml @@ -4,14 +4,14 @@ root: torso slots: head: - part: HeadHuman + part: HeadHarpy connections: - torso organs: brain: OrganHumanBrain eyes: OrganHumanEyes torso: - part: TorsoHuman + part: TorsoHarpy connections: - left arm - right arm @@ -20,31 +20,31 @@ organs: heart: OrganHumanHeart lungs: OrganHarpyLungs - stomach: OrganHumanStomach - liver: OrganHumanLiver - kidneys: OrganHumanKidneys + stomach: OrganAnimalStomach + liver: OrganAnimalLiver + kidneys: OrganAnimalKidneys right arm: - part: RightArmHuman + part: RightArmHarpy connections: - right hand left arm: - part: LeftArmHuman + part: LeftArmHarpy connections: - left hand right hand: - part: RightHandHuman + part: RightHandHarpy left hand: - part: LeftHandHuman + part: LeftHandHarpy right leg: - part: RightLegHuman + part: RightLegHarpy connections: - right foot left leg: - part: LeftLegHuman + part: LeftLegHarpy connections: - left foot right foot: - part: RightFootHuman + part: RightFootHarpy left foot: - part: LeftFootHuman + part: LeftFootHarpy diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml index b43f50890c2..88a2488db09 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml @@ -44,4 +44,19 @@ layers: - state: green - sprite: Structures/Wallmounts/signs.rsi - state: radiation \ No newline at end of file + state: radiation + +- type: entity + parent: MarkerBase + id: SpawnPointGhostParadoxAnomaly + name: paradox anomaly spawn point + components: + - type: GhostRole + name: ghost-role-information-paradox-anomaly-name + description: ghost-role-information-paradox-anomaly-description + rules: ghost-role-information-paradox-anomaly-rules + - type: ParadoxAnomalySpawner + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml index 9ea84c4d0a2..9118692a082 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/harpy.yml @@ -18,6 +18,40 @@ - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpy +- type: marking + id: HarpyWingClassic + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + color: "#964b00" + sprites: + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + state: classicharpy + +- type: marking + id: HarpyWingFolded + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + color: "#964b00" + sprites: + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpyfolded + - type: marking id: HarpyEarsDefault bodyPart: Head @@ -57,12 +91,36 @@ bodyPart: Tail markingCategory: Tail speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring sprites: - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi - state: rooster_tail + state: rooster_tail + + +- type: marking + id: HarpyTailFinch + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi + state: finch_tail - type: marking - id: HarpyWing2Tone + id: HarpyWing2ToneClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] @@ -73,7 +131,7 @@ state: harpy2tone2 - type: marking - id: HarpyWing3Tone + id: HarpyWing3ToneClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] @@ -86,7 +144,7 @@ state: harpy3tone3 - type: marking - id: HarpyWingSpeckled + id: HarpyWingSpeckledClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] @@ -97,7 +155,7 @@ state: harpyspeckled2 - type: marking - id: HarpyWingUndertone + id: HarpyWingUndertoneClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] @@ -108,7 +166,7 @@ state: harpyundertone2 - type: marking - id: HarpyWingTips + id: HarpyWingTipsClassic bodyPart: RArm markingCategory: Arms speciesRestriction: [Harpy] @@ -117,3 +175,55 @@ state: harpywingtip1 - sprite: DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi state: harpywingtip2 + +- type: marking + id: HarpyChestDefault + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + color: "#964b00" + sprites: + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + state: upper + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi + state: lower + +- type: marking + id: HarpyLegsDefault + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + color: "#964b00" + sprites: + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + state: thighs + +- type: marking + id: HarpyFeetDefault + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [Harpy] + coloring: + default: + fallbackTypes: + - !type:SimpleColoring + color: "#964b00" + sprites: + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + state: feet + - sprite: DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi + state: talons diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml index 7548add4969..a4498299c9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/harpy.yml @@ -106,7 +106,8 @@ types: Piercing: 5 - type: Speech - speechSounds: Alto + speechSounds: Harpy + speechVerb: Harpy - type: Vocal sounds: Male: SoundsHarpy @@ -121,6 +122,11 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.5 baseSprintSpeed: 5.0 + - type: Inventory + speciesId: harpy + templateId: digitigrade + - type: HarpyVisuals + - type: UltraVision - type: entity save: false @@ -132,6 +138,8 @@ components: - type: HumanoidAppearance species: Harpy + - type: Inventory + speciesId: harpy - type: Sprite scale: 0.9, 0.9 layers: diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml index 6129ff6c413..2b0048f1a48 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml @@ -17,3 +17,43 @@ - type: Sprite sprite: DeltaV/Structures/Wallmounts/signs.rsi state: direction_mail + +- type: entity + parent: BaseSignDirectional + id: SignDirectionalExam + name: examination room sign + description: A direction sign, pointing out which way the examination rooms are. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_exam + +- type: entity + parent: BaseSignDirectional + id: SignDirectionalICU + name: intensive care unit sign + description: A direction sign, pointing out which way the Intensive Care Unit is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_icu + +- type: entity + parent: BaseSign + id: SignLaundromat + name: laundromat sign + description: A sign indicating the laundromat. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: laundromat + +- type: entity + parent: BaseSign + id: SignBarbershop + name: barbershop sign + description: A sign indicating the barbershop. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: barbershop \ No newline at end of file diff --git a/Resources/Prototypes/DeltaV/GameRules/midround.yml b/Resources/Prototypes/DeltaV/GameRules/midround.yml new file mode 100644 index 00000000000..82b47c05718 --- /dev/null +++ b/Resources/Prototypes/DeltaV/GameRules/midround.yml @@ -0,0 +1,11 @@ +- type: entity + noSpawn: true + parent: BaseGameRule + id: ParadoxAnomaly + components: + - type: GenericAntagRule + agentName: paradox-anomaly-round-end-agent-name + objectives: + - ParadoxAnomalyKillObjective + - ParadoxAnomalyFriendObjective + - ParadoxAnomalyEscapeObjective diff --git a/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml new file mode 100644 index 00000000000..158541571aa --- /dev/null +++ b/Resources/Prototypes/DeltaV/InventoryTemplates/digitigrade_inventory_template.yml @@ -0,0 +1,119 @@ +- type: inventoryTemplate + id: digitigrade + slots: + - name: shoes + slotTexture: shoes + slotFlags: FEET + stripTime: 3 + uiWindowPos: 1,0 + strippingWindowPos: 1,3 + displayName: Shoes + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 6 + uiWindowPos: 0,1 + strippingWindowPos: 0,2 + displayName: Jumpsuit + whitelist: + tags: + - Skirt + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + stripTime: 6 + uiWindowPos: 1,1 + strippingWindowPos: 1,2 + displayName: Suit + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,1 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,2 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,2 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 3 + uiWindowPos: 2,2 + strippingWindowPos: 2,0 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,3 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 0,3 + strippingWindowPos: 0,4 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,3 + strippingWindowPos: 1,4 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + slotGroup: MainHotbar + stripTime: 3 + uiWindowPos: 2,0 + strippingWindowPos: 2,5 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,1 + strippingWindowPos: 1,5 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 3,0 + strippingWindowPos: 0,5 + displayName: Back diff --git a/Resources/Prototypes/DeltaV/Objectives/paradox_anomaly.yml b/Resources/Prototypes/DeltaV/Objectives/paradox_anomaly.yml new file mode 100644 index 00000000000..dd0b74c4616 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Objectives/paradox_anomaly.yml @@ -0,0 +1,52 @@ +- type: entity + abstract: true + parent: BaseTerminatorObjective # mrp terminator real + id: BaseParadoxAnomalyObjective + components: + - type: Objective + issuer: self + +# not using base kill/keep alive objectives since these intentionally conflict with eachother +- type: entity + noSpawn: true + parent: BaseParadoxAnomalyObjective + id: ParadoxAnomalyKillObjective + description: This universe doesn't have room for both of us. + components: + - type: Objective + icon: + sprite: Objects/Weapons/Guns/Pistols/viper.rsi + state: icon + - type: TargetObjective + title: objective-paradox-anomaly-kill-title + - type: TerminatorTargetOverride + - type: KillPersonCondition + requireDead: true + +- type: entity + noSpawn: true + parent: BaseParadoxAnomalyObjective + id: ParadoxAnomalyFriendObjective + description: Perhaps there is room, as friends. + components: + - type: Objective + icon: + sprite: Objects/Misc/bureaucracy.rsi + state: folder-white + - type: TargetObjective + title: objective-paradox-anomaly-friend-title + - type: TerminatorTargetOverride + - type: KeepAliveCondition + +- type: entity + noSpawn: true + parent: [BaseParadoxAnomalyObjective, BaseLivingObjective] + id: ParadoxAnomalyEscapeObjective + name: Escape to centcom alive and unrestrained. + description: This is your universe now. + components: + - type: Objective + icon: + sprite: Structures/Furniture/chairs.rsi + state: shuttle + - type: EscapeShuttleCondition diff --git a/Resources/Prototypes/DeltaV/Shaders/birdvision.yml b/Resources/Prototypes/DeltaV/Shaders/birdvision.yml new file mode 100644 index 00000000000..43dc7ae2485 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Shaders/birdvision.yml @@ -0,0 +1,4 @@ +- type: shader + id: UltraVision + kind: source + path: "/Textures/DeltaV/Shaders/ultravision.swsl" diff --git a/Resources/Prototypes/DeltaV/Species/harpy.yml b/Resources/Prototypes/DeltaV/Species/harpy.yml index 0df69e9d729..bcc4dd22c44 100644 --- a/Resources/Prototypes/DeltaV/Species/harpy.yml +++ b/Resources/Prototypes/DeltaV/Species/harpy.yml @@ -3,11 +3,33 @@ name: species-name-harpy roundStart: true prototype: MobHarpy - sprites: MobHumanSprites + sprites: MobHarpySprites markingLimits: MobHarpyMarkingLimits dollPrototype: MobHarpyDummy skinColoration: HumanToned +- type: speciesBaseSprites + id: MobHarpySprites + sprites: + Head: MobHarpyHead + Hair: MobHumanoidAnyMarking + FacialHair: MobHumanoidAnyMarking + Snout: MobHumanoidAnyMarking + Chest: MobHarpyTorso + HeadTop: MobHumanoidAnyMarking + HeadSide: MobHumanoidAnyMarking + Tail: MobHumanoidAnyMarking + Eyes: MobHumanoidEyes + LArm: MobHarpyLArm + RArm: MobHarpyRArm + LHand: MobHarpyLHand + RHand: MobHarpyRHand + LLeg: MobHarpyLLeg + RLeg: MobHarpyRLeg + LFoot: MobHarpyLFoot + RFoot: MobHarpyRFoot + + - type: markingPoints id: MobHarpyMarkingLimits points: @@ -27,7 +49,8 @@ defaultMarkings: [ HarpyEarsDefault ] Chest: points: 1 - required: false + required: true + defaultMarkings: [ HarpyChestDefault ] Legs: points: 2 required: false @@ -35,3 +58,87 @@ points: 1 required: false defaultMarkings: [ HarpyWingDefault ] + +- type: humanoidBaseSprite + id: MobHarpyHead + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobHarpyHeadMale + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: head_m + +- type: humanoidBaseSprite + id: MobHarpyHeadFemale + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: head_f + +- type: humanoidBaseSprite + id: MobHarpyTorso + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobHarpyTorsoMale + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: torso_m + +- type: humanoidBaseSprite + id: MobHarpyTorsoFemale + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: torso_f + +- type: humanoidBaseSprite + id: MobHarpyLLeg + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: l_leg + +- type: humanoidBaseSprite + id: MobHarpyLHand + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: l_hand + +- type: humanoidBaseSprite + id: MobHarpyLArm + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: l_arm + +- type: humanoidBaseSprite + id: MobHarpyLFoot + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: l_foot + +- type: humanoidBaseSprite + id: MobHarpyRLeg + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: r_leg + +- type: humanoidBaseSprite + id: MobHarpyRHand + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: r_hand + +- type: humanoidBaseSprite + id: MobHarpyRArm + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: r_arm + +- type: humanoidBaseSprite + id: MobHarpyRFoot + baseSprite: + sprite: DeltaV/Mobs/Species/Harpy/parts.rsi + state: r_foot diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml new file mode 100644 index 00000000000..cb6c1bfa42d --- /dev/null +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -0,0 +1,13 @@ +- type: trait + id: UltraVision + name: Ultraviolet Vision + description: trait-ultravision-desc + components: + - type: UltraVision + +- type: trait + id: DefaultVision + name: Normal Vision + description: trait-defaultvision-desc + components: + - type: DefaultVision diff --git a/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml index c1b56dd28b7..89db03d2fcc 100644 --- a/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml +++ b/Resources/Prototypes/DeltaV/Voice/speech_sounds.yml @@ -6,3 +6,12 @@ path: /Audio/DeltaV/Voice/Talk/vulp_ask.ogg exclaimSound: path: /Audio/DeltaV/Voice/Talk/vulp_exclaim.ogg + +- type: speechSounds + id: Harpy + saySound: + path: /Audio/DeltaV/Voice/Harpy/chirp1.ogg + askSound: + path: /Audio/DeltaV/Voice/Harpy/chirp1.ogg + exclaimSound: + path: /Audio/DeltaV/Voice/Harpy/chirp1.ogg diff --git a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml index 01288498fe6..9ffa21b8c8e 100644 --- a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml +++ b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml @@ -13,3 +13,11 @@ - chat-speech-verb-felinid-2 - chat-speech-verb-felinid-3 - chat-speech-verb-felinid-4 + +- type: speechVerb + id: Harpy + speechVerbStrings: + - chat-speech-verb-harpy-1 + - chat-speech-verb-harpy-2 + - chat-speech-verb-harpy-3 + - chat-speech-verb-harpy-4 diff --git a/Resources/Prototypes/DeltaV/tags.yml b/Resources/Prototypes/DeltaV/tags.yml index d636db0146d..72181758e38 100644 --- a/Resources/Prototypes/DeltaV/tags.yml +++ b/Resources/Prototypes/DeltaV/tags.yml @@ -18,6 +18,9 @@ - type: Tag id: HandLabeler +- type: Tag + id: HidesHarpyWings + - type: Tag id: MagazinePistolSpecial # For the .38 special ammo and pistol @@ -38,3 +41,6 @@ - type: Tag id: PaperSlip + +- type: Tag + id: Skirt diff --git a/Resources/Prototypes/DeltaV/typing_indicator.yml b/Resources/Prototypes/DeltaV/typing_indicator.yml new file mode 100644 index 00000000000..c5372b3cc35 --- /dev/null +++ b/Resources/Prototypes/DeltaV/typing_indicator.yml @@ -0,0 +1,4 @@ +- type: typingIndicator + id: felinid + typingState: felinid0 + offset: 0, 0.2 # 0625 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 82df2c21e8f..13524efa9e6 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -92,6 +92,7 @@ tags: - Hardsuit - WhitelistChameleon + - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites - type: entity abstract: true @@ -110,6 +111,9 @@ - type: HeldSpeedModifier - type: Item size: Huge + - type: Tag + tags: + - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites - type: entity parent: ClothingOuterBase diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml index 0329f82b5b1..9a5e0211f36 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/base_clothinguniforms.yml @@ -59,3 +59,6 @@ - type: Clothing slots: [innerclothing] femaleMask: UniformTop + - type: Tag #DeltaV, needed for species with nonhuman legs/can only wear skirts + tags: + - Skirt diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml index 623f7becfc1..c68075dc508 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/gauze.yml @@ -2,7 +2,7 @@ id: GauzeLefteyePatch bodyPart: Eyes markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -16,7 +16,7 @@ id: GauzeLefteyeTape bodyPart: Eyes markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -30,7 +30,7 @@ id: GauzeRighteyePatch bodyPart: Eyes markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + speciesRestriction: [Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -44,7 +44,7 @@ id: GauzeRighteyeTape bodyPart: Eyes markingCategory: Head - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -72,7 +72,7 @@ id: GauzeShoulder bodyPart: Chest markingCategory: Chest - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -86,7 +86,7 @@ id: GauzeStomach bodyPart: Chest markingCategory: Chest - speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Harpy, Vulpkanin] # Delta V - Felinid, Oni, Harpy, Vulpkanin + speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin coloring: default: type: @@ -291,4 +291,4 @@ color: "#FFFFFF" sprites: - sprite: Mobs/Customization/gauze.rsi - state: gauze_lizardblindfold \ No newline at end of file + state: gauze_lizardblindfold diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml index 2468b2c5346..cca16443e2c 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/scars.yml @@ -2,7 +2,7 @@ id: ScarEyeRight bodyPart: Head markingCategory: Head - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni] # Delta V - Felinid, Oni, Harpy coloring: default: type: @@ -16,7 +16,7 @@ id: ScarEyeLeft bodyPart: Head markingCategory: Head - speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni + speciesRestriction: [Human, Dwarf, Felinid, Harpy, Oni] # Delta V - Felinid, Oni, Harpy coloring: default: type: diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml index b17fb5d1f3c..b9ffd9ba0d6 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml @@ -2,7 +2,7 @@ id: TattooHiveChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni coloring: default: type: @@ -16,7 +16,7 @@ id: TattooNightlingChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni coloring: default: type: @@ -30,7 +30,7 @@ id: TattooSilverburghLeftLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni coloring: default: type: @@ -44,7 +44,7 @@ id: TattooSilverburghRightLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni coloring: default: type: @@ -86,7 +86,7 @@ id: TattooCampbellLeftLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni coloring: default: type: @@ -100,7 +100,7 @@ id: TattooCampbellRightLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + speciesRestriction: [Human, Dwarf, Felinid, Oni] # Delta V - Felinid, Oni coloring: default: type: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 3f38b1c2723..396094eeafa 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -274,6 +274,9 @@ guides: - MinorAntagonists - type: FelinidFood # Nyanotrasen - Felinid, ability to eat rat, see Content.Server/Nyanotrasen/Abilities/Felinid/FelinidSystem.cs + - type: Food + - type: Item + size: Tiny # Delta V - Make them eatable and pickable. - type: weightedRandomEntity id: RatKingLoot diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 2fbde82b049..2dcf3603cf9 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -43,17 +43,17 @@ minimumPlayers: 15 - type: BreakerFlipRule -# - type: entity -# id: BureaucraticError # DeltaV - Prevent the BureaucraticError event to happen. -# parent: BaseGameRule -# noSpawn: true -# components: -# - type: StationEvent -# startAnnouncement: station-event-bureaucratic-error-announcement -# minimumPlayers: 25 -# weight: 5 -# duration: 1 -# - type: BureaucraticErrorRule +- type: entity + id: BureaucraticError + parent: BaseGameRule + noSpawn: true + components: + - type: StationEvent + startAnnouncement: station-event-bureaucratic-error-announcement + minimumPlayers: 25 + weight: 5 + duration: 1 + - type: BureaucraticErrorRule - type: entity id: ClericalError @@ -280,7 +280,7 @@ lightBreakChancePerSecond: 0.0003 doorToggleChancePerSecond: 0.001 -# - type: entity +# - type: entity # DeltaV - replaced terminator with paradox anomaly in midroundantag rule # parent: BaseGameRule # id: TerminatorSpawn # noSpawn: true diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Boxes/general.yml index 6f227252cb6..ed839a011dc 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Boxes/general.yml @@ -60,16 +60,16 @@ id: BoxHolyWater description: This box is filled with everything you need to make homemade holy water. Water not included. components: -# - type: StorageFill -# contents: -# - id: MercuryChemistryBottle -# amount: 3 -# - id: DrinkWineBottleFull -# amount: 1 -# - id: SprayBottle -# amount: 1 - - type: Sprite - layers: - - state: box_science - - sprite: Nyanotrasen/Objects/Storage/boxes.rsi - state: holywater + - type: StorageFill + contents: + - id: DrinkWineCan + amount: 2 + - id: SprayBottle + amount: 1 + - id: MercuryChemistryBottle + amount: 2 + - type: Sprite + layers: + - state: box_science + - sprite: Nyanotrasen/Objects/Storage/boxes.rsi + state: holywater diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml index bd6c39db6fd..db7936cc5b4 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/felinid.yml @@ -18,6 +18,21 @@ speechVerb: Felinid - type: MobMover - type: InputMover + - type: Reactive + groups: + Flammable: [ Touch ] + Extinguish: [ Touch ] + reactions: + - reagents: [ Water, SpaceCleaner ] + methods: [ Touch ] + effects: + - !type:WashCreamPieReaction + - reagents: [ Water ] + methods: [ Touch ] + effects: + - !type:Emote + emote: Scream + probability: 0.2 - type: Respirator damage: types: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml index e2e15dcfa95..d9b25c5dd1b 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml @@ -25,6 +25,10 @@ prototype: Felinid - type: Damageable damageModifierSet: Felinid + - type: SlowOnDamage + speedModifierThresholds: + 60: 0.85 # 0.7 is base speed. + 80: 0.75 # 0.5 is base speed. - type: MeleeWeapon soundHit: collection: Punch @@ -36,20 +40,22 @@ # - type: DiseaseCarrier # naturalImmunities: # - OwOnavirus - - type: Thieving - stealthy: true - stripTimeReduction: 1 - type: Speech speechSounds: Alto - - type: DamageOnHighSpeedImpact + - type: DamageOnHighSpeedImpact # Landing on all fours! damage: types: Blunt: 1 - type: Stamina critThreshold: 85 + - type: TypingIndicator + proto: felinid - type: PseudoItem + storedOffset: 0,17 shape: - - 0,0,5,1 + - 0,0,1,4 + - 0,2,3,4 + - 4,0,5,4 - type: Vocal wilhelm: "/Audio/Nyanotrasen/Voice/Felinid/cat_wilhelm.ogg" sounds: @@ -57,6 +63,7 @@ Female: FemaleFelinid Unsexed: MaleFelinid - type: Felinid + - type: NoShoesSilentFootsteps - type: entity save: false diff --git a/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/equipped-head-harpy.png b/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/equipped-head-harpy.png new file mode 100644 index 00000000000..8be453ab873 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/equipped-head-harpy.png differ diff --git a/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/meta.json index b0b6e0a2b03..93d9fece1d0 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/atmospherics.rsi/meta.json @@ -58,6 +58,10 @@ { "name": "equipped-head-vulpkanin", "directions": 4 + }, + { + "name": "equipped-head-harpy", + "directions": 4 } ] } diff --git a/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/meta.json index ac71856cd7a..cc8edd38197 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/meta.json @@ -36,6 +36,14 @@ { "name": "on-inhand-right", "directions": 4 + }, + { + "name": "off-equipped-HELMET-harpy", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-harpy", + "directions": 4 } ] } diff --git a/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/off-equipped-HELMET-harpy.png b/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/off-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..4c614ca87c7 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/off-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/on-equipped-HELMET-harpy.png b/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/on-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..d5caee7ec03 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/capspace.rsi/on-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-harpy.png b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-harpy.png new file mode 100644 index 00000000000..95b5e1fd7f3 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json index 855e3345c98..f6b86138919 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/cybersun.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HELMET", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-HELMET-harpy", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/meta.json index 4dae2c687da..1ac1729cd2d 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/meta.json @@ -42,7 +42,15 @@ "directions": 4 }, { - "name": "off-equipped-HELMET-vulpkanin", + "name": "off-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-harpy", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-harpy", "directions": 4 } ] diff --git a/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/off-equipped-HELMET-harpy.png b/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/off-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..fea5970d5d2 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/off-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/on-equipped-HELMET-harpy.png b/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/on-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..614b148f17a Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/engineering-white.rsi/on-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..f041f046bbc Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/meta.json index e482264df5f..ef5e62cca40 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/atmospherics.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..d2622538579 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json index 342d7844737..7f50fdcf083 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/capspace.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..54b2f24d036 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/meta.json index 7786f981121..1cfa2a9cfe4 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/cybersun.rsi/meta.json @@ -1,26 +1,30 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Sprite made by Gtheglorious based on the sprite made by emisse for ss14", + "copyright": "Sprite made by Gtheglorious based on the sprite made by emisse for ss14, harpy variant by VMSolidus", "size": { "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..865364771e1 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json index e482264df5f..ef5e62cca40 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering-white.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..2510e35db9f Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/meta.json index e482264df5f..cbf3391af71 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/engineering.rsi/meta.json @@ -1,26 +1,30 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/4f6190e2895e09116663ef282d3ce1d8b35c032e, harpy version by VMSolidus", "size": { "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..38403243634 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/meta.json index d977572f2ab..0261a0564f1 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/luxury.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..2d682adeae0 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/meta.json index e482264df5f..ef5e62cca40 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/medical.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..8ccba9f1fca Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/meta.json index 31ae448b3ed..64b98f1e798 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/paramed.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..229b19e724d Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/meta.json index e482264df5f..ef5e62cca40 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/salvage.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..43af6d982d9 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json index c661a435c14..f6a942a8956 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/spatio.rsi/meta.json @@ -8,21 +8,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..4900a6765b3 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/meta.json index 40d49ce92f7..80c2af9eba2 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndicate.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..9a6a1dabfb6 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json index 7863947d1cc..4aa4d60ccb8 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiecommander.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..01080df27dd Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json index 373d282410c..90e3c14bb5e 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/syndiemedic.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/meta.json index 58442928cec..41acd5c4fd5 100644 --- a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/meta.json @@ -6,28 +6,36 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "icon-flash" - }, - { - "name": "off-equipped-HELMET", - "directions": 4 - }, - { - "name": "on-equipped-HELMET", - "directions": 4 - }, - { - "name": "off-equipped-HELMET-vulpkanin", - "directions": 4 - }, - { - "name": "on-equipped-HELMET-vulpkanin", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "icon-flash" + }, + { + "name": "off-equipped-HELMET", + "directions": 4 + }, + { + "name": "on-equipped-HELMET", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-harpy", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/off-equipped-HELMET-harpy.png b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/off-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..a2b4c824221 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/off-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/on-equipped-HELMET-harpy.png b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/on-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..8ddb6b20116 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/hos.rsi/on-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/meta.json index 58442928cec..41acd5c4fd5 100644 --- a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/meta.json @@ -6,28 +6,36 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "icon-flash" - }, - { - "name": "off-equipped-HELMET", - "directions": 4 - }, - { - "name": "on-equipped-HELMET", - "directions": 4 - }, - { - "name": "off-equipped-HELMET-vulpkanin", - "directions": 4 - }, - { - "name": "on-equipped-HELMET-vulpkanin", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "icon-flash" + }, + { + "name": "off-equipped-HELMET", + "directions": 4 + }, + { + "name": "on-equipped-HELMET", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-harpy", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/off-equipped-HELMET-harpy.png b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/off-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..9fa3969d420 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/off-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/on-equipped-HELMET-harpy.png b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/on-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..2d59f86324c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/officer.rsi/on-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/meta.json index 58442928cec..41acd5c4fd5 100644 --- a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/meta.json @@ -6,28 +6,36 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "icon-flash" - }, - { - "name": "off-equipped-HELMET", - "directions": 4 - }, - { - "name": "on-equipped-HELMET", - "directions": 4 - }, - { - "name": "off-equipped-HELMET-vulpkanin", - "directions": 4 - }, - { - "name": "on-equipped-HELMET-vulpkanin", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "icon-flash" + }, + { + "name": "off-equipped-HELMET", + "directions": 4 + }, + { + "name": "on-equipped-HELMET", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-vulpkanin", + "directions": 4 + }, + { + "name": "off-equipped-HELMET-harpy", + "directions": 4 + }, + { + "name": "on-equipped-HELMET-harpy", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/off-equipped-HELMET-harpy.png b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/off-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..86878824614 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/off-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/on-equipped-HELMET-harpy.png b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/on-equipped-HELMET-harpy.png new file mode 100644 index 00000000000..d8ac647ca83 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hardsuits/Combat/standard.rsi/on-equipped-HELMET-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..ff95b7299f4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/advanced.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..dd5a7508a9a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/corpsman.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..c87fddc15fe Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/hos.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..65bbca12fa7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/medical.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..ae58f653ccb Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/officer.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..16687721a7f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/riot.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..1af2f8defa6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/standard.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/equipped-OUTERCLOTHING-harpy.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/equipped-OUTERCLOTHING-harpy.png new file mode 100644 index 00000000000..81a103a0842 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/equipped-OUTERCLOTHING-harpy.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json index 1253f8b4e63..4844e816bd1 100644 --- a/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Hardsuits/Combat/warden.rsi/meta.json @@ -6,21 +6,25 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-OUTERCLOTHING", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-harpy", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png new file mode 100644 index 00000000000..bc449db5ea7 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/lower.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json new file mode 100644 index 00000000000..d4f4136903f --- /dev/null +++ b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and and modified by @raistlin_jag with parts by @ps3moira", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "upper", + "directions": 4 + }, + { + "name": "lower", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png new file mode 100644 index 00000000000..62080c4f1dc Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_chest.rsi/upper.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png index fa27e2b74a6..00ddb37abd9 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png new file mode 100644 index 00000000000..d37935c9316 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/feet.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json new file mode 100644 index 00000000000..53abefa9a80 --- /dev/null +++ b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by @ps3moira", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "feet", + "directions": 4 + }, + { + "name": "thighs", + "directions": 4 + }, + { + "name": "talons", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png new file mode 100644 index 00000000000..cc55693289c Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/talons.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png new file mode 100644 index 00000000000..89b2463c48d Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_legs.rsi/thighs.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json index b795894cae1..bf58e418285 100644 --- a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json +++ b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Phoenix and Rooster by @leonardo_dabepis", + "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch by @stillxicarus", "size": { "x": 32, "y": 32 @@ -15,6 +15,5 @@ "name": "rooster_tail", "directions": 4 } - ] } diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png index e3aace5e8c7..0254b0fe3e2 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png index 1cbca989d19..e6a4e00271d 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png new file mode 100644 index 00000000000..b151d4a48d2 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/finch_tail.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json new file mode 100644 index 00000000000..8284a502d40 --- /dev/null +++ b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_tailsx72.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Finch by @stillxicarus", + "size": { + "x": 36, + "y": 32 + }, + "states": [ + { + "name": "finch_tail", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png new file mode 100644 index 00000000000..dd870ea01de Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wingcover.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png new file mode 100644 index 00000000000..6f39a925124 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/classicharpy.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png index ce932f0df5f..4ed888072fa 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png index 2030ff8cf2d..3edaf057e7b 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png index f8825513a34..cc7ad928781 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png index 4bd00186567..bd11f128114 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png index 7e431a95b43..a27169651dd 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png index 477e6873e8f..c378328a02f 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png new file mode 100644 index 00000000000..32dde55ffdb Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyfolded.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png index f48d8e6538d..00cf7c36794 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png index b687a2bf9f0..32aef4b6218 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png index 7a792111c50..4410790851d 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png index 8a753996b72..ace8b76f087 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png index 49f7e0c1353..f603ce356be 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png index bde6c006920..94ad0126cd4 100644 Binary files a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png and b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json index 0785ff1aaa6..4f2afaec699 100644 --- a/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json +++ b/Resources/Textures/DeltaV/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json @@ -5,12 +5,16 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag", + "copyright": "Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded by @stillxicarus", "states": [ { "name": "harpy", "directions": 4 }, + { + "name": "harpyfolded", + "directions": 4 + }, { "name": "harpy2tone1", "directions": 4 @@ -54,6 +58,10 @@ { "name": "harpywingtip2", "directions": 4 + }, + { + "name": "classicharpy", + "directions": 4 } ] } diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/lung-l.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/lung-l.png new file mode 100644 index 00000000000..32aca484b9f Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/lung-l.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/lung-r.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/lung-r.png new file mode 100644 index 00000000000..7e29649ccd8 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/lung-r.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/meta.json new file mode 100644 index 00000000000..e639085d8d0 --- /dev/null +++ b/Resources/Textures/DeltaV/Mobs/Species/Harpy/organs.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation and cev-eris at https://github.com/tgstation/tgstation/commit/c4b7f3c41b6742aca260fe60cc358a778ba9b8c8 and https://github.com/discordia-space/CEV-Eris/commit/476e374cea95ff5e8b1603c48342bf700e2cd7af", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "lung-l" + }, + { + "name": "lung-r" + } + ] +} diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/full.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/full.png new file mode 100644 index 00000000000..e358746ec8b Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/full.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/head_f.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/head_f.png new file mode 100644 index 00000000000..b705d2d50e8 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/head_f.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/head_m.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/head_m.png new file mode 100644 index 00000000000..e555d030bea Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/head_m.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_arm.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_arm.png new file mode 100644 index 00000000000..87c10adfa22 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_arm.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_foot.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_foot.png new file mode 100644 index 00000000000..a03b643ad62 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_foot.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_hand.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_hand.png new file mode 100644 index 00000000000..2e0ec001ce2 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_hand.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_leg.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_leg.png new file mode 100644 index 00000000000..a70f92524b6 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/l_leg.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/meta.json b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/meta.json new file mode 100644 index 00000000000..4073a762e89 --- /dev/null +++ b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and modified by DrSmugleaf, Legs and lower torso parts made by @ps3moira, Full reference with parts made by @Still-Icarus", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "full" + }, + { + "name": "head_f", + "directions": 4 + }, + { + "name": "head_m", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "torso_f", + "directions": 4 + }, + { + "name": "torso_m", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_arm.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_arm.png new file mode 100644 index 00000000000..6a47ac86071 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_arm.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_foot.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_foot.png new file mode 100644 index 00000000000..ef502c30f5c Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_foot.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_hand.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_hand.png new file mode 100644 index 00000000000..2c16b27041c Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_hand.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_leg.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_leg.png new file mode 100644 index 00000000000..9cdd3b85566 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/r_leg.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/torso_f.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/torso_f.png new file mode 100644 index 00000000000..23dde35cd8e Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/torso_f.png differ diff --git a/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/torso_m.png b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/torso_m.png new file mode 100644 index 00000000000..9a30fbfb574 Binary files /dev/null and b/Resources/Textures/DeltaV/Mobs/Species/Harpy/parts.rsi/torso_m.png differ diff --git a/Resources/Textures/DeltaV/Shaders/ultravision.swsl b/Resources/Textures/DeltaV/Shaders/ultravision.swsl new file mode 100644 index 00000000000..a0dccaf2459 --- /dev/null +++ b/Resources/Textures/DeltaV/Shaders/ultravision.swsl @@ -0,0 +1,14 @@ +uniform sampler2D SCREEN_TEXTURE; + +void fragment() { + highp vec4 color = zTextureSpec(SCREEN_TEXTURE, UV); + + highp mat3 m = mat3( + vec3(0.000,1.000,0.000), + vec3(0.000,0.000,1.000), + vec3(-0.165,0.165,1.000) + ); + highp vec3 result = color.rgb * m; + + COLOR = vec4(result, 1); +} diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/barbershop.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/barbershop.png new file mode 100644 index 00000000000..d196072a32b Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/barbershop.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_exam.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_exam.png new file mode 100644 index 00000000000..dc1eb795e80 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_exam.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_icu.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_icu.png new file mode 100644 index 00000000000..d4d2e4cd576 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_icu.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/laundromat.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/laundromat.png new file mode 100644 index 00000000000..251e0ebd7b7 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/laundromat.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json index 0d38f6d8592..d8b241c55fb 100644 --- a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers", + "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers | directional_exam, directional_icu, laundromat, barbershop signs by @rosieposieeee based on existing signage style", "size": { "x": 32, "y": 32 @@ -14,6 +14,30 @@ { "name": "direction_mail", "directions": 4 + }, + { + "name": "direction_exam", + "directions": 4 + }, + { + "name": "direction_icu", + "directions": 4 + }, + { + "name": "laundromat", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "barbershop", + "delays": [ + [ + 1 + ] + ] } ] } \ No newline at end of file diff --git a/Resources/Textures/Effects/speech.rsi/felinid0.png b/Resources/Textures/Effects/speech.rsi/felinid0.png new file mode 100644 index 00000000000..586d1e6a343 Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/felinid0.png differ diff --git a/Resources/Textures/Effects/speech.rsi/felinid1.png b/Resources/Textures/Effects/speech.rsi/felinid1.png new file mode 100644 index 00000000000..8af894f1dec Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/felinid1.png differ diff --git a/Resources/Textures/Effects/speech.rsi/felinid2.png b/Resources/Textures/Effects/speech.rsi/felinid2.png new file mode 100644 index 00000000000..abb5f04373e Binary files /dev/null and b/Resources/Textures/Effects/speech.rsi/felinid2.png differ diff --git a/Resources/Textures/Effects/speech.rsi/meta.json b/Resources/Textures/Effects/speech.rsi/meta.json index 65d5615b3e3..f500bf943db 100644 --- a/Resources/Textures/Effects/speech.rsi/meta.json +++ b/Resources/Textures/Effects/speech.rsi/meta.json @@ -411,6 +411,23 @@ }, { "name": "spider2" + }, + { + "name": "felinid0", + "delays":[ + [ + 0.2, + 0.3, + 0.3, + 0.5 + ] + ] + }, + { + "name": "felinid1" + }, + { + "name": "felinid2" } ] }