diff --git a/Content.Client/MobState/DamageStateVisualizer.cs b/Content.Client/MobState/DamageStateVisualizer.cs deleted file mode 100644 index db672bb857..0000000000 --- a/Content.Client/MobState/DamageStateVisualizer.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Collections.Generic; -using Content.Shared.MobState; -using JetBrains.Annotations; -using Robust.Client.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager.Attributes; -using DrawDepth = Content.Shared.DrawDepth.DrawDepth; - -namespace Content.Client.MobState -{ - [UsedImplicitly] - public sealed class DamageStateVisualizer : AppearanceVisualizer, ISerializationHooks - { - private DamageState _data = DamageState.Alive; - private Dictionary _stateMap = new(); - private int? _originalDrawDepth; - - [DataField("normal")] - private string? _normal; - - [DataField("crit")] - private string? _crit; - - [DataField("dead")] - private string? _dead; - - /// - /// Should noRot be turned off when crit / dead. - /// - [DataField("rotate")] - private bool _rotate; - - void ISerializationHooks.BeforeSerialization() - { - _stateMap.TryGetValue(DamageState.Alive, out _normal); - _stateMap.TryGetValue(DamageState.Critical, out _crit); - _stateMap.TryGetValue(DamageState.Dead, out _dead); - } - - void ISerializationHooks.AfterDeserialization() - { - if (_normal != null) - { - _stateMap.Add(DamageState.Alive, _normal); - } - - if (_crit != null) - { - _stateMap.Add(DamageState.Critical, _crit); - } - - if (_dead != null) - { - _stateMap.Add(DamageState.Dead, _dead); - } - } - - public override void OnChangeData(AppearanceComponent component) - { - base.OnChangeData(component); - var sprite = IoCManager.Resolve().GetComponent(component.Owner); - if (!component.TryGetData(DamageStateVisuals.State, out DamageState data)) - { - return; - } - - if (_data == data) - { - return; - } - - _data = data; - - if (_rotate) - { - sprite.NoRotation = data switch - { - DamageState.Critical => false, - DamageState.Dead => false, - _ => true - }; - } - - if (_stateMap.TryGetValue(_data, out var state)) - { - sprite.LayerSetState(DamageStateVisualLayers.Base, state); - } - - // So they don't draw over mobs anymore - if (_data == DamageState.Dead && sprite.DrawDepth > (int) DrawDepth.Items) - { - _originalDrawDepth = sprite.DrawDepth; - sprite.DrawDepth = (int) DrawDepth.Items; - } - else if (_originalDrawDepth != null) - { - sprite.DrawDepth = _originalDrawDepth.Value; - _originalDrawDepth = null; - } - } - } - - public enum DamageStateVisualLayers : byte - { - Base - } -} diff --git a/Content.Client/MobState/DamageStateVisualizerSystem.cs b/Content.Client/MobState/DamageStateVisualizerSystem.cs new file mode 100644 index 0000000000..e73d56c2aa --- /dev/null +++ b/Content.Client/MobState/DamageStateVisualizerSystem.cs @@ -0,0 +1,57 @@ +using Content.Shared.MobState; +using Robust.Client.GameObjects; +using DrawDepth = Content.Shared.DrawDepth.DrawDepth; + +namespace Content.Client.MobState; + +public sealed class DamageStateVisualizerSystem : VisualizerSystem +{ + protected override void OnAppearanceChange(EntityUid uid, DamageStateVisualsComponent component, ref AppearanceChangeEvent args) + { + var sprite = args.Sprite; + + if (sprite == null || !args.Component.TryGetData(DamageStateVisuals.State, out DamageState data)) + { + return; + } + + if (!component.States.TryGetValue(data, out var layers)) + { + return; + } + + if (component.Rotate) + { + sprite.NoRotation = data switch + { + DamageState.Critical => false, + DamageState.Dead => false, + _ => true + }; + } + + // Brain no worky rn so this was just easier. + foreach (var layer in sprite.AllLayers) + { + layer.Visible = false; + } + + foreach (var (key, state) in layers) + { + sprite.LayerSetVisible(key, true); + sprite.LayerSetState(key, state); + } + + // So they don't draw over mobs anymore + if (data == DamageState.Dead && sprite.DrawDepth > (int) DrawDepth.Items) + { + component.OriginalDrawDepth = sprite.DrawDepth; + sprite.DrawDepth = (int) DrawDepth.Items; + } + else if (component.OriginalDrawDepth != null) + { + sprite.DrawDepth = component.OriginalDrawDepth.Value; + component. OriginalDrawDepth = null; + } + } +} diff --git a/Content.Client/MobState/DamageStateVisualsComponent.cs b/Content.Client/MobState/DamageStateVisualsComponent.cs new file mode 100644 index 0000000000..f8f67243a5 --- /dev/null +++ b/Content.Client/MobState/DamageStateVisualsComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.MobState; + +namespace Content.Client.MobState; + +[RegisterComponent] +public sealed class DamageStateVisualsComponent : Component +{ + public int? OriginalDrawDepth; + + [DataField("states")] public Dictionary> States = new(); + + /// + /// Should noRot be turned off when crit / dead. + /// + [DataField("rotate")] public bool Rotate; +} + +public enum DamageStateVisualLayers : byte +{ + Base, + BaseUnshaded, +} diff --git a/Content.Server/Dragon/DragonComponent.cs b/Content.Server/Dragon/DragonComponent.cs new file mode 100644 index 0000000000..c8e7fffe7b --- /dev/null +++ b/Content.Server/Dragon/DragonComponent.cs @@ -0,0 +1,80 @@ +using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Containers; +using System.Threading; +using Content.Shared.Actions; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Sound; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Dragon +{ + [RegisterComponent] + public sealed class DragonComponent : Component + { + /// + /// The chemical ID injected upon devouring + /// + [DataField("devourChemical", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DevourChem = "Ichor"; + + /// + /// The amount of ichor injected per devour + /// + [DataField("devourHealRate")] + public float DevourHealRate = 15f; + + [DataField("devourActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DevourActionId = "DragonDevour"; + + [DataField("devourAction")] + public EntityTargetAction? DevourAction; + + [DataField("spawnActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SpawnActionId = "DragonSpawn"; + + [DataField("spawnAction")] + public InstantAction? SpawnAction; + + /// + /// The amount of time it takes to devour something + /// + /// NOTE: original intended design was to increase this proportionally with damage thresholds, but those proved quite difficult to get consistently. right now it devours the structure at a fixed timer. + /// + /// + [DataField("devourTime")] + public float DevourTime = 15f; + + [DataField("spawnCount")] public int SpawnsLeft = 2; + + [DataField("maxSpawnCount")] public int MaxSpawns = 2; + + [DataField("spawnProto", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? SpawnPrototype = "MobCarpDragon"; + + [ViewVariables(VVAccess.ReadWrite), DataField("soundDeath")] + public SoundSpecifier? SoundDeath = new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundDevour")] + public SoundSpecifier? SoundDevour = new SoundPathSpecifier("/Audio/Effects/demon_consume.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundStructureDevour")] + public SoundSpecifier? SoundStructureDevour = new SoundPathSpecifier("/Audio/Machines/airlock_creaking.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundRoar")] + public SoundSpecifier? SoundRoar = + new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg"); + + public CancellationTokenSource? CancelToken; + + /// + /// Where the entities go when dragon devours them, empties when the dragon is butchered. + /// + public Container DragonStomach = default!; + } + + public sealed class DragonDevourActionEvent : EntityTargetActionEvent {} + + public sealed class DragonSpawnActionEvent : InstantActionEvent {} +} diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs new file mode 100644 index 0000000000..22fac2f6e1 --- /dev/null +++ b/Content.Server/Dragon/DragonSystem.cs @@ -0,0 +1,188 @@ +using Content.Server.Body.Systems; +using Content.Server.DoAfter; +using Content.Server.Popups; +using Content.Shared.Actions; +using Content.Shared.CharacterAppearance.Components; +using Content.Shared.Chemistry.Components; +using Content.Shared.Damage; +using Content.Shared.MobState; +using Content.Shared.MobState.Components; +using Content.Shared.Tag; +using Robust.Shared.Audio; +using Robust.Shared.Containers; +using Robust.Shared.Player; +using System.Threading; +using Content.Shared.MobState.State; +using Content.Shared.Doors.Components; + +namespace Content.Server.Dragon +{ + public sealed class DragonSystem : EntitySystem + { + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnDevourAction); + SubscribeLocalEvent(OnDragonSpawnAction); + + SubscribeLocalEvent(OnDragonDevourComplete); + SubscribeLocalEvent(OnDragonDevourCancelled); + SubscribeLocalEvent(OnMobStateChanged); + } + + private void OnMobStateChanged(EntityUid uid, DragonComponent component, MobStateChangedEvent args) + { + //Empties the stomach upon death + //TODO: Do this when the dragon gets butchered instead + if (args.CurrentMobState.IsDead()) + { + if (component.SoundDeath != null) + SoundSystem.Play(component.SoundDeath.GetSound(), Filter.Pvs(uid, entityManager: EntityManager)); + + component.DragonStomach.EmptyContainer(); + } + } + + private void OnDragonDevourCancelled(EntityUid uid, DragonComponent component, DragonDevourCancelledEvent args) + { + component.CancelToken = null; + } + + private void OnDragonDevourComplete(EntityUid uid, DragonComponent component, DragonDevourComplete args) + { + component.CancelToken = null; + //TODO: Figure out a better way of removing structures via devour that still entails standing still and waiting for a DoAfter. Somehow. + EntityManager.QueueDeleteEntity(args.Target); + + if (component.SoundDevour != null) + SoundSystem.Play(component.SoundDevour.GetSound(), Filter.Pvs(args.User, entityManager: EntityManager)); + } + + private void OnStartup(EntityUid uid, DragonComponent component, ComponentStartup args) + { + component.SpawnsLeft = Math.Min(component.SpawnsLeft, component.MaxSpawns); + + //Dragon doesn't actually chew, since he sends targets right into his stomach. + //I did it mom, I added ERP content into upstream. Legally! + component.DragonStomach = _containerSystem.EnsureContainer(uid, "dragon_stomach"); + + if (component.DevourAction != null) + _actionsSystem.AddAction(uid, component.DevourAction, null); + + if (component.SpawnAction != null) + _actionsSystem.AddAction(uid, component.SpawnAction, null); + + if (component.SoundRoar != null) + SoundSystem.Play(component.SoundRoar.GetSound(), Filter.Pvs(uid, 4f, EntityManager)); + } + + /// + /// The devour action + /// + private void OnDevourAction(EntityUid dragonuid, DragonComponent component, DragonDevourActionEvent args) + { + if (component.CancelToken != null || args.Handled) return; + + args.Handled = true; + var target = args.Target; + var ichorInjection = new Solution(component.DevourChem, component.DevourHealRate); + + //Check if the target is valid. The effects should be possible to accomplish on either a wall or a body. + //Eating bodies is instant, the wall requires a doAfter. + + if (EntityManager.TryGetComponent(target, out MobStateComponent? targetState)) + { + switch (targetState.CurrentState) + { + case SharedCriticalMobState: + case SharedDeadMobState: + if (!EntityManager.HasComponent(dragonuid)) return; + + //Humanoid devours allow dragon to get eggs, corpses included + if (EntityManager.HasComponent(target)) + { + // Add a spawn for a consumed humanoid + component.SpawnsLeft = Math.Min(component.SpawnsLeft + 1, component.MaxSpawns); + } + //Non-humanoid mobs can only heal dragon for half the normal amount, with no additional spawn tickets + else + { + ichorInjection.ScaleSolution(0.5f); + } + + _bloodstreamSystem.TryAddToChemicals(dragonuid, ichorInjection); + component.DragonStomach.Insert(target); + + if (component.SoundDevour != null) + SoundSystem.Play(component.SoundDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager)); + + return; + default: + _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-fail-target-alive"), dragonuid, Filter.Entities(dragonuid)); + break; + } + + return; + } + + // Absolutely ass solution but requires less yaml fuckery + // If it's a door (firelock, airlock, windoor), Wall or Window, dragon can eat it. + if (_tagSystem.HasTag(target, "Wall") || (_tagSystem.HasTag(target, "Window") || EntityManager.HasComponent(target))) + { + _popupSystem.PopupEntity(Loc.GetString("devour-action-popup-message-structure"), dragonuid, Filter.Entities(dragonuid)); + + if (component.SoundStructureDevour != null) + SoundSystem.Play(component.SoundStructureDevour.GetSound(), Filter.Pvs(dragonuid, entityManager: EntityManager)); + + component.CancelToken = new CancellationTokenSource(); + + _doAfterSystem.DoAfter(new DoAfterEventArgs(dragonuid, component.DevourTime, component.CancelToken.Token, target) + { + UserFinishedEvent = new DragonDevourComplete(dragonuid, target), + UserCancelledEvent = new DragonDevourCancelledEvent(), + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnStun = true, + }); + } + } + + private void OnDragonSpawnAction(EntityUid dragonuid, DragonComponent component, DragonSpawnActionEvent args) + { + if (component.SpawnPrototype == null) return; + + // If dragon has spawns then add one. + if (component.SpawnsLeft > 0) + { + Spawn(component.SpawnPrototype, Transform(dragonuid).Coordinates); + component.SpawnsLeft--; + return; + } + + _popupSystem.PopupEntity(Loc.GetString("dragon-spawn-action-popup-message-fail-no-eggs"), dragonuid, Filter.Entities(dragonuid)); + } + + private sealed class DragonDevourComplete : EntityEventArgs + { + public EntityUid User { get; } + public EntityUid Target { get; } + + public DragonDevourComplete(EntityUid user, EntityUid target) + { + User = user; + Target = target; + } + } + + private sealed class DragonDevourCancelledEvent : EntityEventArgs {} + } +} diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index a223343439..0e8214e0e1 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -10,6 +10,7 @@ namespace Content.Server.Entry "InteractionOutline", "MeleeWeaponArcAnimation", "EffectVisuals", + "DamageStateVisuals", "AnimationsTest", "ItemStatus", "VehicleVisuals", diff --git a/Resources/Audio/Animals/license.txt b/Resources/Audio/Animals/license.txt index d613b12f11..76ba446b8a 100644 --- a/Resources/Audio/Animals/license.txt +++ b/Resources/Audio/Animals/license.txt @@ -4,39 +4,42 @@ licensed under CC BY-NC-SA 3.0 The following sounds were used from freesound: -cat_meow.ogg: modified from "Meow 4.wav" by freesound user "TRNGLE" (https://freesound.org/people/TRNGLE/sounds/368006/) licensed under CCBY 3.0. The original audio was trimmed, split to mono, and converted from WAV to OGG format. + cat_meow.ogg: modified from "Meow 4.wav" by freesound user "TRNGLE" (https://freesound.org/people/TRNGLE/sounds/368006/) licensed under CCBY 3.0. The original audio was trimmed, split to mono, and converted from WAV to OGG format. -cat_hiss.ogg: modified from "catHisses1.wav" by freesound user "Zabuhailo" (https://freesound.org/people/Zabuhailo/sounds/146963/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. + cat_hiss.ogg: modified from "catHisses1.wav" by freesound user "Zabuhailo" (https://freesound.org/people/Zabuhailo/sounds/146963/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. -small_dog_bark_happy.ogg: modified from "Dog bark2.wav" by freesound user "MisterTood" (https://freesound.org/people/MisterTood/sounds/9032/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. + small_dog_bark_happy.ogg: modified from "Dog bark2.wav" by freesound user "MisterTood" (https://freesound.org/people/MisterTood/sounds/9032/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. -duck_quack_happy.ogg: modified from "Duck Quack - Sound Effect (HD).mp3" by freesound user "Tabby+Gus." (https://freesound.org/people/Tabby+Gus./sounds/515408/) licensed under CC0 1.0 (public domain). The original audio was trimmed, looped, split to mono, and converted from MP3 to OGG format. + duck_quack_happy.ogg: modified from "Duck Quack - Sound Effect (HD).mp3" by freesound user "Tabby+Gus." (https://freesound.org/people/Tabby+Gus./sounds/515408/) licensed under CC0 1.0 (public domain). The original audio was trimmed, looped, split to mono, and converted from MP3 to OGG format. -chicken_cluck_happy.ogg: modified from "Chicken Single Alarm Call" by freesound user "Rudmer_Rotteveel" (https://freesound.org/people/Rudmer_Rotteveel/sounds/316920/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. + chicken_cluck_happy.ogg: modified from "Chicken Single Alarm Call" by freesound user "Rudmer_Rotteveel" (https://freesound.org/people/Rudmer_Rotteveel/sounds/316920/) licensed under CC0 1.0 (public domain). The original audio was trimmed and converted from WAV to OGG format. -ferret_happy.ogg: modified from "Ferret" by freesound user "J.Zazvurek" (https://freesound.org/people/J.Zazvurek/sounds/155115/) licensed under CC BY 3.0. The original audio was trimmed and converted from WAV to OGG format. + ferret_happy.ogg: modified from "Ferret" by freesound user "J.Zazvurek" (https://freesound.org/people/J.Zazvurek/sounds/155115/) licensed under CC BY 3.0. The original audio was trimmed and converted from WAV to OGG format. -mouse_squeak.ogg: modified from "Cartoon - Bat / Mouse Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/445958/) licensed under CC0 1.0 (public domain). The original audio was converted from WAV to OGG format. + mouse_squeak.ogg: modified from "Cartoon - Bat / Mouse Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/445958/) licensed under CC0 1.0 (public domain). The original audio was converted from WAV to OGG format. -sloth_squeak.ogg: modified from "squeakfinal.wav" by freesound user "Higgs01" (https://freesound.org/people/Higgs01/sounds/428114/) licensed under CC0 1.0 (Public domain dedication). The original audio was converted from WAV to OFF format AND converted from stereo to mono. + sloth_squeak.ogg: modified from "squeakfinal.wav" by freesound user "Higgs01" (https://freesound.org/people/Higgs01/sounds/428114/) licensed under CC0 1.0 (Public domain dedication). The original audio was converted from WAV to OFF format AND converted from stereo to mono. -parrot_raught.ogg: modified and used from "Parrot 1 raught 2.wav" by freesound user "Coral_Island_Studios" (https://freesound.org/people/Coral_Island_Studios/sounds/432588/) licensed under CC BY 3.0. The original audio was converted from WAV to OGG format. + parrot_raught.ogg: modified and used from "Parrot 1 raught 2.wav" by freesound user "Coral_Island_Studios" (https://freesound.org/people/Coral_Island_Studios/sounds/432588/) licensed under CC BY 3.0. The original audio was converted from WAV to OGG format. -fox_squeak.ogg: modified from "Video Game Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/468442/) licensed under CC0 1.0. The original audio was converted from WAV to OGG format + fox_squeak.ogg: modified from "Video Game Squeak" by freesound user "Breviceps" (https://freesound.org/people/Breviceps/sounds/468442/) licensed under CC0 1.0. The original audio was converted from WAV to OGG format -frog_ribbit.ogg: original audio created by freesound user "egomassive" (https://freesound.org/people/egomassive/sounds/536759/). licensed under licensed under CC0 1.0 + frog_ribbit.ogg: original audio created by freesound user "egomassive" (https://freesound.org/people/egomassive/sounds/536759/). licensed under licensed under CC0 1.0 -goose_honk.ogg: modified from " Bird Honk - 1" by freesound user "SpaceJoe" (https://freesound.org/people/SpaceJoe/sounds/510940/) licensed under CC0 1.0. The originial audio was converted from WAV to OGG format. + goose_honk.ogg: modified from " Bird Honk - 1" by freesound user "SpaceJoe" (https://freesound.org/people/SpaceJoe/sounds/510940/) licensed under CC0 1.0. The originial audio was converted from WAV to OGG format. -snake_hiss.ogg: modified from "hissing snake sound effect" by freesound user "Garuda1982" (https://freesound.org/people/Garuda1982/sounds/541656/) licensed under CC BY 4.0. The original audio was convertred from WAV to OGG format. + snake_hiss.ogg: modified from "hissing snake sound effect" by freesound user "Garuda1982" (https://freesound.org/people/Garuda1982/sounds/541656/) licensed under CC BY 4.0. The original audio was convertred from WAV to OGG format. + +The following sounds are taken from TGstation github (licensed under CC by 3.0): + + space_dragon_roar.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 The following sounds were used from youtube: -penguin_squawk.ogg: audio is recorded/created by youtube user "ProSounds" (https://youtu.be/Anr35RbBL3Y) licensed under CC BY 3.0. The original audio was trimmed and converted from MP3 to OGG format. + penguin_squawk.ogg: audio is recorded/created by youtube user "ProSounds" (https://youtu.be/Anr35RbBL3Y) licensed under CC BY 3.0. The original audio was trimmed and converted from MP3 to OGG format. -raccoon_squeak.ogg: audio is recorded by youtube user "jnargus" (https://youtu.be/BGjFP1CP7E0) licensed under CC by 3.0 + raccoon_squeak.ogg: audio is recorded by youtube user "jnargus" (https://youtu.be/BGjFP1CP7E0) licensed under CC by 3.0 -goat_bah.ogg: audio is created by youtube user "Winry Marini" (https://youtu.be/QIhwzsk5bww) licensed under CC BY 3.0 - -lizard_happy.ogg: audio created by youtube user "Nagaty Studio" (https://youtu.be/I7CX0AS8RNI) licensed under CC by 3.0. + goat_bah.ogg: audio is created by youtube user "Winry Marini" (https://youtu.be/QIhwzsk5bww) licensed under CC BY 3.0 + lizard_happy.ogg: audio created by youtube user "Nagaty Studio" (https://youtu.be/I7CX0AS8RNI) licensed under CC by 3.0. diff --git a/Resources/Audio/Animals/space_dragon_roar.ogg b/Resources/Audio/Animals/space_dragon_roar.ogg new file mode 100644 index 0000000000..f7f4503b89 Binary files /dev/null and b/Resources/Audio/Animals/space_dragon_roar.ogg differ diff --git a/Resources/Audio/Effects/demon_attack1.ogg b/Resources/Audio/Effects/demon_attack1.ogg new file mode 100644 index 0000000000..18b646f136 Binary files /dev/null and b/Resources/Audio/Effects/demon_attack1.ogg differ diff --git a/Resources/Audio/Effects/demon_consume.ogg b/Resources/Audio/Effects/demon_consume.ogg new file mode 100644 index 0000000000..2f8b51a7da Binary files /dev/null and b/Resources/Audio/Effects/demon_consume.ogg differ diff --git a/Resources/Audio/Effects/demon_dies.ogg b/Resources/Audio/Effects/demon_dies.ogg new file mode 100644 index 0000000000..c3ad866c6b Binary files /dev/null and b/Resources/Audio/Effects/demon_dies.ogg differ diff --git a/Resources/Audio/Effects/licenses.txt b/Resources/Audio/Effects/licenses.txt index 6ddb5dc5e7..9a49b6d509 100644 --- a/Resources/Audio/Effects/licenses.txt +++ b/Resources/Audio/Effects/licenses.txt @@ -31,3 +31,11 @@ minibombcountdown.ogg taken from Thomas Evdokimoff at https://freesound.org/peop bite.ogg take from https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 bone_rattle.ogg licensed under CC0 1.0 and taken from spookymodem at https://freesound.org/people/spookymodem/sounds/202102/ + +The following sounds are taken from TGstation github (licensed under CC by 3.0): + + demon_attack1.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 + + demon_consume.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 + + demon_dies.ogg: taken at https://github.com/tgstation/tgstation/commit/d4f678a1772007ff8d7eddd21cf7218c8e07bfc0 diff --git a/Resources/Locale/en-US/actions/actions/dragon.ftl b/Resources/Locale/en-US/actions/actions/dragon.ftl new file mode 100644 index 0000000000..582a10cf57 --- /dev/null +++ b/Resources/Locale/en-US/actions/actions/dragon.ftl @@ -0,0 +1,12 @@ +devour-action-popup-message-structure = Your jaws dig into thick material.. +devour-action-popup-message-fail-target-not-valid = That doesn't look particularly edible. +devour-action-popup-message-fail-target-alive = You can't consume creatures that are alive! + +dragon-spawn-action-popup-message-fail-no-eggs = You don't have the stamina to create a carp! + + +action-name-devour = [color=red]Devour[/color] +action-description-devour = Attempt to break a structure with your jaws or swallow a creature. + +action-name-carp-birth = Summon carp +action-description-carp-birth = Summon a carp to aid you at seizing the station! diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 47e068d08a..5ca7770f2d 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -2,14 +2,16 @@ # you'll likely have to tag its metabolizers with something other than Human. - type: metabolizerType - id: Human + id: Animal - type: metabolizerType - id: Animal + id: Dragon + +- type: metabolizerType + id: Human - type: metabolizerType id: Slime - type: metabolizerType id: Vox - diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index f54f9648bb..c54ff4126c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -29,12 +29,14 @@ - FlyingMobMask layer: - FlyingMobLayer - - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: bat - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: bat + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -97,11 +99,15 @@ 5: !type:CriticalMobState {} 10: !type:DeadMobState {} - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: 0 - crit: dead - dead: dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: 0 + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Tag tags: - Bee @@ -153,11 +159,14 @@ state: chicken-0 sprite: Mobs/Animals/chicken.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: chicken-0 - crit: dead-0 - dead: dead-0 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: chicken-0 + Critical: + enum.DamageStateVisualLayers.Base: dead-0 + Dead: + enum.DamageStateVisualLayers.Base: dead-0 - type: Butcherable spawned: - id: FoodMeatChicken @@ -184,11 +193,14 @@ state: duck-0 sprite: Mobs/Animals/duck.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: duck-0 - crit: dead-0 - dead: dead-0 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: duck-0 + Critical: + enum.DamageStateVisualLayers.Base: dead-0 + Dead: + enum.DamageStateVisualLayers.Base: dead-0 - type: Butcherable spawned: - id: FoodMeatDuck @@ -215,11 +227,14 @@ state: duck-1 sprite: Mobs/Animals/duck.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: duck-1 - crit: dead-1 - dead: dead-1 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: duck-1 + Critical: + enum.DamageStateVisualLayers.Base: dead-1 + Dead: + enum.DamageStateVisualLayers.Base: dead-1 - type: Butcherable spawned: - id: FoodMeatDuck @@ -246,11 +261,14 @@ state: duck-2 sprite: Mobs/Animals/duck.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: duck-2 - crit: dead-2 - dead: dead-2 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: duck-2 + Critical: + enum.DamageStateVisualLayers.Base: dead-2 + Dead: + enum.DamageStateVisualLayers.Base: dead-2 - type: Butcherable spawned: - id: FoodMeatDuck @@ -306,11 +324,14 @@ cyan: "#18a2d5" yellow: "#d58c18" - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: butterfly - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: butterfly + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Bloodstream bloodMaxVolume: 0.1 - type: NoSlip @@ -339,11 +360,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: cow - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: cow + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: SolutionContainerManager solutions: udder: @@ -396,11 +420,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: crab - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: crab + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatCrab @@ -425,11 +452,14 @@ state: goat sprite: Mobs/Animals/goat.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: goat - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: goat + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: SolutionContainerManager solutions: udder: @@ -470,11 +500,14 @@ state: goose sprite: Mobs/Animals/goose.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: goose - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: goose + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatChicken @@ -513,11 +546,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: crawling - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: crawling + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -553,12 +589,15 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: kangaroo - # SKIPPY NO! - crit: kangaroo-dead - dead: kangaroo-dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: kangaroo + # SKIPPY NO! + Critical: + enum.DamageStateVisualLayers.Base: kangaroo-dead + Dead: + enum.DamageStateVisualLayers.Base: kangaroo-dead - type: Puller - type: entity @@ -576,11 +615,14 @@ state: kangaroo-boxing sprite: Mobs/Animals/kangaroo.rsi - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: kangaroo-boxing - crit: kangaroo-boxing-dead - dead: kangaroo-boxing-dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: kangaroo-boxing + Critical: + enum.DamageStateVisualLayers.Base: kangaroo-boxing-dead + Dead: + enum.DamageStateVisualLayers.Base: kangaroo-boxing-dead - type: MeleeWeapon range: 1.5 arcwidth: 0 @@ -626,12 +668,16 @@ - type: Body template: PrimateTemplate preset: PrimatePreset + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: monkey + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Appearance visuals: - - type: DamageStateVisualizer - normal: monkey - crit: dead - dead: dead - type: FireVisualizer sprite: Mobs/Effects/onfire.rsi normalState: Monkey_burning @@ -688,11 +734,14 @@ baseWalkSpeed : 5 baseSprintSpeed : 5 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mouse-0 - crit: dead-0 - dead: splat-0 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-0 + Critical: + enum.DamageStateVisualLayers.Base: dead-0 + Dead: + enum.DamageStateVisualLayers.Base: splat-0 - type: Food - type: Hunger baseDecayRate: 0.5 # I'm very hungry! Give me. The cheese. @@ -762,11 +811,14 @@ - type: Clothing HeldPrefix: 1 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mouse-1 - crit: dead-1 - dead: splat-1 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-1 + Critical: + enum.DamageStateVisualLayers.Base: dead-1 + Dead: + enum.DamageStateVisualLayers.Base: splat-1 - type: Bloodstream bloodMaxVolume: 50 - type: DiseaseCarrier #Why doesn't this save if it's only on the parent wtf @@ -785,11 +837,14 @@ - type: Clothing HeldPrefix: 1 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mouse-2 - crit: dead-2 - dead: splat-2 + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-1 + Critical: + enum.DamageStateVisualLayers.Base: dead-1 + Dead: + enum.DamageStateVisualLayers.Base: splat-1 - type: Bloodstream bloodMaxVolume: 50 - type: DiseaseCarrier @@ -822,11 +877,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: lizard - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: lizard + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -870,11 +928,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: slug - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: slug + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -913,11 +974,14 @@ layer: - SmallMobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: frog - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: frog + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -959,11 +1023,14 @@ layer: - FlyingMobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: parrot - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: parrot + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeat @@ -1002,11 +1069,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: penguin - crit: penguin_dead - dead: penguin_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: penguin + Critical: + enum.DamageStateVisualLayers.Base: penguin_dead + Dead: + enum.DamageStateVisualLayers.Base: penguin_dead - type: Butcherable spawned: - id: FoodMeatPenguin @@ -1051,11 +1121,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: penguin - crit: dead - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: penguin + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatPenguin @@ -1105,11 +1178,13 @@ - SmallMobMask layer: - SmallMobLayer + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: snake - type: Appearance visuals: - type: RotationVisualizer - - type: DamageStateVisualizer - normal: snake # It's death animation is animated so hopefully this should push for separation between "dying" and "death" states. # looks stupid, Rotation visualizer for now # dead: dead @@ -1154,11 +1229,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: tarantula - crit: tarantula_dead - dead: tarantula_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: tarantula + Critical: + enum.DamageStateVisualLayers.Base: tarantula_dead + Dead: + enum.DamageStateVisualLayers.Base: tarantula_dead - type: Butcherable spawned: - id: FoodMeatSpider @@ -1218,11 +1296,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: possum - crit: possum_dead # TODO: Make it so possums can "play dead." Probably need AI changes - dead: possum_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: possum + Critical: + enum.DamageStateVisualLayers.Base: possum_dead + Dead: + enum.DamageStateVisualLayers.Base: possum_dead - type: Butcherable spawned: - id: FoodMeat @@ -1274,11 +1355,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: raccoon - crit: raccoon_dead - dead: raccoon_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: raccoon + Critical: + enum.DamageStateVisualLayers.Base: raccoon_dead + Dead: + enum.DamageStateVisualLayers.Base: raccoon_dead - type: Butcherable spawned: - id: FoodMeat @@ -1330,11 +1414,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: fox - crit: fox_dead - dead: fox_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: fox + Critical: + enum.DamageStateVisualLayers.Base: fox_dead + Dead: + enum.DamageStateVisualLayers.Base: fox_dead - type: Butcherable spawned: - id: FoodMeat diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml b/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml index 636316f068..c2b51f1434 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/bear.yml @@ -33,11 +33,14 @@ 0: !type:NormalMobState {} 150: !type:DeadMobState {} - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: bear - crit: bear_dead - dead: bear_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: bear + Critical: + enum.DamageStateVisualLayers.Base: bear_dead + Dead: + enum.DamageStateVisualLayers.Base: bear_dead - type: Butcherable spawned: - id: FoodMeatBear diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 774d375ca7..2ad4c2ce6d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -17,6 +17,11 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: alive sprite: Mobs/Aliens/Carps/space.rsi + - type: CombatMode + disarmAction: + enabled: false + autoPopulate: false + name: action-name-disarm - type: Physics - type: Fixtures fixtures: @@ -35,15 +40,17 @@ 100: !type:DeadMobState {} - type: MovementIgnoreGravity - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: alive - crit: crit - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: alive + Critical: + enum.DamageStateVisualLayers.Base: crit + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable - # TODO: CrapMeat or FishMeat # - 2022-02-17 LMAO crap meat spawned: - - id: FoodMeat + - id: FoodMeatFish amount: 2 - type: MeleeWeapon range: 1.5 @@ -55,17 +62,6 @@ types: Piercing: 5 Slash: 10 - - type: CombatMode - disarmAction: - enabled: false - autoPopulate: false - name: action-name-disarm - - type: GhostTakeoverAvailable - makeSentient: true - name: space carp - description: | - If you're a salvage spawn, defend the loot inside! - Otherwise, wreak havoc on the station! - type: ReplacementAccent accent: genericAggressive - type: TypingIndicator @@ -84,8 +80,6 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: alive sprite: Mobs/Aliens/Carps/magic.rsi - - type: GhostTakeoverAvailable - name: magicarp - type: TypingIndicator proto: guardian @@ -93,7 +87,7 @@ name: holocarp parent: MobCarp id: MobCarpHolo - description: Carp made out of holographic energies. + description: Carp made out of holographic energies. Sadly for you, it is very much real. components: - type: Sprite drawdepth: Mobs @@ -112,8 +106,6 @@ - MobMask layer: - Opaque - - type: GhostTakeoverAvailable - name: holocarp - type: TypingIndicator proto: robot @@ -128,3 +120,14 @@ Defend the loot inside the salvage wreck! - type: SalvageMobRestrictions +- type: entity + name: space carp + id: MobCarpDragon + suffix: DragonBrood + parent: MobCarp + components: + - type: GhostTakeoverAvailable + makeSentient: true + name: Sentient Carp + description: Help the dragon flood the station with carps! + diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 75c325956f..a4fbc78a31 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -24,12 +24,15 @@ - MobMask layer: - MobLayer + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: corgi + Critical: + enum.DamageStateVisualLayers.Base: corgi_dead + Dead: + enum.DamageStateVisualLayers.Base: corgi_dead - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: corgi - crit: corgi_dead - dead: corgi_dead - type: Butcherable spawned: - id: FoodMeat @@ -61,11 +64,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: narsian - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: narsian - crit: narsian_dead - dead: narsian_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: narsian + Critical: + enum.DamageStateVisualLayers.Base: narsian_dead + Dead: + enum.DamageStateVisualLayers.Base: narsian_dead - type: MeleeWeapon range: 1.5 arcwidth: 0 @@ -125,11 +131,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: ian - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: ian - crit: ian_dead - dead: ian_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: ian + Critical: + enum.DamageStateVisualLayers.Base: ian_dead + Dead: + enum.DamageStateVisualLayers.Base: ian_dead - type: Grammar attributes: proper: true @@ -152,11 +161,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: old_ian - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: old_ian - crit: old_ian_dead - dead: old_ian_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: old_ian + Critical: + enum.DamageStateVisualLayers.Base: old_ian_dead + Dead: + enum.DamageStateVisualLayers.Base: old_ian_dead - type: Grammar attributes: proper: true @@ -175,11 +187,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: lisa - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: lisa - crit: lisa_dead - dead: lisa_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: lisa + Critical: + enum.DamageStateVisualLayers.Base: lisa_dead + Dead: + enum.DamageStateVisualLayers.Base: lisa_dead - type: Grammar attributes: proper: true @@ -198,11 +213,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: puppy - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: puppy - crit: puppy_dead - dead: puppy_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: puppy + Critical: + enum.DamageStateVisualLayers.Base: puppy_dead + Dead: + enum.DamageStateVisualLayers.Base: puppy_dead - type: Grammar attributes: gender: epicene @@ -231,11 +249,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: cat - crit: cat_dead - dead: cat_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: cat + Critical: + enum.DamageStateVisualLayers.Base: cat_dead + Dead: + enum.DamageStateVisualLayers.Base: cat_dead - type: Butcherable spawned: - id: FoodMeat @@ -275,11 +296,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: cat2 - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: cat2 - crit: cat2_dead - dead: cat2_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: cat2 + Critical: + enum.DamageStateVisualLayers.Base: cat2_dead + Dead: + enum.DamageStateVisualLayers.Base: cat2_dead - type: Grammar attributes: gender: epicene @@ -307,11 +331,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: spacecat - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: spacecat - crit: spacecat_dead - dead: spacecat_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: spacecat + Critical: + enum.DamageStateVisualLayers.Base: spacecat_dead + Dead: + enum.DamageStateVisualLayers.Base: spacecat_dead - type: InteractionPopup successChance: 0.7 interactSuccessString: petting-success-space-cat @@ -335,11 +362,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: caracal_flop - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: caracal_flop - crit: caracal_dead - dead: caracal_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: caracal_flop + Critical: + enum.DamageStateVisualLayers.Base: caracal_dead + Dead: + enum.DamageStateVisualLayers.Base: caracal_dead - type: Grammar attributes: gender: epicene @@ -381,11 +411,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: sloth - crit: sloth_dead - dead: sloth_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: sloth + Critical: + enum.DamageStateVisualLayers.Base: sloth_dead + Dead: + enum.DamageStateVisualLayers.Base: sloth_dead - type: Butcherable spawned: - id: FoodMeat @@ -424,11 +457,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: ferret - crit: ferret_dead - dead: ferret_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: ferret + Critical: + enum.DamageStateVisualLayers.Base: ferret_dead + Dead: + enum.DamageStateVisualLayers.Base: ferret_dead - type: Butcherable spawned: - id: FoodMeat @@ -478,11 +514,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: bingus - crit: bingus_dead - dead: bingus_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: bingus + Critical: + enum.DamageStateVisualLayers.Base: bingus_dead + Dead: + enum.DamageStateVisualLayers.Base: bingus_dead - type: Butcherable spawned: - id: FoodMeat @@ -521,11 +560,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: mcgriff - crit: mcgriff_dead - dead: mcgriff_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: mcgriff + Critical: + enum.DamageStateVisualLayers.Base: mcgriff_dead + Dead: + enum.DamageStateVisualLayers.Base: mcgriff_dead - type: Butcherable spawned: - id: FoodMeat @@ -556,11 +598,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: paperwork - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: paperwork - crit: paperwork_dead - dead: paperwork_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: paperwork + Critical: + enum.DamageStateVisualLayers.Base: paperwork_dead + Dead: + enum.DamageStateVisualLayers.Base: paperwork_dead - type: Butcherable spawned: - id: FoodMeat @@ -598,11 +643,14 @@ layer: - MobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: walter - crit: walter_dead - dead: walter_dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: walter + Critical: + enum.DamageStateVisualLayers.Base: walter_dead + Dead: + enum.DamageStateVisualLayers.Base: walter_dead - type: Butcherable spawned: - id: FoodMeat diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index c6aa09c805..07dbdd3046 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -49,14 +49,17 @@ damage: types: Slash: 12 - Piercing: 8 + Piercing: 8 - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: regalrat - crit: dead - dead: dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: regalrat + Critical: + enum.DamageStateVisualLayers.Base: dead + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Puller - type: GhostTakeoverAvailable makeSentient: true @@ -69,7 +72,7 @@ - DoorBumpOpener - FootstepSound - type: NoSlip - - type: RatKing + - type: RatKing actionRaiseArmy: useDelay: 4 icon: Interface/Actions/ratKingArmy.png @@ -158,12 +161,15 @@ Slash: 5 Piercing: 2 - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: mouse-3 - crit: dead-3 - dead: splat-3 + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: mouse-3 + Critical: + enum.DamageStateVisualLayers.Base: dead-3 + Dead: + enum.DamageStateVisualLayers.Base: splat-3 - type: Puller - type: DiseaseCarrier carrierDiseases: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml b/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml index 437bd15471..3f53526978 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/spacetick.yml @@ -38,10 +38,12 @@ 15: !type:DeadMobState {} - type: MovementIgnoreGravity - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: alive - dead: dead + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: alive + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Butcherable spawned: - id: FoodMeatXeno diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index a9a8b0e538..cd68541cf0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -60,12 +60,15 @@ groups: Brute: 20 - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: running - crit: crit - dead: dead + - type: DamageStateVisuals + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: running + Critical: + enum.DamageStateVisualLayers.Base: crit + Dead: + enum.DamageStateVisualLayers.Base: dead - type: Puller - type: Butcherable butcheringType: Spike @@ -105,11 +108,14 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: purple_snake - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: purple_snake - crit: dead_purple_snake - dead: dead_purple_snake + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: purple_snake + Critical: + enum.DamageStateVisualLayers.Base: dead_purple_snake + Dead: + enum.DamageStateVisualLayers.Base: dead_purple_snake - type: Grammar attributes: proper: true @@ -156,10 +162,13 @@ - map: ["enum.DamageStateVisualLayers.Base"] state: small_purple_snake - type: Appearance - visuals: - - type: DamageStateVisualizer - normal: purple_snake - crit: dead_small_purple_snake - dead: dead_small_purple_snake + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: small_purple_snake + Critical: + enum.DamageStateVisualLayers.Base: dead_small_purple_snake + Dead: + enum.DamageStateVisualLayers.Base: dead_small_purple_snake - type: SolutionTransfer maxTransferAmount: 1 diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml new file mode 100644 index 0000000000..176b3c1f4b --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -0,0 +1,103 @@ +- type: entity + name: space dragon + parent: SimpleSpaceMobBase + id: MobDragon + suffix: + description: A flying leviathan, loosely related to space carps. + components: + - type: GhostTakeoverAvailable + makeSentient: true + name: Space dragon! + description: Crash, roast, flood the station with carps! + - type: Speech + - type: CombatMode + disarmAction: + enabled: false + autoPopulate: false + name: action-name-disarm + - type: PlayerMobMover + - type: PlayerInputMover + - type: MovementSpeedModifier + baseWalkSpeed : 5 + baseSprintSpeed : 5 + - type: Sprite + sprite: Mobs/Aliens/Carps/dragon.rsi + noRot: true + # TODO: Randomise colors when RandomSpriteColor isn't poopoo + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: alive + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] + state: alive-unshaded + shader: unshaded + - type: Appearance + - type: DamageStateVisuals + states: + Alive: + enum.DamageStateVisualLayers.Base: alive + enum.DamageStateVisualLayers.BaseUnshaded: alive-unshaded + Critical: + enum.DamageStateVisualLayers.Base: crit + Dead: + enum.DamageStateVisualLayers.Base: dead + enum.DamageStateVisualLayers.BaseUnshaded: dead-unshaded + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.40 + mass: 50 + mask: + - FlyingMobMask + layer: + - FlyingMobLayer + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 450: !type:CriticalMobState {} + 500: !type:DeadMobState {} + - type: Metabolizer + solutionOnBody: false + updateFrequency: 0.25 + metabolizerTypes: [Dragon] + groups: + - id: Medicine + - id: Poison + - type: MovementIgnoreGravity + - type: NoSlip + - type: Butcherable + spawned: + - id: FoodMeatDragon + amount: 2 + - type: MeleeWeapon + hitSound: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 15 + Slash: 15 + - type: Dragon + spawnsLeft: 2 + spawnsProto: MobCarpDragon + devourAction: + event: !type:DragonDevourActionEvent + icon: Interface/Actions/devour.png + name: action-name-devour + description: action-description-devour + devourChemical: Ichor + devourHealRate: 15.0 + whitelist: + components: + - MobState + - Door + tags: + - Wall + spawnAction: + event: !type:DragonSpawnActionEvent + icon: Interface/Actions/carpbirth.png + name: action-name-carp-birth + description: action-description-carp-birth + useDelay: 5 + diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index e8d99e170c..12bf99f578 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -215,9 +215,10 @@ layer: - LargeMobLayer - type: Appearance - visuals: - - type: DamageStateVisualizer - rotate: true - normal: onestar_boss - dead: onestar_boss_wrecked + rotate: true + states: + Alive: + enum.DamageStateVisualLayers.Base: onestar_boss + Dead: + enum.DamageStateVisualLayers.Base: onestar_boss_wrecked - type: CombatMode diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml index 7506926602..9b9b65e383 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml @@ -177,7 +177,7 @@ reagents: - ReagentId: Nutriment Quantity: 6 - - ReagentId: CapsaicinOil + - ReagentId: CarpoToxin Quantity: 3 # Tastes like fish, batter, hot peppers. @@ -367,6 +367,25 @@ state: queso # Its queso! Everyone loves queso... Right?. +- type: entity + name: Sashimi + parent: FoodMealBase + id: FoodMealSashimi + description: It's taste can only be described as "Exotic". The poisoning though? That's pretty common. + components: + - type: Sprite + state: sashimi + - type: SolutionContainerManager + solutions: + food: + maxVol: 18 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: CarpoToxin + Quantity: 15 +# tastes exotic + - type: entity name: enchiladas parent: FoodMealBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index b0e7fd65c5..a25ff7aa71 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -48,11 +48,35 @@ food: reagents: - ReagentId: Toxin - Quantity: 1 + Quantity: 5 - type: SliceableFood count: 3 slice: FoodMeatCutlet +- type: entity + name: raw carp fillet + parent: FoodMeatBase + # MeatFish?... + id: FoodMeatFish + description: Your last words being "Wow, exotic!" are not worth it. The taste itself though? Maybe. + components: + - type: Tag + tags: + - Raw + - type: Sprite + state: fish + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: CarpoToxin + Quantity: 5 + - type: Extractable + juiceSolution: + reagents: + - ReagentId: CarpoToxin + Quantity: 5 + - type: entity name: raw bacon parent: FoodMeatBase @@ -216,6 +240,32 @@ - ReagentId: Toxin Quantity: 5 +- type: entity + name: dragon flesh + parent: FoodMeatBase + id: FoodMeatDragon + description: The dense meat of the space-era apex predator is oozing with it's mythical ichor. Ironically, best eaten raw. + components: + - type: Tag + tags: + - Raw + - type: Sprite + layers: + - state: dragon + - state: dragon_veins + shader: unshaded + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Ichor + Quantity: 2 + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Ichor + Quantity: 2 + - type: entity name: raw lizard meat parent: FoodMeatBase diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml index 049d7cc857..f5957ae0de 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/trashbag.yml @@ -2,6 +2,7 @@ name: trash bag id: TrashBag parent: BaseStorageItem + description: The solution to space pollution. Rubbish removal revolution. components: - type: Sprite netSync: false diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 3e63d5e4b2..89cbb1b588 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -8,6 +8,9 @@ alarmedBy: - FireAlarm - AirAlarm + - type: Tag + tags: + - RCDDeconstructWhitelist - type: ApcPowerReceiver - type: ExtensionCableReceiver - type: DeviceNetwork diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 58e433de84..9398fde93e 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -97,7 +97,6 @@ - type: Tag tags: - Wall - - RCDDeconstructWhitelist - type: Sprite sprite: Structures/Walls/cult.rsi - type: Icon @@ -336,6 +335,9 @@ id: WallReinforced name: reinforced wall components: + - type: Tag + tags: + - Wall - type: Sprite sprite: Structures/Walls/solid.rsi - type: Icon diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 435b599176..9f09766723 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -28,3 +28,31 @@ effects: - !type:SatiateHunger factor: 1.5 + +- type: reagent + id: Ichor + name: Ichor + group: Biological + desc: An extremely potent regenerative chemical, perfected by space fauna evolution. Produced in the dragon's digestive system, it is seen as an exotic commodity due to the gargantuan effort of hunting for it. + physicalDesc: roaring + color: "#f4692e" + metabolisms: + Drink: + effects: + - !type:SatiateThirst + factor: 1.5 + # Dragon doesn't require airloss healing, so omnizine is still best for humans. + Medicine: + effects: + - !type:HealthChange + damage: + groups: + Burn: -5 + Brute: -5 + Toxin: -2 + types: + Bloodloss: -5 + # Just in case you REALLY want to water your plants + plantMetabolism: + - !type:PlantAdjustWater + amount: 0.5 diff --git a/Resources/Prototypes/Reagents/fun.yml b/Resources/Prototypes/Reagents/fun.yml index 5eff994bf3..929a6fc3a3 100644 --- a/Resources/Prototypes/Reagents/fun.yml +++ b/Resources/Prototypes/Reagents/fun.yml @@ -17,6 +17,14 @@ type: Local messages: [ "carpetium-effect-blood-fibrous", "carpetium-effect-jumpsuit-insides" ] probability: 0.1 + # Hail the madman logic, if it has CARP, means it helps against CARPs + - !type:AdjustReagent + conditions: + - !type:ReagentThreshold + reagent: CarpoToxin + min: 1 + reagent: CarpoToxin + amount: -3 - type: reagent id: Fiber diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 953d53216f..0ae63ad745 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -539,6 +539,7 @@ - !type:SatiateHunger factor: -1 + # Should heal quite literally everything, use in very small amounts - type: reagent id: Omnizine name: reagent-name-omnizine @@ -598,3 +599,4 @@ min: 1 reagent: Ultravasculine amount: 0.5 + diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index b0a5485dfa..15ac3cad36 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -18,6 +18,30 @@ types: Poison: 2 +- type: reagent + id: CarpoToxin + name: Carpotoxin + group: Toxins + desc: Toxic secretions of a space carp. Causes a painful burning sensation. + color: "#e2a38c" + physicalDesc: exotic-smelling + plantMetabolism: + - !type:PlantAdjustToxins + amount: 10 + - !type:PlantAdjustHealth + amount: -5 + metabolisms: + Poison: + effects: + - !type:HealthChange + damage: + types: + Poison: 4 + - !type:PopupMessage + type: Local + messages: [ "generic-reagent-effect-burning-insides" ] + probability: 0.33 + - type: reagent id: PolytrinicAcid name: reagent-name-polytrinic-acid @@ -164,7 +188,7 @@ - !type:HealthChange damage: types: - Asphyxiation: 4 + Asphyxiation: 2 plantMetabolism: - !type:PlantAdjustToxins amount: 10 @@ -215,7 +239,7 @@ - !type:HealthChange conditions: - !type:ReagentThreshold - min: 30 + min: 45 damage: groups: Brute: 2 @@ -228,7 +252,7 @@ - !type:PopupMessage conditions: - !type:ReagentThreshold - min: 30 + min: 45 type: Local messages: [ "histamine-effect-heavy-itchiness" ] probability: 0.2 diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 88f19cef12..3003c1d265 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -392,6 +392,28 @@ # solids: # FoodMeat: 1 +- type: microwaveMealRecipe + id: RecipeCubanCarp + name: cuban carp recipe + result: FoodMealCubancarp + time: 15 + solids: + FoodDough: 1 + FoodCheeseSlice: 2 + FoodChili: 1 + FoodMeatFish: 2 + +- type: microwaveMealRecipe + id: RecipeSashimi + name: sashimi recipe + result: FoodMealCubancarp + time: 15 + reagents: + TableSalt: 1 + solids: + FoodMeatFish: 2 + + - type: microwaveMealRecipe id: RecipeMisoColaSoup name: salty sweet milocola soup recipe diff --git a/Resources/Textures/Interface/Actions/carpbirth.png b/Resources/Textures/Interface/Actions/carpbirth.png new file mode 100644 index 0000000000..15ea2ecf4c Binary files /dev/null and b/Resources/Textures/Interface/Actions/carpbirth.png differ diff --git a/Resources/Textures/Interface/Actions/devour.png b/Resources/Textures/Interface/Actions/devour.png new file mode 100644 index 0000000000..d23d26ce8c Binary files /dev/null and b/Resources/Textures/Interface/Actions/devour.png differ diff --git a/Resources/Textures/Interface/Actions/meta.json b/Resources/Textures/Interface/Actions/meta.json index 47a312ecf3..e4661a48c4 100644 --- a/Resources/Textures/Interface/Actions/meta.json +++ b/Resources/Textures/Interface/Actions/meta.json @@ -19,12 +19,15 @@ { "name": "disarm" }, - { - "name": "harm" - }, - { - "name": "manifest" - }, + { + "name": "harm" + }, + { + "name": "manifest" + }, + { + "name": "devour" + } { "name": "ratKingArmy" }, diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive-unshaded.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive-unshaded.png new file mode 100644 index 0000000000..4d11267792 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive-unshaded.png differ diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive.png new file mode 100644 index 0000000000..0d9baa9d8e Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/alive.png differ diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/crit.png new file mode 100644 index 0000000000..1fe5d25437 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/crit.png differ diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead-unshaded.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead-unshaded.png new file mode 100644 index 0000000000..df41900b88 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead-unshaded.png differ diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead.png new file mode 100644 index 0000000000..d9c8d55905 Binary files /dev/null and b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/dead.png differ diff --git a/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json new file mode 100644 index 0000000000..b29668aed9 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Carps/dragon.rsi/meta.json @@ -0,0 +1,80 @@ +{ + "version": 1, + "size": { + "x": 64, + "y": 64 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from /tg/station at https://github.com/Toastgoats/tgstation/commit/024a840eed2a1be3f72435c2bb39faac8025f822", + "states": [ + { + "name": "alive", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "alive-unshaded", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "crit" + }, + { + "name": "dead" + }, + { + "name": "dead-unshaded" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon.png new file mode 100644 index 0000000000..9a85807e24 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon_veins.png b/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon_veins.png new file mode 100644 index 0000000000..6b35cc5900 Binary files /dev/null and b/Resources/Textures/Objects/Consumable/Food/meat.rsi/dragon_veins.png differ diff --git a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json index 5a34066758..79eb49da9f 100644 --- a/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/meat.rsi/meta.json @@ -170,6 +170,12 @@ }, { "name": "xeno" + }, + { + "name": "dragon" + }, + { + "name": "dragon_veins" } ] } diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png index bb13533c0c..88866eb169 100644 Binary files a/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png and b/Resources/Textures/Objects/Misc/id_cards.rsi/idpassenger.png differ