diff --git a/.envrc b/.envrc index 7fd05db3e5..d2ab6182d8 100644 --- a/.envrc +++ b/.envrc @@ -1,4 +1,4 @@ -if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then - source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4=" +if ! has nix_direnv_version || ! nix_direnv_version 3.0.6; then + source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.6/direnvrc" "sha256-RYcUJaRMf8oF5LznDrlCXbkOQrywm0HDv1VjYGaJGdM=" fi -use flake +use nix diff --git a/Content.Client/Damage/DamageOtherOnHitSystem.cs b/Content.Client/Damage/DamageOtherOnHitSystem.cs new file mode 100644 index 0000000000..1171e634df --- /dev/null +++ b/Content.Client/Damage/DamageOtherOnHitSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Damage.Systems; + +namespace Content.Client.Damage; + +public sealed class DamageOtherOnHitSystem : SharedDamageOtherOnHitSystem; diff --git a/Content.Client/Emoting/AnimatedEmotesSystem.cs b/Content.Client/Emoting/AnimatedEmotesSystem.cs new file mode 100644 index 0000000000..40766b4e13 --- /dev/null +++ b/Content.Client/Emoting/AnimatedEmotesSystem.cs @@ -0,0 +1,121 @@ +using Robust.Client.Animations; +using Robust.Shared.Animations; +using Robust.Shared.GameStates; +using Robust.Client.GameObjects; +using Content.Shared.Emoting; +using System.Numerics; +using Robust.Shared.Prototypes; +using Content.Shared.Chat.Prototypes; + +namespace Content.Client.Emoting; + +public sealed partial class AnimatedEmotesSystem : SharedAnimatedEmotesSystem +{ + [Dependency] private readonly AnimationPlayerSystem _anim = default!; + [Dependency] private readonly IPrototypeManager _prot = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnHandleState); + + SubscribeLocalEvent(OnFlip); + SubscribeLocalEvent(OnSpin); + SubscribeLocalEvent(OnJump); + } + + public void PlayEmote(EntityUid uid, Animation anim, string animationKey = "emoteAnimKeyId") + { + if (_anim.HasRunningAnimation(uid, animationKey)) + return; + + _anim.Play(uid, anim, animationKey); + } + + private void OnHandleState(EntityUid uid, AnimatedEmotesComponent component, ref ComponentHandleState args) + { + if (args.Current is not AnimatedEmotesComponentState state + || !_prot.TryIndex(state.Emote, out var emote)) + return; + + if (emote.Event != null) + RaiseLocalEvent(uid, emote.Event); + } + + private void OnFlip(Entity ent, ref AnimationFlipEmoteEvent args) + { + var a = new Animation + { + Length = TimeSpan.FromMilliseconds(500), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Rotation), + InterpolationMode = AnimationInterpolationMode.Linear, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(Angle.Zero, 0f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.25f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(360), 0.25f), + } + } + } + }; + PlayEmote(ent, a); + } + private void OnSpin(Entity ent, ref AnimationSpinEmoteEvent args) + { + var a = new Animation + { + Length = TimeSpan.FromMilliseconds(600), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(TransformComponent), + Property = nameof(TransformComponent.LocalRotation), + InterpolationMode = AnimationInterpolationMode.Linear, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(0), 0f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(90), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(270), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.Zero, 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(90), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(180), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.FromDegrees(270), 0.075f), + new AnimationTrackProperty.KeyFrame(Angle.Zero, 0.075f), + } + } + } + }; + PlayEmote(ent, a, "emoteAnimSpin"); + } + private void OnJump(Entity ent, ref AnimationJumpEmoteEvent args) + { + var a = new Animation + { + Length = TimeSpan.FromMilliseconds(250), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Offset), + InterpolationMode = AnimationInterpolationMode.Cubic, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(Vector2.Zero, 0f), + new AnimationTrackProperty.KeyFrame(new Vector2(0, .35f), 0.125f), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, 0.125f), + } + } + } + }; + PlayEmote(ent, a); + } +} diff --git a/Content.Client/ListViewSelector/ListViewSelectorBUI.cs b/Content.Client/ListViewSelector/ListViewSelectorBUI.cs index f02bab512e..dd1f229942 100644 --- a/Content.Client/ListViewSelector/ListViewSelectorBUI.cs +++ b/Content.Client/ListViewSelector/ListViewSelectorBUI.cs @@ -84,7 +84,7 @@ private void PopulateWindow(List items) { var itemName = item.Name; var itemDesc = item.Description; - if (_prototypeManager.TryIndex(item.Id, out var itemPrototype)) + if (_prototypeManager.TryIndex(item.Id, out var itemPrototype, false)) { itemName = itemPrototype.Name; itemDesc = itemPrototype.Description; diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs index 3e1a4b1906..ffcd7454ac 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs @@ -136,6 +136,7 @@ private Animation GetThrustAnimation(SpriteComponent sprite, float distance, Ang { const float thrustEnd = 0.05f; const float length = 0.15f; + var rotation = sprite.Rotation + spriteRotation; var startOffset = sprite.Rotation.RotateVec(new Vector2(0f, -distance / 5f)); var endOffset = sprite.Rotation.RotateVec(new Vector2(0f, -distance)); @@ -144,6 +145,15 @@ private Animation GetThrustAnimation(SpriteComponent sprite, float distance, Ang Length = TimeSpan.FromSeconds(length), AnimationTracks = { + new AnimationTrackComponentProperty() + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Rotation), + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(rotation, 0f), + } + }, new AnimationTrackComponentProperty() { ComponentType = typeof(SpriteComponent), diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index 1d72f16706..9f2ee5eb8f 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Weapons.Melee; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Wieldable.Components; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Input; @@ -71,10 +72,22 @@ public override void Update(float frameTime) return; } - var useDown = _inputSystem.CmdStates.GetState(EngineKeyFunctions.Use); - var altDown = _inputSystem.CmdStates.GetState(EngineKeyFunctions.UseSecondary); + var useDown = _inputSystem.CmdStates.GetState(EngineKeyFunctions.Use) == BoundKeyState.Down; + var altDown = _inputSystem.CmdStates.GetState(EngineKeyFunctions.UseSecondary) == BoundKeyState.Down; - if (weapon.AutoAttack || useDown != BoundKeyState.Down && altDown != BoundKeyState.Down) + // Disregard inputs to the shoot binding + if (TryComp(weaponUid, out var gun) && + // Except if can't shoot due to being unwielded + (!HasComp(weaponUid) || + (TryComp(weaponUid, out var wieldable) && wieldable.Wielded))) + { + if (gun.UseKey) + useDown = false; + else + altDown = false; + } + + if (weapon.AutoAttack || !useDown && !altDown) { if (weapon.Attacking) { @@ -82,23 +95,13 @@ public override void Update(float frameTime) } } - if (weapon.Attacking || weapon.NextAttack > Timing.CurTime) + if (weapon.Attacking || weapon.NextAttack > Timing.CurTime || (!useDown && !altDown)) { return; } // TODO using targeted actions while combat mode is enabled should NOT trigger attacks. - // TODO: Need to make alt-fire melee its own component I guess? - // Melee and guns share a lot in the middle but share virtually nothing at the start and end so - // it's kinda tricky. - // I think as long as we make secondaries their own component it's probably fine - // as long as guncomp has an alt-use key then it shouldn't be too much of a PITA to deal with. - if (TryComp(weaponUid, out var gun) && gun.UseKey) - { - return; - } - var mousePos = _eyeManager.PixelToMap(_inputManager.MouseScreenPosition); if (mousePos.MapId == MapId.Nullspace) @@ -118,7 +121,8 @@ public override void Update(float frameTime) } // Heavy attack. - if (altDown == BoundKeyState.Down) + if (!weapon.DisableHeavy && + (!weapon.SwapKeys ? altDown : useDown)) { // If it's an unarmed attack then do a disarm if (weapon.AltDisarm && weaponUid == entity) @@ -139,7 +143,8 @@ public override void Update(float frameTime) } // Light attack - if (useDown == BoundKeyState.Down) + if (!weapon.DisableClick && + (!weapon.SwapKeys ? useDown : altDown)) { var attackerPos = Transform(entity).MapPosition; diff --git a/Content.Client/WhiteDream/BloodCult/PhaseShift/PhaseShiftSystem.cs b/Content.Client/WhiteDream/BloodCult/PhaseShift/PhaseShiftSystem.cs new file mode 100644 index 0000000000..881d8cc023 --- /dev/null +++ b/Content.Client/WhiteDream/BloodCult/PhaseShift/PhaseShiftSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.WhiteDream.BloodCult.Constructs.PhaseShift; + +namespace Content.Client.WhiteDream.BloodCult.PhaseShift; + +public sealed class PhaseShiftSystem : SharedPhaseShiftSystem; diff --git a/Content.Client/WhiteDream/BloodCult/Runes/UI/RuneDrawerBUI.cs b/Content.Client/WhiteDream/BloodCult/Runes/UI/RuneDrawerBUI.cs index ed0f27bc5d..c3476c41d2 100644 --- a/Content.Client/WhiteDream/BloodCult/Runes/UI/RuneDrawerBUI.cs +++ b/Content.Client/WhiteDream/BloodCult/Runes/UI/RuneDrawerBUI.cs @@ -1,5 +1,4 @@ -using System.Linq; -using System.Numerics; +using System.Numerics; using Content.Client.UserInterface.Controls; using Content.Shared.WhiteDream.BloodCult.Runes; using JetBrains.Annotations; @@ -23,17 +22,22 @@ public sealed class RuneDrawerBUI : BoundUserInterface [Dependency] private readonly IInputManager _inputManager = default!; private readonly SpriteSystem _spriteSystem; - - private RadialMenu? _menu; + private readonly RadialMenu _menu; public RuneDrawerBUI(EntityUid owner, Enum uiKey) : base(owner, uiKey) { _spriteSystem = _entManager.System(); + _menu = new() + { + HorizontalExpand = true, + VerticalExpand = true, + BackButtonStyleClass = "RadialMenuBackButton", + CloseButtonStyleClass = "RadialMenuCloseButton" + }; } protected override void Open() { - _menu = FormMenu(); _menu.OnClose += Close; _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / _displayManager.ScreenSize); } @@ -41,53 +45,49 @@ protected override void Open() protected override void Dispose(bool disposing) { base.Dispose(disposing); - if (disposing) - _menu?.Dispose(); + _menu.Close(); } - private RadialMenu FormMenu() + protected override void UpdateState(BoundUserInterfaceState state) { - var menu = new RadialMenu - { - HorizontalExpand = true, - VerticalExpand = true, - BackButtonStyleClass = "RadialMenuBackButton", - CloseButtonStyleClass = "RadialMenuCloseButton" - }; - - if (!_entManager.HasComponent(Owner)) - return menu; + if (state is RuneDrawerMenuState runeDrawerState) + FillMenu(runeDrawerState.AvailalbeRunes); + } - var runeSelectorArray = _protoManager.EnumeratePrototypes().OrderBy(r => r.ID).ToArray(); + private void FillMenu(List>? runes = null) + { + if (runes is null) + return; - var mainContainer = new RadialContainer + var container = new RadialContainer { - Radius = 36f / (runeSelectorArray.Length == 1 - ? 1 - : MathF.Sin(MathF.PI / runeSelectorArray.Length)) + Radius = 48f + 24f * MathF.Log(runes.Count) }; - foreach (var runeSelector in runeSelectorArray) + _menu.AddChild(container); + + foreach (var runeSelector in runes) { - if (!_protoManager.TryIndex(runeSelector.Prototype, out var proto)) + if (!_protoManager.TryIndex(runeSelector, out var runeSelectorProto) || + !_protoManager.TryIndex(runeSelectorProto.Prototype, out var runeProto)) continue; var itemSize = new Vector2(64f, 64f); var button = new RadialMenuTextureButton { - ToolTip = Loc.GetString(proto.Name), + ToolTip = Loc.GetString(runeProto.Name), StyleClasses = { "RadialMenuButton" }, SetSize = itemSize }; - var runeIcon = _spriteSystem.Frame0(proto); + var runeIcon = _spriteSystem.Frame0(runeProto); var runeScale = itemSize / runeIcon.Size; var texture = new TextureRect { VerticalAlignment = Control.VAlignment.Center, HorizontalAlignment = Control.HAlignment.Center, - Texture = _spriteSystem.Frame0(proto), + Texture = _spriteSystem.Frame0(runeProto), TextureScale = runeScale }; @@ -99,10 +99,7 @@ private RadialMenu FormMenu() Close(); }; - mainContainer.AddChild(button); + container.AddChild(button); } - - menu.AddChild(mainContainer); - return menu; } } diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index f5e6de64e5..8efdc2738b 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -174,7 +174,7 @@ protected override void Started(EntityUid uid, AntagSelectionComponent component return; var players = _playerManager.Sessions - .Where(x => GameTicker.PlayerGameStatuses[x.UserId] == PlayerGameStatus.JoinedGame) + .Where(x => GameTicker.PlayerGameStatuses.TryGetValue(x.UserId, out var status) && status == PlayerGameStatus.JoinedGame) .ToList(); ChooseAntags((uid, component), players); diff --git a/Content.Server/Chat/Systems/ChatSystem.Emote.cs b/Content.Server/Chat/Systems/ChatSystem.Emote.cs index 724cf8f2bb..3ee94072ca 100644 --- a/Content.Server/Chat/Systems/ChatSystem.Emote.cs +++ b/Content.Server/Chat/Systems/ChatSystem.Emote.cs @@ -176,7 +176,7 @@ private void TryEmoteChatInput(EntityUid uid, string textInput) private void InvokeEmoteEvent(EntityUid uid, EmotePrototype proto) { var ev = new EmoteEvent(proto); - RaiseLocalEvent(uid, ref ev); + RaiseLocalEvent(uid, ref ev, true); // goob edit } } diff --git a/Content.Server/Damage/Components/DamageOtherOnHitComponent.cs b/Content.Server/Damage/Components/DamageOtherOnHitComponent.cs deleted file mode 100644 index 3123e251af..0000000000 --- a/Content.Server/Damage/Components/DamageOtherOnHitComponent.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Content.Server.Damage.Systems; -using Content.Shared.Damage; - -namespace Content.Server.Damage.Components -{ - [Access(typeof(DamageOtherOnHitSystem))] - [RegisterComponent] - public sealed partial class DamageOtherOnHitComponent : Component - { - [DataField("ignoreResistances")] - [ViewVariables(VVAccess.ReadWrite)] - public bool IgnoreResistances = false; - - [DataField("damage", required: true)] - [ViewVariables(VVAccess.ReadWrite)] - public DamageSpecifier Damage = default!; - - } -} diff --git a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs index 0efa534981..2ffd66fe06 100644 --- a/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs +++ b/Content.Server/Damage/Systems/DamageOtherOnHitSystem.cs @@ -1,65 +1,66 @@ -using Content.Server.Administration.Logs; -using Content.Server.Damage.Components; -using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Camera; using Content.Shared.Damage; +using Content.Shared.Damage.Components; using Content.Shared.Damage.Events; using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.Effects; +using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Mobs.Components; +using Content.Shared.Projectiles; +using Content.Shared.Popups; using Content.Shared.Throwing; +using Content.Shared.Weapons.Melee; +using Robust.Server.GameObjects; +using Robust.Shared.Audio; using Robust.Shared.Physics.Components; using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Server.Damage.Systems { - public sealed class DamageOtherOnHitSystem : EntitySystem + public sealed class DamageOtherOnHitSystem : SharedDamageOtherOnHitSystem { - [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly GunSystem _guns = default!; - [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly DamageExamineSystem _damageExamine = default!; - [Dependency] private readonly SharedCameraRecoilSystem _sharedCameraRecoil = default!; - [Dependency] private readonly SharedColorFlashEffectSystem _color = default!; - [Dependency] private readonly ThrownItemSystem _thrownItem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly StaminaSystem _stamina = default!; public override void Initialize() { - SubscribeLocalEvent(OnDoHit); + base.Initialize(); + + SubscribeLocalEvent(OnBeforeThrow); SubscribeLocalEvent(OnDamageExamine); } - private void OnDoHit(EntityUid uid, DamageOtherOnHitComponent component, ThrowDoHitEvent args) + private void OnBeforeThrow(EntityUid uid, StaminaComponent component, ref BeforeThrowEvent args) { - var dmg = _damageable.TryChangeDamage(args.Target, component.Damage, component.IgnoreResistances, origin: args.Component.Thrower); - - // Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying. - if (dmg != null && HasComp(args.Target)) - _adminLogger.Add(LogType.ThrowHit, $"{ToPrettyString(args.Target):target} received {dmg.GetTotal():damage} damage from collision"); - - if (dmg is { Empty: false }) - { - _color.RaiseEffect(Color.Red, new List() { args.Target }, Filter.Pvs(args.Target, entityManager: EntityManager)); - } + if (!TryComp(args.ItemUid, out var damage)) + return; - _guns.PlayImpactSound(args.Target, dmg, null, false); - if (TryComp(uid, out var body) && body.LinearVelocity.LengthSquared() > 0f) + if (component.CritThreshold - component.StaminaDamage <= damage.StaminaCost) { - var direction = body.LinearVelocity.Normalized(); - _sharedCameraRecoil.KickCamera(args.Target, direction); + args.Cancelled = true; + _popup.PopupEntity(Loc.GetString("throw-no-stamina", ("item", args.ItemUid)), uid, uid); + return; } - // TODO: If more stuff touches this then handle it after. - if (TryComp(uid, out var physics)) - { - _thrownItem.LandComponent(args.Thrown, args.Component, physics, false); - } + _stamina.TakeStaminaDamage(uid, damage.StaminaCost, component, visual: false); } private void OnDamageExamine(EntityUid uid, DamageOtherOnHitComponent component, ref DamageExamineEvent args) { - _damageExamine.AddDamageExamine(args.Message, component.Damage, Loc.GetString("damage-throw")); + _damageExamine.AddDamageExamine(args.Message, GetDamage(uid, component, args.User), Loc.GetString("damage-throw")); + + if (component.StaminaCost == 0) + return; + + var staminaCostMarkup = FormattedMessage.FromMarkupOrThrow( + Loc.GetString("damage-stamina-cost", + ("type", Loc.GetString("damage-throw")), ("cost", component.StaminaCost))); + args.Message.PushNewline(); + args.Message.AddMessage(staminaCostMarkup); } } } diff --git a/Content.Server/Emoting/AnimatedEmotesSystem.cs b/Content.Server/Emoting/AnimatedEmotesSystem.cs new file mode 100644 index 0000000000..cc4863d31f --- /dev/null +++ b/Content.Server/Emoting/AnimatedEmotesSystem.cs @@ -0,0 +1,28 @@ +using Robust.Shared.GameStates; +using Content.Server.Chat.Systems; +using Content.Shared.Chat.Prototypes; +using Content.Shared.Emoting; +using Robust.Shared.Prototypes; + +namespace Content.Server.Emoting; + +public sealed partial class AnimatedEmotesSystem : SharedAnimatedEmotesSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnEmote); + } + + private void OnEmote(EntityUid uid, AnimatedEmotesComponent component, ref EmoteEvent args) + { + PlayEmoteAnimation(uid, component, args.Emote.ID); + } + + public void PlayEmoteAnimation(EntityUid uid, AnimatedEmotesComponent component, ProtoId prot) + { + component.Emote = prot; + Dirty(uid, component); + } +} diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index bc91a307b0..994e74e68d 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -14,6 +14,7 @@ using Content.Shared.Inventory; using Content.Shared.Physics; using Content.Shared.Tag; +using Content.Shared.Throwing; using Content.Shared.Weapons.Melee.Events; using Robust.Server.Audio; using Robust.Server.GameObjects; @@ -50,6 +51,7 @@ public override void Initialize() SubscribeLocalEvent(OnFlashMeleeHit); // ran before toggling light for extra-bright lantern SubscribeLocalEvent(OnFlashUseInHand, before: new []{ typeof(HandheldLightSystem) }); + SubscribeLocalEvent(OnFlashThrowHitEvent); SubscribeLocalEvent(OnInventoryFlashAttempt); SubscribeLocalEvent(OnFlashImmunityFlashAttempt); SubscribeLocalEvent(OnPermanentBlindnessFlashAttempt); @@ -60,10 +62,8 @@ private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent a { if (!args.IsHit || !args.HitEntities.Any() || - !UseFlash(uid, comp, args.User)) - { + !UseFlash(uid, comp)) return; - } args.Handled = true; foreach (var e in args.HitEntities) @@ -74,14 +74,22 @@ private void OnFlashMeleeHit(EntityUid uid, FlashComponent comp, MeleeHitEvent a private void OnFlashUseInHand(EntityUid uid, FlashComponent comp, UseInHandEvent args) { - if (args.Handled || !UseFlash(uid, comp, args.User)) + if (args.Handled || !UseFlash(uid, comp)) return; args.Handled = true; FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, true, comp.Probability); } - private bool UseFlash(EntityUid uid, FlashComponent comp, EntityUid user) + private void OnFlashThrowHitEvent(EntityUid uid, FlashComponent comp, ThrowDoHitEvent args) + { + if (!UseFlash(uid, comp)) + return; + + FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, false, comp.Probability); + } + + private bool UseFlash(EntityUid uid, FlashComponent comp) { if (comp.Flashing) return false; @@ -99,7 +107,7 @@ private bool UseFlash(EntityUid uid, FlashComponent comp, EntityUid user) { _appearance.SetData(uid, FlashVisuals.Burnt, true); _tag.AddTag(uid, "Trash"); - _popup.PopupEntity(Loc.GetString("flash-component-becomes-empty"), user); + _popup.PopupEntity(Loc.GetString("flash-component-becomes-empty"), uid); } uid.SpawnTimer(400, () => diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index 8f0519b24c..23b503caef 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -237,6 +237,12 @@ hands.ActiveHandEntity is not { } throwEnt || // Let other systems change the thrown entity (useful for virtual items) // or the throw strength. + var itemEv = new BeforeGettingThrownEvent(throwEnt, direction, throwStrength, player); + RaiseLocalEvent(throwEnt, ref itemEv); + + if (itemEv.Cancelled) + return true; + var ev = new BeforeThrowEvent(throwEnt, direction, throwStrength, player); RaiseLocalEvent(player, ref ev); diff --git a/Content.Server/Projectiles/ProjectileSystem.cs b/Content.Server/Projectiles/ProjectileSystem.cs index 0061b16e47..c5ec2d76ad 100644 --- a/Content.Server/Projectiles/ProjectileSystem.cs +++ b/Content.Server/Projectiles/ProjectileSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Damage.Events; using Content.Server.Administration.Logs; using Content.Server.Effects; using Content.Server.Weapons.Ranged.Systems; @@ -7,6 +8,7 @@ using Content.Shared.Projectiles; using Robust.Shared.Physics.Events; using Robust.Shared.Player; +using Robust.Shared.Utility; namespace Content.Server.Projectiles; @@ -22,6 +24,7 @@ public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStartCollide); + SubscribeLocalEvent(OnDamageExamine); } private void OnStartCollide(EntityUid uid, ProjectileComponent component, ref StartCollideEvent args) @@ -77,4 +80,21 @@ private void OnStartCollide(EntityUid uid, ProjectileComponent component, ref St RaiseNetworkEvent(new ImpactEffectEvent(component.ImpactEffect, GetNetCoordinates(xform.Coordinates)), Filter.Pvs(xform.Coordinates, entityMan: EntityManager)); } } + + private void OnDamageExamine(EntityUid uid, EmbeddableProjectileComponent component, ref DamageExamineEvent args) + { + if (!component.EmbedOnThrow) + return; + + if (!args.Message.IsEmpty) + args.Message.PushNewline(); + + var isHarmful = TryComp(uid, out var passiveDamage) && passiveDamage.Damage.Any(); + var loc = isHarmful + ? "damage-examine-embeddable-harmful" + : "damage-examine-embeddable"; + + var staminaCostMarkup = FormattedMessage.FromMarkupOrThrow(Loc.GetString(loc)); + args.Message.AddMessage(staminaCostMarkup); + } } diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index a3719f8f39..26f0c20608 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -53,22 +53,25 @@ private void OnMeleeExamineDamage(EntityUid uid, MeleeWeaponComponent component, return; var damageSpec = GetDamage(uid, args.User, component); - if (damageSpec.Empty) return; - _damageExamine.AddDamageExamine(args.Message, damageSpec, Loc.GetString("damage-melee")); - - if (damageSpec * component.HeavyDamageBaseModifier != damageSpec) - _damageExamine.AddDamageExamine(args.Message, damageSpec * component.HeavyDamageBaseModifier, Loc.GetString("damage-melee-heavy")); + if (!component.DisableClick) + _damageExamine.AddDamageExamine(args.Message, damageSpec, Loc.GetString("damage-melee")); - if (component.HeavyStaminaCost != 0) + if (!component.DisableHeavy) { - var staminaCostMarkup = FormattedMessage.FromMarkupOrThrow( - Loc.GetString("damage-melee-heavy-stamina-cost", - ("type", Loc.GetString("damage-melee-heavy")), ("cost", component.HeavyStaminaCost))); - args.Message.PushNewline(); - args.Message.AddMessage(staminaCostMarkup); + if (damageSpec * component.HeavyDamageBaseModifier != damageSpec) + _damageExamine.AddDamageExamine(args.Message, damageSpec * component.HeavyDamageBaseModifier, Loc.GetString("damage-melee-heavy")); + + if (component.HeavyStaminaCost != 0) + { + var staminaCostMarkup = FormattedMessage.FromMarkupOrThrow( + Loc.GetString("damage-stamina-cost", + ("type", Loc.GetString("damage-melee-heavy")), ("cost", component.HeavyStaminaCost))); + args.Message.PushNewline(); + args.Message.AddMessage(staminaCostMarkup); + } } } diff --git a/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesAuraComponent.cs b/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesAuraComponent.cs index 09e92b31c5..081e0e04c6 100644 --- a/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesAuraComponent.cs +++ b/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesAuraComponent.cs @@ -51,6 +51,9 @@ public sealed partial class BloodRitesAuraComponent : Component [DataField] public FixedPoint2 TotalHealing = 20; + [DataField] + public float PuddleConsumeRadius = 0.5f; + [DataField] public SoundSpecifier BloodRitesAudio = new SoundPathSpecifier( new ResPath("/Audio/WhiteDream/BloodCult/rites.ogg"), diff --git a/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesSystem.cs b/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesSystem.cs index 76adc9bde8..63b1c08aac 100644 --- a/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/BloodRites/BloodRitesSystem.cs @@ -10,7 +10,9 @@ using Content.Shared.Damage.Prototypes; using Content.Shared.DoAfter; using Content.Shared.Examine; +using Content.Shared.Fluids.Components; using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.UserInterface; @@ -34,6 +36,7 @@ public sealed class BloodRitesSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly HandsSystem _handsSystem = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; @@ -52,6 +55,8 @@ public override void Initialize() SubscribeLocalEvent(BeforeUiOpen); SubscribeLocalEvent(OnRitesMessage); + + SubscribeLocalEvent(OnDropped); } private void OnExamining(Entity rites, ref ExaminedEvent args) => @@ -83,19 +88,16 @@ private void OnAfterInteract(Entity rites, ref AfterInt return; } - if (!TryComp(args.Target, out SolutionContainerManagerComponent? solutionContainer)) // please send help - return; - - foreach (var (_, solution) in _solutionContainer.EnumerateSolutions((args.Target.Value, solutionContainer))) + if (HasComp(args.Target)) { - // I don't think something will ever have more than 1000 blood units in it's solution... - rites.Comp.StoredBlood += solution.Comp.Solution.RemoveReagent(_bloodProto, 1000); - _solutionContainer.UpdateChemicals(solution); - break; + ConsumePuddles(args.Target.Value, rites); + args.Handled = true; + } + else if (TryComp(args.Target, out SolutionContainerManagerComponent? solutionContainer)) + { + ConsumeBloodFromSolution((args.Target.Value, solutionContainer), rites); + args.Handled = true; } - - _audio.PlayPvs(rites.Comp.BloodRitesAudio, rites); - args.Handled = true; } private void OnDoAfter(Entity rites, ref BloodRitesExtractDoAfterEvent args) @@ -154,6 +156,8 @@ private void OnRitesMessage(Entity rites, ref BloodRite _handsSystem.TryPickup(args.Actor, ent); } + private void OnDropped(Entity rites, ref DroppedEvent args) => QueueDel(rites); + private bool Heal(Entity rites, EntityUid user, Entity target) { if (target.Comp.TotalDamage == 0) @@ -234,4 +238,36 @@ Entity target rites.Comp.StoredBlood -= bloodCost; return true; } + + private void ConsumePuddles(EntityUid origin, Entity rites) + { + var coords = Transform(origin).Coordinates; + + var lookup = _lookup.GetEntitiesInRange( + coords, + rites.Comp.PuddleConsumeRadius, + LookupFlags.Uncontained); + + foreach (var puddle in lookup) + { + if (!TryComp(puddle, out SolutionContainerManagerComponent? solutionContainer)) + continue; + ConsumeBloodFromSolution((puddle, solutionContainer), rites); + } + + _audio.PlayPvs(rites.Comp.BloodRitesAudio, rites); + } + + private void ConsumeBloodFromSolution( + Entity ent, + Entity rites + ) + { + foreach (var (_, solution) in _solutionContainer.EnumerateSolutions(ent)) + { + rites.Comp.StoredBlood += solution.Comp.Solution.RemoveReagent(_bloodProto, 1000); + _solutionContainer.UpdateChemicals(solution); + break; + } + } } diff --git a/Content.Server/WhiteDream/BloodCult/ConstructActionsSystem.cs b/Content.Server/WhiteDream/BloodCult/ConstructActionsSystem.cs new file mode 100644 index 0000000000..3d5e4ae44c --- /dev/null +++ b/Content.Server/WhiteDream/BloodCult/ConstructActionsSystem.cs @@ -0,0 +1,67 @@ +using Content.Server.WhiteDream.BloodCult.Constructs.PhaseShift; +using Content.Shared.StatusEffect; +using Content.Shared.WhiteDream.BloodCult.Spells; +using Robust.Server.Audio; +using Robust.Server.GameObjects; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using PhaseShiftedComponent = Content.Shared.WhiteDream.BloodCult.Constructs.PhaseShift.PhaseShiftedComponent; + +namespace Content.Server.WhiteDream.BloodCult; + +public sealed class ConstructActionsSystem : EntitySystem +{ + [Dependency] private readonly ITileDefinitionManager _tileDef = default!; + + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly MapSystem _mapSystem = default!; + [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + + private const string CultTileSpawnEffect = "CultTileSpawnEffect"; + + public override void Initialize() + { + SubscribeLocalEvent(OnPlaceTileEntityEvent); + SubscribeLocalEvent(OnPhaseShift); + } + + private void OnPlaceTileEntityEvent(PlaceTileEntityEvent args) + { + if (args.Handled) + return; + + if (args.Entity is { } entProtoId) + Spawn(entProtoId, args.Target); + + if (args.TileId is { } tileId) + { + if (_transform.GetGrid(args.Target) is not { } grid || !TryComp(grid, out MapGridComponent? mapGrid)) + return; + + var tileDef = _tileDef[tileId]; + var tile = new Tile(tileDef.TileId); + + _mapSystem.SetTile(grid, mapGrid, args.Target, tile); + Spawn(CultTileSpawnEffect, args.Target); + } + + if (args.Audio is { } audio) + _audio.PlayPvs(audio, args.Target); + + args.Handled = true; + } + + private void OnPhaseShift(PhaseShiftEvent args) + { + if (args.Handled) + return; + + if (_statusEffects.TryAddStatusEffect( + args.Performer, + args.StatusEffectId, + args.Duration, + false)) + args.Handled = true; + } +} diff --git a/Content.Server/WhiteDream/BloodCult/Constructs/ConstructSystem.cs b/Content.Server/WhiteDream/BloodCult/Constructs/ConstructSystem.cs index fbb800eb0b..c07f56a585 100644 --- a/Content.Server/WhiteDream/BloodCult/Constructs/ConstructSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Constructs/ConstructSystem.cs @@ -1,4 +1,5 @@ -using Content.Server.WhiteDream.BloodCult.Gamerule; +using Content.Server.Actions; +using Content.Server.WhiteDream.BloodCult.Gamerule; using Content.Shared.WhiteDream.BloodCult; using Content.Shared.WhiteDream.BloodCult.Constructs; using Robust.Server.GameObjects; @@ -7,13 +8,14 @@ namespace Content.Server.WhiteDream.BloodCult.Constructs; public sealed class ConstructSystem : EntitySystem { + [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnComponentStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnComponentShutdown); } @@ -37,23 +39,28 @@ public override void Update(float frameTime) } } - private void OnComponentStartup(Entity ent, ref ComponentStartup args) + private void OnMapInit(Entity construct, ref MapInitEvent args) { - _appearanceSystem.SetData(ent, ConstructVisualsState.Transforming, true); - ent.Comp.Transforming = true; - var cultistRule = EntityManager.EntityQueryEnumerator(); - while (cultistRule.MoveNext(out _, out var rule)) + foreach (var actionId in construct.Comp.Actions) { - rule.Constructs.Add(ent); + var action = _actions.AddAction(construct, actionId); + construct.Comp.ActionEntities.Add(action); } + + _appearanceSystem.SetData(construct, ConstructVisualsState.Transforming, true); + construct.Comp.Transforming = true; + var cultistRule = EntityManager.EntityQueryEnumerator(); + while (cultistRule.MoveNext(out _, out var rule)) + rule.Constructs.Add(construct); } - private void OnComponentShutdown(Entity ent, ref ComponentShutdown args) + private void OnComponentShutdown(Entity construct, ref ComponentShutdown args) { + foreach (var actionEntity in construct.Comp.ActionEntities) + _actions.RemoveAction(actionEntity); + var cultistRule = EntityManager.EntityQueryEnumerator(); while (cultistRule.MoveNext(out _, out var rule)) - { - rule.Constructs.Remove(ent); - } + rule.Constructs.Remove(construct); } } diff --git a/Content.Server/WhiteDream/BloodCult/Constructs/PhaseShift/PhaseShiftSystem.cs b/Content.Server/WhiteDream/BloodCult/Constructs/PhaseShift/PhaseShiftSystem.cs new file mode 100644 index 0000000000..1885b42d22 --- /dev/null +++ b/Content.Server/WhiteDream/BloodCult/Constructs/PhaseShift/PhaseShiftSystem.cs @@ -0,0 +1,34 @@ +using Content.Shared.Eye; +using Content.Shared.WhiteDream.BloodCult.Constructs.PhaseShift; +using Robust.Server.GameObjects; + +namespace Content.Server.WhiteDream.BloodCult.Constructs.PhaseShift; + +public sealed class PhaseShiftSystem : SharedPhaseShiftSystem +{ + [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; + + protected override void OnComponentStartup(Entity ent, ref ComponentStartup args) + { + base.OnComponentStartup(ent, ref args); + + if (!TryComp(ent, out var visibility)) + return; + + _visibilitySystem.AddLayer((ent, visibility), (int) VisibilityFlags.Ghost, false); + _visibilitySystem.RemoveLayer((ent, visibility), (int) VisibilityFlags.Normal, false); + _visibilitySystem.RefreshVisibility(ent); + } + + protected override void OnComponentShutdown(Entity ent, ref ComponentShutdown args) + { + base.OnComponentShutdown(ent, ref args); + + if (!TryComp(ent, out var visibility)) + return; + + _visibilitySystem.RemoveLayer((ent, visibility), (int) VisibilityFlags.Ghost, false); + _visibilitySystem.AddLayer((ent, visibility), (int) VisibilityFlags.Normal, false); + _visibilitySystem.RefreshVisibility(ent); + } +} diff --git a/Content.Server/WhiteDream/BloodCult/Constructs/SoulShard/SoulShardSystem.cs b/Content.Server/WhiteDream/BloodCult/Constructs/SoulShard/SoulShardSystem.cs index 50e92bf277..7a8578b665 100644 --- a/Content.Server/WhiteDream/BloodCult/Constructs/SoulShard/SoulShardSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Constructs/SoulShard/SoulShardSystem.cs @@ -27,12 +27,22 @@ public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnShardMindAdded); SubscribeLocalEvent(OnShardMindRemoved); } + private void OnMapInit(Entity shard, ref MapInitEvent args) + { + if (!shard.Comp.IsBlessed) + return; + + _appearanceSystem.SetData(shard, SoulShardVisualState.Blessed, true); + _lightSystem.SetColor(shard, shard.Comp.BlessedLightColor); + } + private void OnActivate(Entity shard, ref ActivateInWorldEvent args) { if (!_mind.TryGetMind(shard, out var mindId, out _)) @@ -76,10 +86,8 @@ private void OnShardMindAdded(Entity shard, ref MindAddedMes UpdateGlowVisuals(shard, true); } - private void OnShardMindRemoved(Entity shard, ref MindRemovedMessage args) - { + private void OnShardMindRemoved(Entity shard, ref MindRemovedMessage args) => UpdateGlowVisuals(shard, false); - } private void SpawnShade(Entity shard, EntProtoId proto, EntityUid mindId) { diff --git a/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleComponent.cs b/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleComponent.cs index 09dc2b542f..d0a1991a9f 100644 --- a/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleComponent.cs +++ b/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleComponent.cs @@ -1,4 +1,5 @@ using Content.Server.NPC.Components; +using Content.Server.WhiteDream.BloodCult.RendingRunePlacement; using Content.Shared.WhiteDream.BloodCult.BloodCultist; using Content.Shared.WhiteDream.BloodCult.Constructs; using Robust.Shared.Prototypes; @@ -26,9 +27,21 @@ public sealed partial class BloodCultRuleComponent : Component [DataField] public int PentagramThreshold = 8; + [DataField] + public int RendingRunePlacementsAmount = 3; + [ViewVariables(VVAccess.ReadOnly)] public bool LeaderSelected; + /// + /// If no rending rune markers were placed on the map, players will be able to place these runes anywhere on the map + /// but no more than total available. + /// + [DataField] + public bool EmergencyMarkersMode; + + public int EmergencyMarkersCount; + /// /// The entityUid of body which should be sacrificed. /// diff --git a/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleSystem.cs b/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleSystem.cs index c753d92913..bfb06c85cc 100644 --- a/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Gamerule/BloodCultRuleSystem.cs @@ -3,36 +3,39 @@ using Content.Server.Actions; using Content.Server.Antag; using Content.Server.Antag.Components; +using Content.Server.Body.Systems; using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; using Content.Server.Hands.Systems; using Content.Server.Language; +using Content.Server.Mind; using Content.Server.NPC.Systems; +using Content.Server.Pinpointer; using Content.Server.Roles; using Content.Server.RoundEnd; -using Content.Server.StationEvents.Components; using Content.Server.WhiteDream.BloodCult.Items.BloodSpear; using Content.Server.WhiteDream.BloodCult.Objectives; +using Content.Server.WhiteDream.BloodCult.RendingRunePlacement; using Content.Server.WhiteDream.BloodCult.Spells; -using Content.Shared.Body.Systems; using Content.Shared.Cloning; using Content.Shared.Cuffs.Components; using Content.Shared.GameTicking.Components; using Content.Shared.Humanoid; using Content.Shared.Inventory; -using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Mood; using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Roles; using Content.Shared.WhiteDream.BloodCult.Components; using Content.Shared.WhiteDream.BloodCult.BloodCultist; using Content.Shared.WhiteDream.BloodCult.Items; using Robust.Server.Containers; +using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Random; +using Robust.Shared.Utility; namespace Content.Server.WhiteDream.BloodCult.Gamerule; @@ -43,16 +46,18 @@ public sealed class BloodCultRuleSystem : GameRuleSystem [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly AntagSelectionSystem _antagSelection = default!; [Dependency] private readonly BloodSpearSystem _bloodSpear = default!; + [Dependency] private readonly BodySystem _body = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly HandsSystem _hands = default!; - [Dependency] private readonly InventorySystem _inventorySystem = default!; - [Dependency] private readonly LanguageSystem _languageSystem = default!; - [Dependency] private readonly NpcFactionSystem _factionSystem = default!; - [Dependency] private readonly MobStateSystem _mobStateSystem = default!; - [Dependency] private readonly RoundEndSystem _roundEndSystem = default!; - [Dependency] private readonly SharedBodySystem _bodySystem = default!; - [Dependency] private readonly SharedRoleSystem _roleSystem = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly LanguageSystem _language = default!; + [Dependency] private readonly NavMapSystem _navMap = default!; + [Dependency] private readonly NpcFactionSystem _faction = default!; + [Dependency] private readonly MindSystem _mind = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly RoleSystem _role = default!; + [Dependency] private readonly RoundEndSystem _roundEnd = default!; + [Dependency] private readonly TransformSystem _transform = default!; public override void Initialize() { @@ -79,7 +84,7 @@ GameRuleStartedEvent args { base.Started(uid, component, gameRule, args); - component.OfferingTarget = FindTarget(); + GetRandomRunePlacements(component); } protected override void AppendRoundEndText( @@ -103,6 +108,8 @@ ref RoundEndTextAppendEvent args } } + #region EventHandlers + private void AfterEntitySelected(Entity ent, ref AfterAntagEntitySelectedEvent args) => MakeCultist(args.EntityUid, ent); @@ -112,7 +119,7 @@ private void OnNarsieSummon(BloodCultNarsieSummoned ev) while (rulesQuery.MoveNext(out _, out var cult, out _)) { cult.WinCondition = CultWinCondition.Win; - _roundEndSystem.EndRound(); + _roundEnd.EndRound(); foreach (var ent in cult.Cultists) { @@ -121,8 +128,8 @@ private void OnNarsieSummon(BloodCultNarsieSummoned ev) continue; var harvester = Spawn(cult.HarvesterPrototype, Transform(ent.Owner).Coordinates); - _mindSystem.TransferTo(mindContainer.Mind.Value, harvester); - _bodySystem.GibBody(ent); + _mind.TransferTo(mindContainer.Mind.Value, harvester); + _body.GibBody(ent); } return; @@ -132,7 +139,7 @@ private void OnNarsieSummon(BloodCultNarsieSummoned ev) private void OnCultistComponentInit(Entity cultist, ref ComponentInit args) { RaiseLocalEvent(cultist, new MoodEffectEvent("CultFocused")); - _languageSystem.AddLanguage(cultist, cultist.Comp.CultLanguageId); + _language.AddLanguage(cultist, cultist.Comp.CultLanguageId); var query = QueryActiveRules(); while (query.MoveNext(out _, out var cult, out _)) @@ -148,7 +155,7 @@ private void OnCultistComponentRemoved(Entity cultist, re while (query.MoveNext(out _, out var cult, out _)) cult.Cultists.Remove(cultist); - CheckRoundShouldEnd(); + CheckWinCondition(); if (TerminatingOrDeleted(cultist.Owner)) return; @@ -157,7 +164,7 @@ private void OnCultistComponentRemoved(Entity cultist, re RemoveCultistAppearance(cultist); RemoveObjectiveAndRole(cultist.Owner); RaiseLocalEvent(cultist.Owner, new MoodRemoveEffectEvent("CultFocused")); - _languageSystem.RemoveLanguage(cultist.Owner, cultist.Comp.CultLanguageId); + _language.RemoveLanguage(cultist.Owner, cultist.Comp.CultLanguageId); if (!TryComp(cultist, out BloodCultSpellsHolderComponent? powersHolder)) return; @@ -166,16 +173,46 @@ private void OnCultistComponentRemoved(Entity cultist, re _actions.RemoveAction(cultist.Owner, power); } - private void OnCultistsStateChanged(Entity ent, ref MobStateChangedEvent args) + private void OnCultistsStateChanged(Entity cultist, ref MobStateChangedEvent args) { if (args.NewMobState == MobState.Dead) - CheckRoundShouldEnd(); + CheckWinCondition(); } - private void OnClone(Entity ent, ref CloningEvent args) => RemoveObjectiveAndRole(ent); + private void OnClone(Entity cultist, ref CloningEvent args) => + RemoveObjectiveAndRole(cultist); - private void OnGetBriefing(Entity ent, ref GetBriefingEvent args) => + private void OnGetBriefing(Entity cultist, ref GetBriefingEvent args) + { args.Append(Loc.GetString("blood-cult-role-briefing-short")); + var rulesQuery = QueryActiveRules(); + while (rulesQuery.MoveNext(out _, out var rule, out _)) + { + if (!rule.EmergencyMarkersMode) + continue; + + args.Append( + Loc.GetString("blood-cult-role-briefing-emergency-rending", ("amount", rule.EmergencyMarkersCount))); + return; + } + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var marker)) + { + if (!marker.IsActive) + continue; + + var navMapLocation = FormattedMessage.RemoveMarkupPermissive(_navMap.GetNearestBeaconString(uid)); + var coordinates = Transform(uid).Coordinates; + var msg = Loc.GetString( + "blood-cult-role-briefing-rending-locations", + ("location", navMapLocation), + ("coordinates", coordinates.Position)); + args.Append(Loc.GetString(msg)); + } + } + + #endregion public void Convert(EntityUid target) { @@ -190,12 +227,15 @@ public void Convert(EntityUid target) var antagSelectionEnt = (ruleUid, antagSelection); if (!_antagSelection.TryGetNextAvailableDefinition(antagSelectionEnt, out var def)) - continue; + def = antagSelection.Definitions.Last(); _antagSelection.MakeAntag(antagSelectionEnt, actor.PlayerSession, def.Value); } } + public bool IsObjectiveFinished() => + !TryGetTarget(out var target) || !HasComp(target) || _mobState.IsDead(target.Value); + public bool TryGetTarget([NotNullWhen(true)] out EntityUid? target) { target = GetTarget(); @@ -215,77 +255,151 @@ public bool TryGetTarget([NotNullWhen(true)] out EntityUid? target) public bool IsTarget(EntityUid entityUid) { var query = QueryActiveRules(); - while (query.MoveNext(out _, out var bloodCultRule, out _)) - return entityUid == bloodCultRule.OfferingTarget; + while (query.MoveNext(out _, out var rule, out _)) + return entityUid == rule.OfferingTarget; return false; } + public int GetTotalCultists() + { + var query = QueryActiveRules(); + while (query.MoveNext(out _, out var rule, out _)) + return rule.Cultists.Count + rule.Constructs.Count; + + return 0; + } + public void RemoveObjectiveAndRole(EntityUid uid) { - if (!_mindSystem.TryGetMind(uid, out var mindId, out var mind)) + if (!_mind.TryGetMind(uid, out var mindId, out var mind)) return; var objectives = mind.Objectives.FindAll(HasComp); foreach (var obj in objectives) - _mindSystem.TryRemoveObjective(mindId, mind, mind.Objectives.IndexOf(obj)); + _mind.TryRemoveObjective(mindId, mind, mind.Objectives.IndexOf(obj)); + + if (_role.MindHasRole(mindId)) + _role.MindRemoveRole(mindId); + } + + public bool CanDrawRendingRune(EntityUid user) + { + var ruleQuery = QueryActiveRules(); + while (ruleQuery.MoveNext(out _, out var rule, out _)) + if (rule is { EmergencyMarkersMode: true, EmergencyMarkersCount: > 0 }) + { + rule.EmergencyMarkersCount--; + return true; + } + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var marker)) + { + if (!marker.IsActive) + continue; + + var userLocation = Transform(user).Coordinates; + var placementCoordinates = Transform(uid).Coordinates; + if (_transform.InRange(placementCoordinates, userLocation, marker.DrawingRange)) + return true; + } + + return false; + } + + public void SetRandomCultTarget(BloodCultRuleComponent rule) + { + var querry = EntityManager + .EntityQueryEnumerator(); + + var potentialTargets = new List(); + + // Cultists not being excluded from target selection is fully intended. + while (querry.MoveNext(out var uid, out _, out _, out _)) + potentialTargets.Add(uid); - if (_roleSystem.MindHasRole(mindId)) - _roleSystem.MindRemoveRole(mindId); + rule.OfferingTarget = potentialTargets.Count > 0 ? _random.Pick(potentialTargets) : null; } - private void CheckRoundShouldEnd() + public bool TryConsumeNearestMarker(EntityUid user) + { + var ruleQuery = QueryActiveRules(); + while (ruleQuery.MoveNext(out _, out var rule, out _)) + if (rule is { EmergencyMarkersMode: true, EmergencyMarkersCount: > 0 }) + { + rule.EmergencyMarkersCount--; + return true; + } + + var userLocation = Transform(user).Coordinates; + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var markerUid, out var marker)) + { + if (!marker.IsActive) + continue; + + var placementCoordinates = Transform(markerUid).Coordinates; + if (!_transform.InRange(placementCoordinates, userLocation, marker.DrawingRange)) + continue; + + marker.IsActive = false; + break; + } + + return false; + } + + private void CheckWinCondition() { var query = QueryActiveRules(); while (query.MoveNext(out _, out var cult, out _)) { - var aliveCultists = cult.Cultists.Count(cultist => !_mobStateSystem.IsDead(cultist)); + var aliveCultists = cult.Cultists.Count(cultist => !_mobState.IsDead(cultist)); if (aliveCultists != 0) return; cult.WinCondition = CultWinCondition.Failure; - - // Check for all at once gamemode - if (!GameTicker.GetActiveGameRules().Where(HasComp).Any()) - _roundEndSystem.EndRound(); } } private void MakeCultist(EntityUid cultist, Entity rule) { - if (!_mindSystem.TryGetMind(cultist, out var mindId, out var mind)) + if (!_mind.TryGetMind(cultist, out var mindId, out var mind)) return; EnsureComp(cultist); - _factionSystem.RemoveFaction(cultist, rule.Comp.NanoTrasenFaction); - _factionSystem.AddFaction(cultist, rule.Comp.BloodCultFaction); + _faction.RemoveFaction(cultist, rule.Comp.NanoTrasenFaction); + _faction.AddFaction(cultist, rule.Comp.BloodCultFaction); - _mindSystem.TryAddObjective(mindId, mind, "KillTargetCultObjective"); + _mind.TryAddObjective(mindId, mind, "KillTargetCultObjective"); } - private EntityUid? FindTarget(ICollection exclude = null!) + private void GetRandomRunePlacements(BloodCultRuleComponent component) { - var querry = EntityManager - .EntityQueryEnumerator(); + var allMarkers = EntityQuery().ToList(); + if (allMarkers.Count == 0) + { + component.EmergencyMarkersMode = true; + component.EmergencyMarkersCount = component.RendingRunePlacementsAmount; + return; + } - var potentialTargets = new List(); + var maxRunes = component.RendingRunePlacementsAmount; + if (allMarkers.Count < component.RendingRunePlacementsAmount) + maxRunes = allMarkers.Count; - while (querry.MoveNext(out var uid, out var mind, out _, out _)) + for (var i = maxRunes; i > 0; i--) { - var entity = mind.Mind; - if (entity == default || exclude?.Contains(uid) is true || HasComp(uid)) - continue; - - potentialTargets.Add(uid); + var marker = _random.PickAndTake(allMarkers); + marker.IsActive = true; } - - return potentialTargets.Count > 0 ? _random.Pick(potentialTargets) : null; } private void RemoveAllCultItems(Entity cultist) { - if (!_inventorySystem.TryGetContainerSlotEnumerator(cultist.Owner, out var enumerator)) + if (!_inventory.TryGetContainerSlotEnumerator(cultist.Owner, out var enumerator)) return; _bloodSpear.DetachSpearFromMaster(cultist); diff --git a/Content.Server/WhiteDream/BloodCult/Items/VeilShifter/VeilShifterSystem.cs b/Content.Server/WhiteDream/BloodCult/Items/VeilShifter/VeilShifterSystem.cs index 188006e219..876cccf9ec 100644 --- a/Content.Server/WhiteDream/BloodCult/Items/VeilShifter/VeilShifterSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Items/VeilShifter/VeilShifterSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Popups; using Content.Shared.Coordinates.Helpers; +using Content.Shared.Examine; using Content.Shared.Interaction.Events; using Content.Shared.Maps; using Content.Shared.Movement.Pulling.Systems; @@ -27,20 +28,23 @@ public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnUseInHand); } + private void OnExamined(Entity veil, ref ExaminedEvent args) => + args.PushMarkup(Loc.GetString("veil-shifter-description", ("charges", veil.Comp.Charges))); + private void OnUseInHand(Entity veil, ref UseInHandEvent args) { - if (veil.Comp.Charges == 0) - return; - - if (!Teleport(veil, args.User)) + if (args.Handled || veil.Comp.Charges == 0 || !Teleport(veil, args.User)) return; veil.Comp.Charges--; if (veil.Comp.Charges == 0) _appearance.SetData(veil, GenericCultVisuals.State, false); + + args.Handled = true; } private bool Teleport(Entity veil, EntityUid user) diff --git a/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultComponent.cs b/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultComponent.cs index 8c500a0432..423252b6e3 100644 --- a/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultComponent.cs +++ b/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultComponent.cs @@ -7,5 +7,5 @@ public sealed partial class KillTargetCultComponent : Component public string Title = string.Empty; [DataField, ViewVariables(VVAccess.ReadWrite)] - public EntityUid Target; + public EntityUid? Target; } diff --git a/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultSystem.cs b/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultSystem.cs index b2ef487790..75e21d6800 100644 --- a/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Objectives/KillTargetCultSystem.cs @@ -9,6 +9,7 @@ namespace Content.Server.WhiteDream.BloodCult.Objectives; public sealed class KillTargetCultSystem : EntitySystem { + [Dependency] private readonly BloodCultRuleSystem _cultRule = default!; [Dependency] private readonly JobSystem _job = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly MobStateSystem _mobState = default!; @@ -23,22 +24,35 @@ public override void Initialize() private void OnObjectiveAssigned(Entity ent, ref ObjectiveAssignedEvent args) { var cultistRule = EntityManager.EntityQuery().FirstOrDefault(); - if (cultistRule?.OfferingTarget is { } target) - ent.Comp.Target = target; + if (cultistRule is null) + return; + + if (cultistRule.OfferingTarget is null) + _cultRule.SetRandomCultTarget(cultistRule); + + ent.Comp.Target = cultistRule.OfferingTarget; } private void OnAfterAssign(Entity ent, ref ObjectiveAfterAssignEvent args) { - _metaData.SetEntityName(ent, GetTitle(ent.Comp.Target, ent.Comp.Title), args.Meta); + if (!ent.Comp.Target.HasValue || !ent.Owner.IsValid() || !HasComp(ent)) + return; + + _metaData.SetEntityName(ent, GetTitle(ent.Comp.Target.Value, ent.Comp.Title), args.Meta); } private void OnGetProgress(Entity ent, ref ObjectiveGetProgressEvent args) { var target = ent.Comp.Target; + if (!target.HasValue) + { + args.Progress = 1f; + return; + } - args.Progress = !HasComp(target) || _mobState.IsDead(target) - ? args.Progress = 1f - : args.Progress = 0f; + args.Progress = !HasComp(target) || _mobState.IsDead(target.Value) + ? 1f + : 0f; } private string GetTitle(EntityUid target, string title) diff --git a/Content.Server/WhiteDream/BloodCult/RendingRunePlacement/RendingRunePlacementMarkerComponent.cs b/Content.Server/WhiteDream/BloodCult/RendingRunePlacement/RendingRunePlacementMarkerComponent.cs new file mode 100644 index 0000000000..44d15e8852 --- /dev/null +++ b/Content.Server/WhiteDream/BloodCult/RendingRunePlacement/RendingRunePlacementMarkerComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.WhiteDream.BloodCult.RendingRunePlacement; + +[RegisterComponent] +public sealed partial class RendingRunePlacementMarkerComponent : Component +{ + [DataField] + public bool IsActive; + + [DataField] + public float DrawingRange = 10; +} diff --git a/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseComponent.cs b/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseComponent.cs index d7c25ae24d..499007c80e 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseComponent.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseComponent.cs @@ -52,7 +52,7 @@ public sealed partial class CultRuneApocalypseComponent : Component { ["ImmovableRodSpawn"] = 3, ["MimicVendorRule"] = 2, - ["RatKingSpawn"] = 2, + //["RatKingSpawn"] = 2, ["MeteorSwarm"] = 2, ["SpiderSpawn"] = 3, // more spiders ["AnomalySpawn"] = 4, diff --git a/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseSystem.cs b/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseSystem.cs index 60b889e749..745ea042ca 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/Apocalypse/CultRuneApocalypseSystem.cs @@ -54,15 +54,14 @@ private void OnDoAfter(Entity ent, ref ApocalypseRu ent.Comp.Used = true; _appearance.SetData(ent, ApocalypseRuneVisuals.Used, true); - _emp.EmpPulse(_transform.GetMapCoordinates(ent), + _emp.EmpPulse( + _transform.GetMapCoordinates(ent), ent.Comp.EmpRange, ent.Comp.EmpEnergyConsumption, ent.Comp.EmpDuration); foreach (var guaranteedEvent in ent.Comp.GuaranteedEvents) - { _gameTicker.StartGameRule(guaranteedEvent); - } var requiredCultistsThreshold = MathF.Floor(_playerManager.PlayerCount * ent.Comp.CultistsThreshold); var totalCultists = cultRule.Cultists.Count + cultRule.Constructs.Count; @@ -71,8 +70,6 @@ private void OnDoAfter(Entity ent, ref ApocalypseRu var (randomEvent, repeatTimes) = _random.Pick(ent.Comp.PossibleEvents); for (var i = 0; i < repeatTimes; i++) - { _gameTicker.StartGameRule(randomEvent); - } } } diff --git a/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseComponent.cs b/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseComponent.cs index 023112a6ef..fcfe7a65a0 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseComponent.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Chat; +using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; using Content.Shared.Humanoid; using Robust.Shared.Prototypes; @@ -26,7 +27,16 @@ public sealed partial class CultRuneBaseComponent : Component [DataField] public DamageSpecifier? ActivationDamage; - public EntProtoId HolyWaterPrototype = "HolyWater"; + /// + /// Will the rune upon activation set nearest Rending Rune Placement Marker to disabled. + /// + [DataField] + public bool TriggerRendingMarkers; + + [DataField] + public bool CanBeErased = true; + + public ProtoId HolyWaterPrototype = "HolyWater"; } public sealed class TryInvokeCultRuneEvent(EntityUid user, HashSet invokers) : CancellableEntityEventArgs diff --git a/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.Helpers.cs b/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.Helpers.cs index ec81af6776..3e03ec1b0d 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.Helpers.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.Helpers.cs @@ -27,9 +27,11 @@ public HashSet GatherCultists(EntityUid rune, float range) /// The rune itself. /// Radius for a lookup. /// Filter to exlude from return. - public HashSet> GetTargetsNearRune(EntityUid rune, + public HashSet> GetTargetsNearRune( + EntityUid rune, float range, - Predicate>? exlude = null) + Predicate>? exlude = null + ) { var runeTransform = Transform(rune); var possibleTargets = _lookup.GetEntitiesInRange(runeTransform.Coordinates, range); diff --git a/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.cs b/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.cs index 0ad21e6369..013b8df6cd 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/CultRuneBaseSystem.cs @@ -7,13 +7,18 @@ using Content.Server.Fluids.Components; using Content.Server.Popups; using Content.Server.WhiteDream.BloodCult.Empower; +using Content.Server.WhiteDream.BloodCult.Gamerule; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Damage; using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.Ghost; using Content.Shared.Interaction; using Content.Shared.Maps; +using Content.Shared.UserInterface; using Content.Shared.WhiteDream.BloodCult.BloodCultist; +using Content.Shared.WhiteDream.BloodCult.Constructs; using Content.Shared.WhiteDream.BloodCult.Runes; using Robust.Server.Audio; using Robust.Server.GameObjects; @@ -28,18 +33,19 @@ public sealed partial class CultRuneBaseSystem : EntitySystem [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AudioSystem _audio = default!; [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly BloodCultRuleSystem _cultRule = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; public override void Initialize() { - base.Initialize(); - // Drawing rune + SubscribeLocalEvent(BeforeOpenUi); SubscribeLocalEvent(OnRuneSelected); SubscribeLocalEvent(OnDrawRune); @@ -50,6 +56,26 @@ public override void Initialize() // Rune invoking SubscribeLocalEvent(OnRuneActivate); + + SubscribeLocalEvent(OnRuneExaminaAttempt); + } + + #region EventHandlers + + private void BeforeOpenUi(Entity ent, ref BeforeActivatableUIOpenEvent args) + { + var availableRunes = new List>(); + var runeSelectorArray = _protoManager.EnumeratePrototypes().OrderBy(r => r.ID).ToArray(); + foreach (var runeSelector in runeSelectorArray) + { + if (runeSelector.RequireTargetDead && !_cultRule.IsObjectiveFinished() || + runeSelector.RequiredTotalCultists > _cultRule.GetTotalCultists()) + continue; + + availableRunes.Add(runeSelector.ID); + } + + _ui.SetUiState(ent.Owner, RuneDrawerBuiKey.Key, new RuneDrawerMenuState(availableRunes)); } private void OnRuneSelected(Entity ent, ref RuneDrawerSelectedMessage args) @@ -57,6 +83,12 @@ private void OnRuneSelected(Entity ent, ref RuneDrawerSelec if (!_protoManager.TryIndex(args.SelectedRune, out var runeSelector) || !CanDrawRune(args.Actor)) return; + if (runeSelector.RequireTargetDead && !_cultRule.CanDrawRendingRune(args.Actor)) + { + _popup.PopupEntity(Loc.GetString("cult-rune-cant-draw-rending"), args.Actor, args.Actor); + return; + } + var timeToDraw = runeSelector.DrawTime; if (TryComp(args.Actor, out BloodCultEmpoweredComponent? empowered)) timeToDraw *= empowered.RuneTimeMultiplier; @@ -85,18 +117,25 @@ private void OnDrawRune(Entity ent, ref DrawRuneDoAfter a DealDamage(args.User, runeSelector.DrawDamage); _audio.PlayPvs(args.EndDrawingSound, args.User, AudioParams.Default.WithMaxDistance(2f)); - var rune = SpawnRune(args.User, runeSelector.Prototype); + var runeEnt = SpawnRune(args.User, runeSelector.Prototype); + if (TryComp(runeEnt, out CultRuneBaseComponent? rune) + && rune.TriggerRendingMarkers + && !_cultRule.TryConsumeNearestMarker(ent)) + return; var ev = new AfterRunePlaced(args.User); - RaiseLocalEvent(rune, ev); + RaiseLocalEvent(runeEnt, ev); } - private void EraseOnInteractUsing(Entity ent, ref InteractUsingEvent args) + private void EraseOnInteractUsing(Entity rune, ref InteractUsingEvent args) { + if (!rune.Comp.CanBeErased) + return; + // Logic for bible erasing if (TryComp(args.Used, out var bible) && HasComp(args.User)) { - _popup.PopupEntity(Loc.GetString("cult-rune-erased"), ent, args.User); + _popup.PopupEntity(Loc.GetString("cult-rune-erased"), rune, args.User); _audio.PlayPvs(bible.HealSoundPath, args.User); EntityManager.DeleteEntity(args.Target); return; @@ -106,7 +145,7 @@ private void EraseOnInteractUsing(Entity ent, ref Interac return; var argsDoAfterEvent = - new DoAfterArgs(EntityManager, args.User, runeDrawer.EraseTime, new RuneEraseDoAfterEvent(), ent) + new DoAfterArgs(EntityManager, args.User, runeDrawer.EraseTime, new RuneEraseDoAfterEvent(), rune) { BreakOnUserMove = true, BreakOnDamage = true, @@ -114,7 +153,7 @@ private void EraseOnInteractUsing(Entity ent, ref Interac }; if (_doAfter.TryStartDoAfter(argsDoAfterEvent)) - _popup.PopupEntity(Loc.GetString("cult-rune-started-erasing"), ent, args.User); + _popup.PopupEntity(Loc.GetString("cult-rune-started-erasing"), rune, args.User); } private void OnRuneErase(Entity ent, ref RuneEraseDoAfterEvent args) @@ -126,55 +165,67 @@ private void OnRuneErase(Entity ent, ref RuneEraseDoAfter EntityManager.DeleteEntity(ent); } - private void EraseOnCollding(Entity ent, ref StartCollideEvent args) + private void EraseOnCollding(Entity rune, ref StartCollideEvent args) { - if (!TryComp(args.OtherEntity, out var solutionContainer) || + if (!rune.Comp.CanBeErased || + !TryComp(args.OtherEntity, out var solutionContainer) || !HasComp(args.OtherEntity) && !HasComp(args.OtherEntity)) return; if (_solutionContainer.EnumerateSolutions((args.OtherEntity, solutionContainer)) - .Any(solution => solution.Solution.Comp.Solution.ContainsPrototype(ent.Comp.HolyWaterPrototype))) - EntityManager.DeleteEntity(ent); + .Any(solution => solution.Solution.Comp.Solution.ContainsPrototype(rune.Comp.HolyWaterPrototype))) + EntityManager.DeleteEntity(rune); } - private void OnRuneActivate(Entity ent, ref ActivateInWorldEvent args) + private void OnRuneActivate(Entity rune, ref ActivateInWorldEvent args) { - var runeCoordinates = Transform(ent).Coordinates; + var runeCoordinates = Transform(rune).Coordinates; var userCoordinates = Transform(args.User).Coordinates; if (args.Handled || !HasComp(args.User) || !userCoordinates.TryDistance(EntityManager, runeCoordinates, out var distance) || - distance > ent.Comp.RuneActivationRange) + distance > rune.Comp.RuneActivationRange) return; args.Handled = true; - var cultists = GatherCultists(ent, ent.Comp.RuneActivationRange); - if (cultists.Count < ent.Comp.RequiredInvokers) + var cultists = GatherCultists(rune, rune.Comp.RuneActivationRange); + if (cultists.Count < rune.Comp.RequiredInvokers) { - _popup.PopupEntity(Loc.GetString("cult-rune-not-enough-cultists"), ent, args.User); + _popup.PopupEntity(Loc.GetString("cult-rune-not-enough-cultists"), rune, args.User); return; } var tryInvokeEv = new TryInvokeCultRuneEvent(args.User, cultists); - RaiseLocalEvent(ent, tryInvokeEv); + RaiseLocalEvent(rune, tryInvokeEv); if (tryInvokeEv.Cancelled) return; foreach (var cultist in cultists) { - DealDamage(cultist, ent.Comp.ActivationDamage); - _chat.TrySendInGameICMessage(cultist, - ent.Comp.InvokePhrase, - ent.Comp.InvokeChatType, + DealDamage(cultist, rune.Comp.ActivationDamage); + _chat.TrySendInGameICMessage( + cultist, + rune.Comp.InvokePhrase, + rune.Comp.InvokeChatType, false, checkRadioPrefix: false); } } + private void OnRuneExaminaAttempt(Entity rune, ref ExamineAttemptEvent args) + { + if (!HasComp(args.Examiner) && !HasComp(args.Examiner) && + !HasComp(args.Examiner)) + args.Cancel(); + } + + #endregion + private EntityUid SpawnRune(EntityUid user, EntProtoId rune) { var transform = Transform(user); - var snappedLocalPosition = new Vector2(MathF.Floor(transform.LocalPosition.X) + 0.5f, + var snappedLocalPosition = new Vector2( + MathF.Floor(transform.LocalPosition.X) + 0.5f, MathF.Floor(transform.LocalPosition.Y) + 0.5f); var spawnPosition = _transform.GetMapCoordinates(user); var runeEntity = EntityManager.Spawn(rune, spawnPosition); @@ -211,9 +262,7 @@ private void DealDamage(EntityUid user, DamageSpecifier? damage = null) if (TryComp(user, out BloodCultEmpoweredComponent? empowered)) { foreach (var (key, value) in damage.DamageDict) - { damage.DamageDict[key] = value * empowered.RuneDamageMultiplier; - } } _damageable.TryChangeDamage(user, newDamage, true); diff --git a/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingComponent.cs b/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingComponent.cs index 06d750bfc8..5e594808d9 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingComponent.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Damage; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; namespace Content.Server.WhiteDream.BloodCult.Runes.Offering; @@ -30,10 +31,16 @@ public sealed partial class CultRuneOfferingComponent : Component [DataField] public int ReviveChargesPerOffering = 1; + [DataField] + public EntProtoId SoulShardProto = "SoulShard"; + + [DataField] + public EntProtoId SoulShardGhostProto = "SoulShardGhost"; + [DataField] public DamageSpecifier ConvertHealing = new() { - DamageDict = new Dictionary + DamageDict = new() { ["Brute"] = -40, ["Burn"] = -40 diff --git a/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingSystem.cs b/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingSystem.cs index 19614e20bd..3556fd9b23 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/Offering/CultRuneOfferingSystem.cs @@ -8,7 +8,6 @@ using Content.Server.WhiteDream.BloodCult.Runes.Revive; using Content.Shared.Cuffs.Components; using Content.Shared.Damage; -using Content.Shared.Humanoid; using Content.Shared.Mindshield.Components; using Content.Shared.Mobs.Systems; using Content.Shared.StatusEffect; @@ -35,10 +34,11 @@ public override void Initialize() SubscribeLocalEvent(OnOfferingRuneInvoked); } - private void OnOfferingRuneInvoked(Entity ent, ref TryInvokeCultRuneEvent args) + private void OnOfferingRuneInvoked(Entity rune, ref TryInvokeCultRuneEvent args) { - var possibleTargets = _cultRune.GetTargetsNearRune(ent, - ent.Comp.OfferingRange, + var possibleTargets = _cultRune.GetTargetsNearRune( + rune, + rune.Comp.OfferingRange, entity => HasComp(entity)); if (possibleTargets.Count == 0) @@ -48,60 +48,38 @@ private void OnOfferingRuneInvoked(Entity ent, ref Tr } var target = possibleTargets.First(); + if (!TryOffer(rune, target, args.User, args.Invokers.Count)) + args.Cancel(); + } + private bool TryOffer(Entity rune, EntityUid target, EntityUid user, int invokersTotal) + { // if the target is dead we should always sacrifice it. if (_mobState.IsDead(target)) { - Sacrifice(target); - return; + Sacrifice(rune, target); + return true; } - if (!_mind.TryGetMind(target, out _, out _) || - _bloodCultRule.IsTarget(target) || - HasComp(target) || - HasComp(target)) - { - if (!TrySacrifice(target, ent, args.Invokers.Count)) - args.Cancel(); - - return; - } + if (!_mind.TryGetMind(target, out _, out _) || _bloodCultRule.IsTarget(target) || + HasComp(target) || HasComp(target)) + return TrySacrifice(rune, target, invokersTotal); - if (!TryConvert(target, ent, args.User, args.Invokers.Count)) - args.Cancel(); + return TryConvert(rune, target, user, invokersTotal); } - private bool TrySacrifice(Entity target, - Entity rune, - int invokersAmount) + private bool TrySacrifice(Entity rune, EntityUid target, int invokersAmount) { if (invokersAmount < rune.Comp.AliveSacrificeInvokersAmount) return false; - _cultRuneRevive.AddCharges(rune, rune.Comp.ReviveChargesPerOffering); - Sacrifice(target); + Sacrifice(rune, target); return true; } - private void Sacrifice(EntityUid target) - { - var transform = Transform(target); - var shard = Spawn("SoulShard", transform.Coordinates); - _body.GibBody(target); - - if (!_mind.TryGetMind(target, out var mindId, out _)) - return; - - _mind.TransferTo(mindId, shard); - _mind.UnVisit(mindId); - } - - private bool TryConvert(EntityUid target, - Entity rune, - EntityUid user, - int invokersAmount) + private bool TryConvert(Entity rune, EntityUid target, EntityUid user, int invokersTotal) { - if (invokersAmount < rune.Comp.ConvertInvokersAmount) + if (invokersTotal < rune.Comp.ConvertInvokersAmount) return false; _cultRuneRevive.AddCharges(rune, rune.Comp.ReviveChargesPerOffering); @@ -109,6 +87,23 @@ private bool TryConvert(EntityUid target, return true; } + private void Sacrifice(Entity rune, EntityUid target) + { + _cultRuneRevive.AddCharges(rune, rune.Comp.ReviveChargesPerOffering); + var transform = Transform(target); + + if (!_mind.TryGetMind(target, out var mindId, out _)) + Spawn(rune.Comp.SoulShardGhostProto, transform.Coordinates); + else + { + var shard = Spawn(rune.Comp.SoulShardProto, transform.Coordinates); + _mind.TransferTo(mindId, shard); + _mind.UnVisit(mindId); + } + + _body.GibBody(target); + } + private void Convert(Entity rune, EntityUid target, EntityUid user) { _bloodCultRule.Convert(target); diff --git a/Content.Server/WhiteDream/BloodCult/Runes/Rending/CultRuneRendingSystem.cs b/Content.Server/WhiteDream/BloodCult/Runes/Rending/CultRuneRendingSystem.cs index d051d07528..91347bcdd9 100644 --- a/Content.Server/WhiteDream/BloodCult/Runes/Rending/CultRuneRendingSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Runes/Rending/CultRuneRendingSystem.cs @@ -4,8 +4,6 @@ using Content.Server.Popups; using Content.Server.WhiteDream.BloodCult.Gamerule; using Content.Shared.DoAfter; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; using Content.Shared.WhiteDream.BloodCult.Runes; using Robust.Server.Audio; using Robust.Server.GameObjects; @@ -22,7 +20,6 @@ public sealed class CultRuneRendingSystem : EntitySystem [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly BloodCultRuleSystem _cultRule = default!; [Dependency] private readonly DoAfterSystem _doAfter = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly NavMapSystem _navMap = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly TransformSystem _transform = default!; @@ -38,10 +35,12 @@ public override void Initialize() private void OnRendingRunePlaced(Entity rune, ref AfterRunePlaced args) { var position = _transform.GetMapCoordinates(rune); - var message = Loc.GetString("cult-rending-drawing-finished", + var message = Loc.GetString( + "cult-rending-drawing-finished", ("location", FormattedMessage.RemoveMarkupPermissive(_navMap.GetNearestBeaconString(position)))); - _chat.DispatchGlobalAnnouncement(message, + _chat.DispatchGlobalAnnouncement( + message, Loc.GetString("blood-cult-title"), true, rune.Comp.FinishedDrawingAudio, @@ -50,9 +49,7 @@ private void OnRendingRunePlaced(Entity rune, ref Afte private void OnRendingRuneInvoked(Entity rune, ref TryInvokeCultRuneEvent args) { - if (!_cultRule.TryGetTarget(out var target) || - !TryComp(target.Value, out MobStateComponent? _) || - _mobState.IsAlive(target.Value)) + if (!_cultRule.IsObjectiveFinished()) { _popup.PopupEntity(Loc.GetString("cult-rending-target-alive"), rune, args.User); args.Cancel(); @@ -78,7 +75,11 @@ private void OnRendingRuneInvoked(Entity rune, ref Try return; } - _chat.DispatchGlobalAnnouncement(Loc.GetString("cult-rending-started"), + var message = Loc.GetString( + "cult-rending-started", + ("location", FormattedMessage.RemoveMarkupPermissive(_navMap.GetNearestBeaconString(rune.Owner)))); + _chat.DispatchGlobalAnnouncement( + message, Loc.GetString("blood-cult-title"), false, colorOverride: Color.DarkRed); @@ -95,7 +96,8 @@ private void SpawnNarSie(Entity rune, ref RendingRuneD _appearance.SetData(rune, RendingRuneVisuals.Active, false); if (args.Cancelled) { - _chat.DispatchGlobalAnnouncement(Loc.GetString("cult-rending-prevented"), + _chat.DispatchGlobalAnnouncement( + Loc.GetString("cult-rending-prevented"), Loc.GetString("blood-cult-title"), false, colorOverride: Color.DarkRed); diff --git a/Content.Server/WhiteDream/BloodCult/Spells/BloodCultSpellsSystem.cs b/Content.Server/WhiteDream/BloodCult/Spells/BloodCultSpellsSystem.cs index 76697c252a..c69bf6abd4 100644 --- a/Content.Server/WhiteDream/BloodCult/Spells/BloodCultSpellsSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Spells/BloodCultSpellsSystem.cs @@ -44,6 +44,7 @@ public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnSpellStartup); SubscribeLocalEvent(OnCultTargetEvent); SubscribeLocalEvent(OnActionGettingDisabled); @@ -60,6 +61,12 @@ public override void Initialize() #region BaseHandlers + private void OnSpellStartup(Entity action, ref ComponentStartup args) + { + if (_actions.TryGetActionData(action, out var actionData, false) && actionData is { UseDelay: not null }) + _actions.StartUseDelay(action); + } + private void OnCultTargetEvent(Entity spell, ref EntityTargetActionEvent args) { if (_statusEffects.HasStatusEffect(args.Performer, "Muted")) @@ -83,10 +90,8 @@ private void OnActionGettingDisabled(Entity spell, ref A _actions.RemoveAction(args.Performer, spell); } - private void OnComponentStartup(Entity cultist, ref ComponentStartup args) - { + private void OnComponentStartup(Entity cultist, ref ComponentStartup args) => cultist.Comp.MaxSpells = cultist.Comp.DefaultMaxSpells; - } private void OnGetVerbs(Entity cultist, ref GetVerbsEvent args) { @@ -136,7 +141,8 @@ private void OnSpellSelected(Entity cultist, ref ActionProtoId = args.SelectedItem }; - var doAfter = new DoAfterArgs(EntityManager, + var doAfter = new DoAfterArgs( + EntityManager, cultist.Owner, cultist.Comp.SpellCreationTime, createSpellEvent, @@ -189,7 +195,7 @@ private void OnShackles(BloodCultShacklesEvent ev) return; var shuckles = Spawn(ev.ShacklesProto); - if (!_cuffable.TryAddNewCuffs(ev.Performer, ev.Target, shuckles)) + if (!_cuffable.TryAddNewCuffs(ev.Target, ev.Performer, shuckles)) return; _stun.TryKnockdown(ev.Target, ev.KnockdownDuration, true); diff --git a/Content.Server/WhiteDream/BloodCult/Spells/BloodCultTeleportSpellSystem.cs b/Content.Server/WhiteDream/BloodCult/Spells/BloodCultTeleportSpellSystem.cs index bd605475ed..b0906bc13b 100644 --- a/Content.Server/WhiteDream/BloodCult/Spells/BloodCultTeleportSpellSystem.cs +++ b/Content.Server/WhiteDream/BloodCult/Spells/BloodCultTeleportSpellSystem.cs @@ -22,7 +22,7 @@ public override void Initialize() { SubscribeLocalEvent(OnTeleport); SubscribeLocalEvent(OnTeleportRuneSelected); - SubscribeLocalEvent(OnTeleportDoAfter); + SubscribeLocalEvent(OnTeleportDoAfter); } private void OnTeleport(BloodCultTeleportEvent ev) @@ -30,28 +30,37 @@ private void OnTeleport(BloodCultTeleportEvent ev) if (ev.Handled || !_runeTeleport.TryGetTeleportRunes(ev.Performer, out var runes)) return; - _ui.SetUiState(ev.Performer, ListViewSelectorUiKey.Key, new ListViewSelectorState(runes)); + var metaData = new Dictionary + { + ["target"] = GetNetEntity(ev.Target), + ["duration"] = ev.DoAfterDuration + }; + + _ui.SetUiState(ev.Performer, ListViewSelectorUiKey.Key, new ListViewSelectorState(runes, metaData)); _ui.TryToggleUi(ev.Performer, ListViewSelectorUiKey.Key, ev.Performer); ev.Handled = true; } - private void OnTeleportRuneSelected(Entity ent, - ref ListViewItemSelectedMessage args) + private void OnTeleportRuneSelected( + Entity ent, + ref ListViewItemSelectedMessage args + ) { - if (!args.MetaData.TryGetValue("target", out var rawTarget) || rawTarget is not EntityUid target || + if (!args.MetaData.TryGetValue("target", out var rawTarget) || rawTarget is not NetEntity netTarget || !args.MetaData.TryGetValue("duration", out var rawDuration) || rawDuration is not TimeSpan duration) return; + var target = GetEntity(netTarget); var teleportDoAfter = new TeleportActionDoAfterEvent { - Rune = GetNetEntity(EntityUid.Parse(args.SelectedItem.Id)), + Rune = GetNetEntity(EntityUid.Parse(args.SelectedItem.Id)) }; - var doAfterArgs = new DoAfterArgs(EntityManager, ent.Owner, duration, teleportDoAfter, target); + var doAfterArgs = new DoAfterArgs(EntityManager, ent.Owner, duration, teleportDoAfter, target, target); _doAfter.TryStartDoAfter(doAfterArgs); } - private void OnTeleportDoAfter(TeleportActionDoAfterEvent ev) + private void OnTeleportDoAfter(Entity user, ref TeleportActionDoAfterEvent ev) { if (ev.Target is not { } target) return; diff --git a/Content.Server/WhiteDream/BloodCult/TimedFactory/TimedFactorySystem.cs b/Content.Server/WhiteDream/BloodCult/TimedFactory/TimedFactorySystem.cs index 5dc4ff3d65..b1aa942114 100644 --- a/Content.Server/WhiteDream/BloodCult/TimedFactory/TimedFactorySystem.cs +++ b/Content.Server/WhiteDream/BloodCult/TimedFactory/TimedFactorySystem.cs @@ -28,12 +28,10 @@ public override void Update(float frameTime) var factoryQuery = EntityQueryEnumerator(); while (factoryQuery.MoveNext(out var uid, out var factory)) - { if (factory.CooldownRemaining > 0) factory.CooldownRemaining -= frameTime; else _appearance.SetData(uid, GenericCultVisuals.State, true); - } } private void OnTryOpenMenu(Entity factory, ref ActivatableUIOpenAttemptEvent args) @@ -53,9 +51,13 @@ private void OnTryOpenMenu(Entity factory, ref Activatabl private void OnPrototypeSelected(Entity factory, ref RadialSelectorSelectedMessage args) { + if (factory.Comp.CooldownRemaining > 0) + return; + var product = Spawn(args.SelectedItem, Transform(args.Actor).Coordinates); _hands.TryPickupAnyHand(args.Actor, product); factory.Comp.CooldownRemaining = factory.Comp.Cooldown; _appearance.SetData(factory, GenericCultVisuals.State, false); + _ui.CloseUi(args.Actor, RadialSelectorUiKey.Key); } } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Targeting.cs b/Content.Shared/Body/Systems/SharedBodySystem.Targeting.cs index 09c3c5fa52..202353d3ee 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Targeting.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Targeting.cs @@ -264,7 +264,7 @@ private static TargetBodyPart GetRandomPartSpread(IRobustRandom random, ushort t public TargetBodyPart? GetRandomBodyPart(EntityUid uid, TargetingComponent? target = null) { - if (!Resolve(uid, ref target)) + if (!Resolve(uid, ref target, false)) return null; var totalWeight = target.TargetOdds.Values.Sum(); diff --git a/Content.Shared/Chat/Prototypes/EmotePrototype.cs b/Content.Shared/Chat/Prototypes/EmotePrototype.cs index 7ee958ee6a..34d54bc360 100644 --- a/Content.Shared/Chat/Prototypes/EmotePrototype.cs +++ b/Content.Shared/Chat/Prototypes/EmotePrototype.cs @@ -68,6 +68,10 @@ public sealed partial class EmotePrototype : IPrototype /// [DataField] public HashSet ChatTriggers = new(); + + // goob edit - animations + [DataField] + public object? Event = null; } /// diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Misc.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Misc.cs new file mode 100644 index 0000000000..f13cb94f39 --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Misc.cs @@ -0,0 +1,55 @@ +using Content.Shared.Customization.Systems; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Customization.Systems; + +/// +/// Requires the server to have a specific CVar value. +/// +[UsedImplicitly, Serializable, NetSerializable,] +public sealed partial class CVarRequirement : CharacterRequirement +{ + [DataField("cvar", required: true)] + public string CVar; + + [DataField(required: true)] + public string RequiredValue; + + public override bool IsValid( + JobPrototype job, + HumanoidCharacterProfile profile, + Dictionary playTimes, + bool whitelisted, + IPrototype prototype, + IEntityManager entityManager, + IPrototypeManager prototypeManager, + IConfigurationManager configManager, + out string? reason, + int depth = 0 + ) + { + if (!configManager.IsCVarRegistered(CVar)) + { + reason = null; + return true; + } + + const string color = "lightblue"; + var cvar = configManager.GetCVar(CVar); + var isValid = cvar.ToString()! == RequiredValue; + + reason = Loc.GetString( + "character-cvar-requirement", + ("inverted", Inverted), + ("color", color), + ("cvar", CVar), + ("value", RequiredValue)); + + return isValid; + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs index 5e10c50493..d250b46b1a 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs @@ -12,7 +12,6 @@ using Robust.Shared.Physics; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Utility; namespace Content.Shared.Customization.Systems; @@ -20,8 +19,7 @@ namespace Content.Shared.Customization.Systems; /// /// Requires the profile to be within an age range /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterAgeRequirement : CharacterRequirement { [DataField(required: true)] @@ -30,7 +28,8 @@ public sealed partial class CharacterAgeRequirement : CharacterRequirement [DataField(required: true)] public int Max; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -39,10 +38,14 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { - reason = Loc.GetString("character-age-requirement", - ("inverted", Inverted), ("min", Min), ("max", Max)); + reason = Loc.GetString( + "character-age-requirement", + ("inverted", Inverted), + ("min", Min), + ("max", Max)); return profile.Age >= Min && profile.Age <= Max; } } @@ -50,14 +53,14 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to be a certain gender /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterGenderRequirement : CharacterRequirement { [DataField(required: true)] public Gender Gender; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -66,9 +69,11 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { - reason = Loc.GetString("character-gender-requirement", + reason = Loc.GetString( + "character-gender-requirement", ("inverted", Inverted), ("gender", Loc.GetString($"humanoid-profile-editor-pronouns-{Gender.ToString().ToLower()}-text"))); return profile.Gender == Gender; @@ -78,14 +83,14 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to be a certain sex /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterSexRequirement : CharacterRequirement { [DataField(required: true)] public Sex Sex; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -94,9 +99,11 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { - reason = Loc.GetString("character-sex-requirement", + reason = Loc.GetString( + "character-sex-requirement", ("inverted", Inverted), ("sex", Loc.GetString($"humanoid-profile-editor-sex-{Sex.ToString().ToLower()}-text"))); return profile.Sex == Sex; @@ -106,14 +113,14 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to be a certain species /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterSpeciesRequirement : CharacterRequirement { [DataField(required: true)] public List> Species; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -122,10 +129,12 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { const string color = "green"; - reason = Loc.GetString("character-species-requirement", + reason = Loc.GetString( + "character-species-requirement", ("inverted", Inverted), ("species", $"[color={color}]{string.Join($"[/color], [color={color}]", Species.Select(s => Loc.GetString(prototypeManager.Index(s).Name)))}[/color]")); @@ -135,10 +144,9 @@ public override bool IsValid(JobPrototype job, } /// -/// Requires the profile to be within a certain height range +/// Requires the profile to be within a certain height range /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterHeightRequirement : CharacterRequirement { /// @@ -153,7 +161,8 @@ public sealed partial class CharacterHeightRequirement : CharacterRequirement [DataField] public float Max = int.MaxValue; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -162,13 +171,18 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { const string color = "yellow"; var species = prototypeManager.Index(profile.Species); - reason = Loc.GetString("character-height-requirement", - ("inverted", Inverted), ("color", color), ("min", Min), ("max", Max)); + reason = Loc.GetString( + "character-height-requirement", + ("inverted", Inverted), + ("color", color), + ("min", Min), + ("max", Max)); var height = profile.Height * species.AverageHeight; return height >= Min && height <= Max; @@ -178,8 +192,7 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to be within a certain width range /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterWidthRequirement : CharacterRequirement { /// @@ -194,7 +207,8 @@ public sealed partial class CharacterWidthRequirement : CharacterRequirement [DataField] public float Max = int.MaxValue; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -203,13 +217,18 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { const string color = "yellow"; var species = prototypeManager.Index(profile.Species); - reason = Loc.GetString("character-width-requirement", - ("inverted", Inverted), ("color", color), ("min", Min), ("max", Max)); + reason = Loc.GetString( + "character-width-requirement", + ("inverted", Inverted), + ("color", color), + ("min", Min), + ("max", Max)); var width = profile.Width * species.AverageWidth; return width >= Min && width <= Max; @@ -219,8 +238,7 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to be within a certain weight range /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterWeightRequirement : CharacterRequirement { /// @@ -235,7 +253,8 @@ public sealed partial class CharacterWeightRequirement : CharacterRequirement [DataField] public float Max = int.MaxValue; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -244,7 +263,8 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { const string color = "green"; var species = prototypeManager.Index(profile.Species); @@ -259,28 +279,32 @@ public override bool IsValid(JobPrototype job, var weight = MathF.Round( MathF.PI * MathF.Pow( fixture.Fixtures["fix1"].Shape.Radius - * ((profile.Width + profile.Height) / 2), 2) - * fixture.Fixtures["fix1"].Density); + * ((profile.Width + profile.Height) / 2), + 2) + * fixture.Fixtures["fix1"].Density); - reason = Loc.GetString("character-weight-requirement", - ("inverted", Inverted), ("color", color), ("min", Min), ("max", Max)); + reason = Loc.GetString( + "character-weight-requirement", + ("inverted", Inverted), + ("color", color), + ("min", Min), + ("max", Max)); return weight >= Min && weight <= Max; } } - /// /// Requires the profile to have one of the specified traits /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterTraitRequirement : CharacterRequirement { [DataField(required: true)] public List> Traits; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -289,10 +313,12 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { const string color = "lightblue"; - reason = Loc.GetString("character-trait-requirement", + reason = Loc.GetString( + "character-trait-requirement", ("inverted", Inverted), ("traits", $"[color={color}]{string.Join($"[/color], [color={color}]", Traits.Select(t => Loc.GetString($"trait-name-{t}")))}[/color]")); @@ -304,14 +330,14 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to have one of the specified loadouts /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterLoadoutRequirement : CharacterRequirement { [DataField(required: true)] public List> Loadouts; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -320,10 +346,12 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { const string color = "lightblue"; - reason = Loc.GetString("character-loadout-requirement", + reason = Loc.GetString( + "character-loadout-requirement", ("inverted", Inverted), ("loadouts", $"[color={color}]{string.Join($"[/color], [color={color}]", Loadouts.Select(l => Loc.GetString($"loadout-name-{l}")))}[/color]")); @@ -335,14 +363,14 @@ public override bool IsValid(JobPrototype job, /// /// Requires the profile to not have any more than X of the specified traits, loadouts, etc, in a group /// -[UsedImplicitly] -[Serializable, NetSerializable] +[UsedImplicitly, Serializable, NetSerializable] public sealed partial class CharacterItemGroupRequirement : CharacterRequirement { [DataField(required: true)] public ProtoId Group; - public override bool IsValid(JobPrototype job, + public override bool IsValid( + JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, @@ -351,23 +379,27 @@ public override bool IsValid(JobPrototype job, IPrototypeManager prototypeManager, IConfigurationManager configManager, out string? reason, - int depth = 0) + int depth = 0 + ) { var group = prototypeManager.Index(Group); // Get the count of items in the group that are in the profile - var items = group.Items.Select(item => item.TryGetValue(profile, prototypeManager, out _) ? item.ID : null).Where(id => id != null).ToList(); + var items = group.Items.Select(item => item.TryGetValue(profile, prototypeManager, out _) ? item.ID : null) + .Where(id => id != null) + .ToList(); var count = items.Count; // If prototype is selected, remove one from the count if (items.ToList().Contains(prototype.ID)) count--; - reason = Loc.GetString("character-item-group-requirement", + reason = Loc.GetString( + "character-item-group-requirement", ("inverted", Inverted), ("group", Loc.GetString($"character-item-group-{Group}")), ("max", group.MaxItems)); return count < group.MaxItems; } -} +} \ No newline at end of file diff --git a/Content.Shared/Damage/Components/DamageOtherOnHitComponent.cs b/Content.Shared/Damage/Components/DamageOtherOnHitComponent.cs new file mode 100644 index 0000000000..ca5179fe29 --- /dev/null +++ b/Content.Shared/Damage/Components/DamageOtherOnHitComponent.cs @@ -0,0 +1,75 @@ +using Content.Shared.Contests; +using Content.Shared.Damage.Systems; +using Content.Shared.Damage; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Damage.Components; + +/// +/// Deals damage when thrown. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class DamageOtherOnHitComponent : Component +{ + [DataField, AutoNetworkedField] + public bool IgnoreResistances = false; + + /// + /// The damage that a throw deals. + /// + [DataField, AutoNetworkedField] + public DamageSpecifier Damage = new(); + + /// + /// The stamina cost of throwing this entity. + /// + [DataField, AutoNetworkedField] + public float StaminaCost = 3.5f; + + /// + /// The maximum amount of hits per throw before landing on the floor. + /// + [DataField, AutoNetworkedField] + public int MaxHitQuantity = 1; + + /// + /// The tracked amount of hits in a single throw. + /// + [DataField, AutoNetworkedField] + public int HitQuantity = 0; + + /// + /// The multiplier to apply to the entity's light attack damage to calculate the throwing damage. + /// Only used if this component has a MeleeWeaponComponent and Damage is not set on the prototype. + /// + [DataField, AutoNetworkedField] + public float MeleeDamageMultiplier = 1f; + + /// + /// The sound to play when this entity hits on a throw. + /// If null, attempts to retrieve the SoundHit from MeleeWeaponComponent. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier? SoundHit; + + /// + /// Arguments for modifying the throwing weapon damage with contests. + /// These are the same ContestArgs in MeleeWeaponComponent. + /// + [DataField] + public ContestArgs ContestArgs = new ContestArgs + { + DoStaminaInteraction = true, + StaminaDisadvantage = true, + DoHealthInteraction = true, + }; + + /// + /// Plays if no damage is done to the target entity. + /// If null, attempts to retrieve the SoundNoDamage from MeleeWeaponComponent. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier SoundNoDamage { get; set; } = new SoundCollectionSpecifier("WeakHit"); +} diff --git a/Content.Shared/Damage/Components/DamageOtherOnHitImmuneComponent.cs b/Content.Shared/Damage/Components/DamageOtherOnHitImmuneComponent.cs new file mode 100644 index 0000000000..2be4886fbd --- /dev/null +++ b/Content.Shared/Damage/Components/DamageOtherOnHitImmuneComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Damage.Components; + +/// +/// This is used for entities that are immune to getting hit by DamageOtherOnHit, and getting embedded from EmbeddableProjectile. +/// +[RegisterComponent] +public sealed partial class DamageOtherOnHitImmuneComponent : Component {} diff --git a/Content.Shared/Damage/Events/DamageOtherOnHitEvents.cs b/Content.Shared/Damage/Events/DamageOtherOnHitEvents.cs new file mode 100644 index 0000000000..512546fda5 --- /dev/null +++ b/Content.Shared/Damage/Events/DamageOtherOnHitEvents.cs @@ -0,0 +1,21 @@ +using Content.Shared.Damage; +using Content.Shared.Damage.Components; +using Content.Shared.Item.ItemToggle.Components; + +namespace Content.Shared.Damage.Events; + +/// +/// Raised on a throwing weapon to calculate potential damage bonuses or decreases. +/// +[ByRefEvent] +public record struct GetThrowingDamageEvent(EntityUid Weapon, DamageSpecifier Damage, List Modifiers, EntityUid? User); + +/// +/// Raised on a throwing weapon when DamageOtherOnHit has been successfully initialized. +/// +public record struct DamageOtherOnHitStartupEvent(Entity Weapon); + +/// +/// Raised on a throwing weapon when ItemToggleDamageOtherOnHit has been successfully initialized. +/// +public record struct ItemToggleDamageOtherOnHitStartupEvent(Entity Weapon); diff --git a/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs b/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs new file mode 100644 index 0000000000..8b3d29d734 --- /dev/null +++ b/Content.Shared/Damage/Systems/SharedDamageOtherOnHitSystem.cs @@ -0,0 +1,201 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Camera; +using Content.Shared.Contests; +using Content.Shared.Damage; +using Content.Shared.Damage.Components; +using Content.Shared.Damage.Events; +using Content.Shared.Database; +using Content.Shared.Effects; +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Mobs.Components; +using Content.Shared.Projectiles; +using Content.Shared.Popups; +using Content.Shared.Throwing; +using Content.Shared.Weapons.Melee; +using Robust.Shared.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Damage.Systems +{ + public abstract partial class SharedDamageOtherOnHitSystem : EntitySystem + { + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly SharedCameraRecoilSystem _sharedCameraRecoil = default!; + [Dependency] private readonly SharedColorFlashEffectSystem _color = default!; + [Dependency] private readonly ThrownItemSystem _thrownItem = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly ContestsSystem _contests = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnDoHit); + SubscribeLocalEvent(OnThrown); + + SubscribeLocalEvent(OnItemToggleMapInit); + SubscribeLocalEvent(OnItemToggle); + } + + /// + /// Inherit stats from MeleeWeapon. + /// + private void OnMapInit(EntityUid uid, DamageOtherOnHitComponent component, MapInitEvent args) + { + if (!TryComp(uid, out var melee)) + return; + + if (component.Damage.Empty) + component.Damage = melee.Damage * component.MeleeDamageMultiplier; + if (component.SoundHit == null) + component.SoundHit = melee.SoundHit; + if (component.SoundNoDamage == null) + { + if (melee.SoundNoDamage != null) + component.SoundNoDamage = melee.SoundNoDamage; + else + component.SoundNoDamage = new SoundCollectionSpecifier("WeakHit"); + } + + RaiseLocalEvent(uid, new DamageOtherOnHitStartupEvent((uid, component))); + } + + /// + /// Inherit stats from ItemToggleMeleeWeaponComponent. + /// + private void OnItemToggleMapInit(EntityUid uid, ItemToggleDamageOtherOnHitComponent component, MapInitEvent args) + { + if (!TryComp(uid, out var itemToggleMelee) || + !TryComp(uid, out var damage)) + return; + + if (component.ActivatedDamage == null && itemToggleMelee.ActivatedDamage is {} activatedDamage) + component.ActivatedDamage = activatedDamage * damage.MeleeDamageMultiplier; + if (component.ActivatedSoundHit == null) + component.ActivatedSoundHit = itemToggleMelee.ActivatedSoundOnHit; + if (component.ActivatedSoundNoDamage == null && itemToggleMelee.ActivatedSoundOnHitNoDamage is {} activatedSoundOnHitNoDamage) + component.ActivatedSoundNoDamage = activatedSoundOnHitNoDamage; + + RaiseLocalEvent(uid, new ItemToggleDamageOtherOnHitStartupEvent((uid, component))); + } + + private void OnDoHit(EntityUid uid, DamageOtherOnHitComponent component, ThrowDoHitEvent args) + { + if (component.HitQuantity >= component.MaxHitQuantity) + return; + + var modifiedDamage = _damageable.TryChangeDamage(args.Target, GetDamage(uid, component, args.Component.Thrower), + component.IgnoreResistances, origin: args.Component.Thrower, targetPart: args.TargetPart); + + // Log damage only for mobs. Useful for when people throw spears at each other, but also avoids log-spam when explosions send glass shards flying. + if (modifiedDamage != null) + { + if (HasComp(args.Target)) + _adminLogger.Add(LogType.ThrowHit, $"{ToPrettyString(args.Target):target} received {modifiedDamage.GetTotal():damage} damage from collision"); + + _meleeSound.PlayHitSound(args.Target, null, SharedMeleeWeaponSystem.GetHighestDamageSound(modifiedDamage, _protoManager), null, + component.SoundHit, component.SoundNoDamage); + } + + if (modifiedDamage is { Empty: false }) + _color.RaiseEffect(Color.Red, new List() { args.Target }, Filter.Pvs(args.Target, entityManager: EntityManager)); + + if (TryComp(uid, out var body) && body.LinearVelocity.LengthSquared() > 0f) + { + var direction = body.LinearVelocity.Normalized(); + _sharedCameraRecoil.KickCamera(args.Target, direction); + } + + // TODO: If more stuff touches this then handle it after. + if (TryComp(uid, out var physics)) + { + _thrownItem.LandComponent(args.Thrown, args.Component, physics, false); + + if (!HasComp(args.Thrown)) + { + var newVelocity = physics.LinearVelocity; + newVelocity.X = -newVelocity.X / 4; + newVelocity.Y = -newVelocity.Y / 4; + _physics.SetLinearVelocity(uid, newVelocity, body: physics); + } + } + + component.HitQuantity += 1; + } + + /// + /// Used to update the DamageOtherOnHit component on item toggle. + /// + private void OnItemToggle(EntityUid uid, DamageOtherOnHitComponent component, ItemToggledEvent args) + { + if (!TryComp(uid, out var itemToggle)) + return; + + if (args.Activated) + { + if (itemToggle.ActivatedDamage is {} activatedDamage) + { + itemToggle.DeactivatedDamage ??= component.Damage; + component.Damage = activatedDamage * component.MeleeDamageMultiplier; + } + + if (itemToggle.ActivatedStaminaCost is {} activatedStaminaCost) + { + itemToggle.DeactivatedStaminaCost ??= component.StaminaCost; + component.StaminaCost = activatedStaminaCost; + } + + itemToggle.DeactivatedSoundHit ??= component.SoundHit; + component.SoundHit = itemToggle.ActivatedSoundHit; + + if (itemToggle.ActivatedSoundNoDamage is {} activatedSoundNoDamage) + { + itemToggle.DeactivatedSoundNoDamage ??= component.SoundNoDamage; + component.SoundNoDamage = activatedSoundNoDamage; + } + } + else + { + if (itemToggle.DeactivatedDamage is {} deactivatedDamage) + component.Damage = deactivatedDamage; + + if (itemToggle.DeactivatedStaminaCost is {} deactivatedStaminaCost) + component.StaminaCost = deactivatedStaminaCost; + + component.SoundHit = itemToggle.DeactivatedSoundHit; + + if (itemToggle.DeactivatedSoundNoDamage is {} deactivatedSoundNoDamage) + component.SoundNoDamage = deactivatedSoundNoDamage; + } + } + + private void OnThrown(EntityUid uid, DamageOtherOnHitComponent component, ThrownEvent args) + { + component.HitQuantity = 0; + } + + /// + /// Gets the total damage a throwing weapon does. + /// + public DamageSpecifier GetDamage(EntityUid uid, DamageOtherOnHitComponent? component = null, EntityUid? user = null) + { + if (!Resolve(uid, ref component, false)) + return new DamageSpecifier(); + + var ev = new GetThrowingDamageEvent(uid, component.Damage, new(), user); + RaiseLocalEvent(uid, ref ev); + + if (component.ContestArgs is not null && user is EntityUid userUid) + ev.Damage *= _contests.ContestConstructor(userUid, component.ContestArgs); + + return DamageSpecifier.ApplyModifierSets(ev.Damage, ev.Modifiers); + } + } +} diff --git a/Content.Shared/Emoting/AnimatedEmotesComponent.cs b/Content.Shared/Emoting/AnimatedEmotesComponent.cs new file mode 100644 index 0000000000..fc8121bbe5 --- /dev/null +++ b/Content.Shared/Emoting/AnimatedEmotesComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared.Chat.Prototypes; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.Emoting; + +// use as a template +//[Serializable, NetSerializable, DataDefinition] public sealed partial class AnimationNameEmoteEvent : EntityEventArgs { } + +[Serializable, NetSerializable, DataDefinition] public sealed partial class AnimationFlipEmoteEvent : EntityEventArgs { } +[Serializable, NetSerializable, DataDefinition] public sealed partial class AnimationSpinEmoteEvent : EntityEventArgs { } +[Serializable, NetSerializable, DataDefinition] public sealed partial class AnimationJumpEmoteEvent : EntityEventArgs { } + +[RegisterComponent, NetworkedComponent] public sealed partial class AnimatedEmotesComponent : Component +{ + [DataField] public ProtoId? Emote; +} + +[Serializable, NetSerializable] public sealed partial class AnimatedEmotesComponentState : ComponentState +{ + public ProtoId? Emote; + + public AnimatedEmotesComponentState(ProtoId? emote) + { + Emote = emote; + } +} diff --git a/Content.Shared/Emoting/EmoteSystem.cs b/Content.Shared/Emoting/EmoteSystem.cs index 1e06d7e982..fea322e950 100644 --- a/Content.Shared/Emoting/EmoteSystem.cs +++ b/Content.Shared/Emoting/EmoteSystem.cs @@ -1,4 +1,4 @@ -namespace Content.Shared.Emoting; +namespace Content.Shared.Emoting; public sealed class EmoteSystem : EntitySystem { diff --git a/Content.Shared/Emoting/SharedAnimatedEmotesSystem.cs b/Content.Shared/Emoting/SharedAnimatedEmotesSystem.cs new file mode 100644 index 0000000000..b19e8c26a1 --- /dev/null +++ b/Content.Shared/Emoting/SharedAnimatedEmotesSystem.cs @@ -0,0 +1,18 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Emoting; + +public abstract class SharedAnimatedEmotesSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetState); + } + + private void OnGetState(Entity ent, ref ComponentGetState args) + { + args.State = new AnimatedEmotesComponentState(ent.Comp.Emote); + } +} diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 8d16a352f0..cc548fd4b1 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -1314,7 +1314,8 @@ public void DoContactInteraction(EntityUid uidA, EntityUid? uidB, HandledEntityE if (uidB == null || args?.Handled == false) return; - DebugTools.AssertNotEqual(uidA, uidB.Value); + if (uidA == uidB.Value) + return; if (!TryComp(uidA, out MetaDataComponent? metaA) || metaA.EntityPaused) return; diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleDamageOtherOnHitComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleDamageOtherOnHitComponent.cs new file mode 100644 index 0000000000..844582f6fa --- /dev/null +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleDamageOtherOnHitComponent.cs @@ -0,0 +1,60 @@ +using Content.Shared.Damage.Systems; +using Content.Shared.Damage; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Item.ItemToggle.Components; + +/// +/// Handles changes to DamageOtherOnHitComponent when the item is toggled. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ItemToggleDamageOtherOnHitComponent : Component +{ + /// + /// The stamina cost of throwing this entity when activated. + /// + [DataField, AutoNetworkedField] + public float? ActivatedStaminaCost = null; + + /// + /// The stamina cost of throwing this entity when deactivated. + /// + [DataField, AutoNetworkedField] + public float? DeactivatedStaminaCost = null; + + /// + /// Damage done by this item when activated. + /// + [DataField, AutoNetworkedField] + public DamageSpecifier? ActivatedDamage = null; + + /// + /// Damage done by this item when deactivated. + /// + [DataField, AutoNetworkedField] + public DamageSpecifier? DeactivatedDamage = null; + + /// + /// The noise this item makes when hitting something with it on. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier? ActivatedSoundHit; + + /// + /// The noise this item makes when hitting something with it off. + /// + public SoundSpecifier? DeactivatedSoundHit; + + /// + /// The noise this item makes when hitting something with it off and it does no damage. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier ActivatedSoundNoDamage { get; set; } = new SoundCollectionSpecifier("WeakHit"); + + /// + /// The noise this item makes when hitting something with it off and it does no damage. + /// + public SoundSpecifier? DeactivatedSoundNoDamage; +} diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleEmbedPassiveDamageComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleEmbedPassiveDamageComponent.cs new file mode 100644 index 0000000000..76ecbec360 --- /dev/null +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleEmbedPassiveDamageComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Damage; +using Robust.Shared.GameStates; + +namespace Content.Shared.Item.ItemToggle.Components; + +/// +/// Handles the changes to the embed passive damage when toggled. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ItemToggleEmbedPassiveDamageComponent : Component +{ + /// + /// Damage per interval dealt to the entity every interval when activated. + /// + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public DamageSpecifier? ActivatedDamage = null; + + /// + /// Damage per interval dealt to the entity every interval when deactivated. + /// + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public DamageSpecifier? DeactivatedDamage = null; +} diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleEmbeddableProjectileComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleEmbeddableProjectileComponent.cs new file mode 100644 index 0000000000..bd8f68402d --- /dev/null +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleEmbeddableProjectileComponent.cs @@ -0,0 +1,60 @@ +using System.Numerics; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Item.ItemToggle.Components; + +/// +/// Handles the embeddable stats for activated items. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ItemToggleEmbeddableProjectileComponent : Component +{ + /// + /// The removal time when this item is activated. + /// + [DataField, AutoNetworkedField] + public float? ActivatedRemovalTime; + + /// + /// The offset of the sprite when this item is activated. + /// + [DataField, AutoNetworkedField] + public Vector2? ActivatedOffset; + + /// + /// Whether this entity will embed when thrown when this item is activated. + /// + [DataField, AutoNetworkedField] + public bool? ActivatedEmbedOnThrow; + + /// + /// The sound to play after embedding when this item is activated. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier? ActivatedSound; + + /// + /// The removal time when this item is deactivated. + /// + [DataField, AutoNetworkedField] + public float? DeactivatedRemovalTime; + + /// + /// The offset of the sprite when this item is deactivated. + /// + [DataField, AutoNetworkedField] + public Vector2? DeactivatedOffset; + + /// + /// Whether this entity will embed when thrown when this item is deactivated. + /// + [DataField, AutoNetworkedField] + public bool? DeactivatedEmbedOnThrow; + + /// + /// The sound to play after embedding when this item is deactivated. + /// + [DataField, AutoNetworkedField] + public SoundSpecifier? DeactivatedSound; +} diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleThrowingAngleComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleThrowingAngleComponent.cs new file mode 100644 index 0000000000..38590621c3 --- /dev/null +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleThrowingAngleComponent.cs @@ -0,0 +1,41 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Item.ItemToggle.Components; + +/// +/// Handles the changes to the throwing angle when the item is toggled. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ItemToggleThrowingAngleComponent : Component +{ + /// + /// Item's throwing spin status when activated. + /// + [DataField, AutoNetworkedField] + public bool? ActivatedAngularVelocity = null; + + /// + /// Item's angle when activated. + /// + [DataField, AutoNetworkedField] + public Angle? ActivatedAngle = null; + + /// + /// Item's throwing spin status when deactivated. + /// + [DataField, AutoNetworkedField] + public bool? DeactivatedAngularVelocity = null; + + /// + /// Item's angle when deactivated. + /// + [DataField, AutoNetworkedField] + public Angle? DeactivatedAngle = null; + + /// + /// When this is true, adds the ThrowingAngle component on activation + /// and deletes it on deactivation. + /// + [DataField, AutoNetworkedField] + public bool DeleteOnDeactivate = false; +} diff --git a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs index fa23339223..d07fd5a735 100644 --- a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs +++ b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs @@ -1,12 +1,15 @@ using Content.Shared.Interaction.Events; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Popups; +using Content.Shared.Projectiles; using Content.Shared.Temperature; +using Content.Shared.Throwing; using Content.Shared.Toggleable; using Content.Shared.Wieldable; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Network; +using System.Numerics; namespace Content.Shared.Item.ItemToggle; /// @@ -35,6 +38,8 @@ public override void Initialize() SubscribeLocalEvent(OnIsHotEvent); SubscribeLocalEvent(UpdateActiveSound); + SubscribeLocalEvent(UpdateThrowingAngle); + SubscribeLocalEvent(UpdateEmbeddableProjectile); } private void OnStartup(Entity ent, ref ComponentStartup args) @@ -268,4 +273,93 @@ private void UpdateActiveSound(EntityUid uid, ItemToggleActiveSoundComponent act activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream); } } + + /// + /// Used to update the throwing angle on item toggle. + /// + private void UpdateThrowingAngle(EntityUid uid, ItemToggleThrowingAngleComponent component, ItemToggledEvent args) + { + if (component.DeleteOnDeactivate) + { + if (args.Activated) + { + var newThrowingAngle = new ThrowingAngleComponent(); + + if (component.ActivatedAngle is {} activatedAngle) + newThrowingAngle.Angle = activatedAngle; + + if (component.ActivatedAngularVelocity is {} activatedAngularVelocity) + newThrowingAngle.AngularVelocity = activatedAngularVelocity; + + AddComp(uid, newThrowingAngle); + } + else + RemCompDeferred(uid); + return; + } + + if (!TryComp(uid, out var throwingAngle)) + return; + + if (args.Activated) + { + component.DeactivatedAngle ??= throwingAngle.Angle; + if (component.ActivatedAngle is {} activatedAngle) + throwingAngle.Angle = activatedAngle; + + component.DeactivatedAngularVelocity ??= throwingAngle.AngularVelocity; + if (component.ActivatedAngularVelocity is {} activatedAngularVelocity) + throwingAngle.AngularVelocity = activatedAngularVelocity; + } + else + { + if (component.DeactivatedAngle is {} deactivatedAngle) + throwingAngle.Angle = deactivatedAngle; + + if (component.DeactivatedAngularVelocity is {} deactivatedAngularVelocity) + throwingAngle.AngularVelocity = deactivatedAngularVelocity; + } + } + + /// + /// Used to update the embeddable stats on item toggle. + /// + private void UpdateEmbeddableProjectile(EntityUid uid, ItemToggleEmbeddableProjectileComponent component, ItemToggledEvent args) + { + if (!TryComp(uid, out var embeddable)) + return; + + if (args.Activated) + { + component.DeactivatedRemovalTime ??= embeddable.RemovalTime; + if (component.ActivatedRemovalTime is {} activatedRemovalTime) + embeddable.RemovalTime = activatedRemovalTime; + + component.DeactivatedOffset ??= embeddable.Offset; + if (component.ActivatedOffset is {} activatedOffset) + embeddable.Offset = activatedOffset; + + component.DeactivatedEmbedOnThrow ??= embeddable.EmbedOnThrow; + if (component.ActivatedEmbedOnThrow is {} activatedEmbedOnThrow) + embeddable.EmbedOnThrow = activatedEmbedOnThrow; + + component.DeactivatedSound ??= embeddable.Sound; + if (component.ActivatedSound is {} activatedSound) + embeddable.Sound = activatedSound; + } + else + { + if (component.DeactivatedRemovalTime is {} deactivatedRemovalTime) + embeddable.RemovalTime = deactivatedRemovalTime; + + if (component.DeactivatedOffset is {} deactivatedOffset) + embeddable.Offset = deactivatedOffset; + + if (component.DeactivatedEmbedOnThrow is {} deactivatedEmbedOnThrow) + embeddable.EmbedOnThrow = deactivatedEmbedOnThrow; + + if (component.DeactivatedSound is {} deactivatedSound) + embeddable.Sound = deactivatedSound; + } + } } diff --git a/Content.Shared/ListViewSelector/ListViewSelectorEntry.cs b/Content.Shared/ListViewSelector/ListViewSelectorEntry.cs index 1c97108277..f34e9e3924 100644 --- a/Content.Shared/ListViewSelector/ListViewSelectorEntry.cs +++ b/Content.Shared/ListViewSelector/ListViewSelectorEntry.cs @@ -14,10 +14,10 @@ public enum ListViewSelectorUiKey [Serializable, NetSerializable] public sealed class ListViewSelectorState( List items, - Dictionary metaData = default!) : BoundUserInterfaceState + Dictionary? metaData = null) : BoundUserInterfaceState { public List Items { get; } = items; - public Dictionary MetaData = metaData; + public Dictionary MetaData = metaData ?? new(); } [Serializable, NetSerializable] diff --git a/Content.Shared/Magic/Events/ProjectileSpellEvent.cs b/Content.Shared/Magic/Events/ProjectileSpellEvent.cs index cf338a6bb4..439b09e7af 100644 --- a/Content.Shared/Magic/Events/ProjectileSpellEvent.cs +++ b/Content.Shared/Magic/Events/ProjectileSpellEvent.cs @@ -12,6 +12,9 @@ public sealed partial class ProjectileSpellEvent : WorldTargetActionEvent, ISpea [DataField(required: true)] public EntProtoId Prototype; + [DataField] + public float ProjectileSpeed = 20; + [DataField] public string? Speech { get; private set; } diff --git a/Content.Shared/Magic/SharedMagicSystem.cs b/Content.Shared/Magic/SharedMagicSystem.cs index b0a9fef75d..cae581298a 100644 --- a/Content.Shared/Magic/SharedMagicSystem.cs +++ b/Content.Shared/Magic/SharedMagicSystem.cs @@ -344,7 +344,7 @@ private void OnProjectileSpell(ProjectileSpellEvent ev) var ent = Spawn(ev.Prototype, spawnCoords); var direction = toCoords.ToMapPos(EntityManager, _transform) - spawnCoords.ToMapPos(EntityManager, _transform); - _gunSystem.ShootProjectile(ent, direction, userVelocity, ev.Performer, ev.Performer); + _gunSystem.ShootProjectile(ent, direction, userVelocity, ev.Performer, ev.Performer, ev.ProjectileSpeed); } // End Projectile Spells #endregion diff --git a/Content.Shared/Projectiles/EmbedEvent.cs b/Content.Shared/Projectiles/EmbedEvent.cs index 521a691f45..9d47a815d3 100644 --- a/Content.Shared/Projectiles/EmbedEvent.cs +++ b/Content.Shared/Projectiles/EmbedEvent.cs @@ -1,10 +1,12 @@ +using Content.Shared.Targeting; + namespace Content.Shared.Projectiles; /// /// Raised directed on an entity when it embeds in another entity. /// [ByRefEvent] -public readonly record struct EmbedEvent(EntityUid? Shooter, EntityUid Embedded) +public readonly record struct EmbedEvent(EntityUid? Shooter, EntityUid Embedded, TargetBodyPart? BodyPart) { public readonly EntityUid? Shooter = Shooter; @@ -12,4 +14,18 @@ public readonly record struct EmbedEvent(EntityUid? Shooter, EntityUid Embedded) /// Entity that is embedded in. /// public readonly EntityUid Embedded = Embedded; + + /// + /// Body part that has the embedded entity. + /// + public readonly TargetBodyPart? BodyPart = BodyPart; +} + +/// +/// Raised on an entity when it stops embedding in another entity. +/// +[ByRefEvent] +public readonly record struct RemoveEmbedEvent(EntityUid? Remover) +{ + public readonly EntityUid? Remover = Remover; } diff --git a/Content.Shared/Projectiles/EmbedPassiveDamageComponent.cs b/Content.Shared/Projectiles/EmbedPassiveDamageComponent.cs new file mode 100644 index 0000000000..cfb08fcf7b --- /dev/null +++ b/Content.Shared/Projectiles/EmbedPassiveDamageComponent.cs @@ -0,0 +1,57 @@ +using Content.Shared.Damage; +using Content.Shared.Damage.Components; +using Content.Shared.FixedPoint; +using Content.Shared.Mobs.Components; +using Content.Shared.Targeting; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.GameStates; + +namespace Content.Shared.Projectiles; + +/// +/// Passively damages the mob this embeddable is attached to. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class EmbedPassiveDamageComponent : Component +{ + /// + /// The entity this embeddable is attached to. + /// + [ViewVariables(VVAccess.ReadWrite)] + public EntityUid? Embedded = null; + + /// + /// The damage component to deal damage to. + /// + [ViewVariables(VVAccess.ReadOnly)] + public DamageableComponent? EmbeddedDamageable = null; + + /// + /// The MobState component to check if the target is still alive. + /// + [ViewVariables(VVAccess.ReadOnly)] + public MobStateComponent? EmbeddedMobState = null; + + /// + /// The body part to apply damage to. + /// + [ViewVariables(VVAccess.ReadOnly)] + public TargetBodyPart? EmbeddedBodyPart = null; + + /// + /// Damage per interval dealt to the entity every interval. + /// If this is set manually, DamageMultiplier will be ignored. + /// + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public DamageSpecifier Damage = new(); + + /// + /// Multiplier to be applied to the damage of DamageOtherOnHit to + /// calculate the damage per second. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public float ThrowingDamageMultiplier = 0.05f; + + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan NextDamage = TimeSpan.Zero; +} diff --git a/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs b/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs new file mode 100644 index 0000000000..55733ac5bb --- /dev/null +++ b/Content.Shared/Projectiles/EmbedPassiveDamageSystem.cs @@ -0,0 +1,115 @@ +using Content.Shared.Damage; +using Content.Shared.Damage.Components; +using Content.Shared.Damage.Events; +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Systems; +using Content.Shared.Mobs.Components; +using Content.Shared.FixedPoint; +using Robust.Shared.Timing; + +namespace Content.Shared.Projectiles; + +public sealed class EmbedPassiveDamageSystem : EntitySystem +{ + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDamageOtherOnHitStartup); + SubscribeLocalEvent(OnItemToggleStartup); + SubscribeLocalEvent(OnEmbed); + SubscribeLocalEvent(OnRemoveEmbed); + SubscribeLocalEvent(OnItemToggle); + } + + /// + /// Inherit stats from DamageOtherOnHit. + /// + private void OnDamageOtherOnHitStartup(EntityUid uid, EmbedPassiveDamageComponent component, DamageOtherOnHitStartupEvent args) + { + if (component.Damage.Empty) + component.Damage = args.Weapon.Comp.Damage * component.ThrowingDamageMultiplier; + } + + /// + /// Inherit stats from ItemToggleDamageOtherOnHit. + /// + private void OnItemToggleStartup(EntityUid uid, ItemToggleEmbedPassiveDamageComponent component, ItemToggleDamageOtherOnHitStartupEvent args) + { + if (!TryComp(uid, out var embedPassiveDamage) || + component.ActivatedDamage != null || + !(args.Weapon.Comp.ActivatedDamage is {} activatedDamage)) + return; + + component.ActivatedDamage = activatedDamage * embedPassiveDamage.ThrowingDamageMultiplier; + } + + private void OnEmbed(EntityUid uid, EmbedPassiveDamageComponent component, EmbedEvent args) + { + if (component.Damage.Empty || component.Damage.GetTotal() == 0 || + !TryComp(args.Embedded, out var mobState) || + !TryComp(args.Embedded, out var damageable)) + return; + + component.Embedded = args.Embedded; + component.EmbeddedDamageable = damageable; + component.EmbeddedMobState = mobState; + component.EmbeddedBodyPart = args.BodyPart; + component.NextDamage = _timing.CurTime + TimeSpan.FromSeconds(1f); + + Dirty(uid, component); + } + + private void OnRemoveEmbed(EntityUid uid, EmbedPassiveDamageComponent component, RemoveEmbedEvent args) + { + component.Embedded = null; + component.EmbeddedDamageable = null; + component.EmbeddedMobState = null; + component.EmbeddedBodyPart = null; + component.NextDamage = TimeSpan.Zero; + + Dirty(uid, component); + } + + /// + /// Used to update the EmbedPassiveDamageComponent component on item toggle. + /// + private void OnItemToggle(EntityUid uid, EmbedPassiveDamageComponent component, ItemToggledEvent args) + { + if (!TryComp(uid, out var itemTogglePassiveDamage)) + return; + + if (args.Activated && itemTogglePassiveDamage.ActivatedDamage is {} activatedDamage) + { + itemTogglePassiveDamage.DeactivatedDamage ??= component.Damage; + component.Damage = activatedDamage; + } + else if (itemTogglePassiveDamage.DeactivatedDamage is {} deactivatedDamage) + component.Damage = deactivatedDamage; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + var curTime = _timing.CurTime; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (comp.Embedded is null || + comp.EmbeddedDamageable is null || + comp.NextDamage > curTime || // Make sure they're up for a damage tick + comp.EmbeddedMobState is null || + comp.EmbeddedMobState.CurrentState == MobState.Dead) // Don't damage dead mobs, they've already gone through too much + continue; + + comp.NextDamage = curTime + TimeSpan.FromSeconds(1f); + + _damageable.TryChangeDamage(comp.Embedded, comp.Damage, false, false, comp.EmbeddedDamageable, targetPart: comp.EmbeddedBodyPart); + } + } +} diff --git a/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs b/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs index 008b7c2ced..2a0dc1b1da 100644 --- a/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs +++ b/Content.Shared/Projectiles/EmbeddableProjectileComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Targeting; using System.Numerics; using Robust.Shared.Audio; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.GameStates; namespace Content.Shared.Projectiles; @@ -27,7 +29,7 @@ public sealed partial class EmbeddableProjectileComponent : Component /// How long it takes to remove the embedded object. /// [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] - public float? RemovalTime = 3f; + public float? RemovalTime = 5f; /// /// Whether this entity will embed when thrown, or only when shot as a projectile. @@ -46,4 +48,28 @@ public sealed partial class EmbeddableProjectileComponent : Component /// [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public SoundSpecifier? Sound; + + /// + /// The entity this embeddable is attached to. + /// + [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public EntityUid? Target = null; + + /// + /// The body part of the target this embeddable is attached to. + /// + [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + public TargetBodyPart? TargetBodyPart = null; + + /// + /// How much time before this entity automatically falls off? (0 is never) + /// + [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + public float AutoRemoveDuration = 40f; + + /// + /// The time when this entity automatically falls off after being attached. + /// + [ViewVariables(VVAccess.ReadWrite), DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] + public TimeSpan? AutoRemoveTime = null; } diff --git a/Content.Shared/Projectiles/SharedProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs index 593ad221b8..960dab8461 100644 --- a/Content.Shared/Projectiles/SharedProjectileSystem.cs +++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs @@ -1,10 +1,15 @@ using System.Numerics; +using Content.Shared.Body.Systems; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage; using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.IdentityManagement; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Mobs.Components; +using Content.Shared.Popups; +using Content.Shared.Targeting; using Content.Shared.Throwing; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; @@ -15,6 +20,7 @@ using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Systems; using Robust.Shared.Serialization; +using Robust.Shared.Timing; namespace Content.Shared.Projectiles; @@ -28,6 +34,9 @@ public abstract partial class SharedProjectileSystem : EntitySystem [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedBodySystem _body = default!; public override void Initialize() { @@ -39,6 +48,27 @@ public override void Initialize() SubscribeLocalEvent(OnEmbedActivate); SubscribeLocalEvent(OnEmbedRemove); SubscribeLocalEvent(OnAttemptPacifiedThrow); + SubscribeLocalEvent(OnExamined); + } + + // TODO: rename Embedded to Target in every context + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + var curTime = _timing.CurTime; + + while (query.MoveNext(out var uid, out var comp)) + { + if (comp.AutoRemoveTime == null || comp.AutoRemoveTime > curTime) + continue; + + if (comp.Target is {} targetUid) + _popup.PopupClient(Loc.GetString("throwing-embed-falloff", ("item", uid)), targetUid, targetUid); + + RemoveEmbed(uid, comp); + } } private void OnEmbedActivate(EntityUid uid, EmbeddableProjectileComponent component, ActivateInWorldEvent args) @@ -52,17 +82,39 @@ private void OnEmbedActivate(EntityUid uid, EmbeddableProjectileComponent compon args.Handled = true; + if (component.Target is {} targetUid) + _popup.PopupClient(Loc.GetString("throwing-embed-remove-alert-owner", ("item", uid), ("other", args.User)), + args.User, targetUid); + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.RemovalTime.Value, new RemoveEmbeddedProjectileEvent(), eventTarget: uid, target: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, + BreakOnUserMove = true, + BreakOnTargetMove = true, + NeedHand = true, }); } private void OnEmbedRemove(EntityUid uid, EmbeddableProjectileComponent component, RemoveEmbeddedProjectileEvent args) { + if (args.Cancelled) + return; + + RemoveEmbed(uid, component, args.User); + } + + private void RemoveEmbed(EntityUid uid, EmbeddableProjectileComponent component, EntityUid? remover = null) + { + component.AutoRemoveTime = null; + component.Target = null; + component.TargetBodyPart = null; + + var ev = new RemoveEmbedEvent(remover); + RaiseLocalEvent(uid, ref ev); + // Whacky prediction issues. - if (args.Cancelled || _netManager.IsClient) + if (_netManager.IsClient) return; if (component.DeleteOnRemove) @@ -85,20 +137,22 @@ private void OnEmbedRemove(EntityUid uid, EmbeddableProjectileComponent componen } // Land it just coz uhhh yeah - var landEv = new LandEvent(args.User, true); + var landEv = new LandEvent(remover, true); RaiseLocalEvent(uid, ref landEv); _physics.WakeBody(uid, body: physics); // try place it in the user's hand - _hands.TryPickupAnyHand(args.User, uid); + if (remover is {} removerUid) + _hands.TryPickupAnyHand(removerUid, uid); } private void OnEmbedThrowDoHit(EntityUid uid, EmbeddableProjectileComponent component, ThrowDoHitEvent args) { - if (!component.EmbedOnThrow) + if (!component.EmbedOnThrow || + HasComp(args.Target)) return; - Embed(uid, args.Target, null, component); + Embed(uid, args.Target, null, component, args.TargetPart); } private void OnEmbedProjectileHit(EntityUid uid, EmbeddableProjectileComponent component, ref ProjectileHitEvent args) @@ -113,7 +167,7 @@ private void OnEmbedProjectileHit(EntityUid uid, EmbeddableProjectileComponent c } } - private void Embed(EntityUid uid, EntityUid target, EntityUid? user, EmbeddableProjectileComponent component) + private void Embed(EntityUid uid, EntityUid target, EntityUid? user, EmbeddableProjectileComponent component, TargetBodyPart? targetPart = null) { TryComp(uid, out var physics); _physics.SetLinearVelocity(uid, Vector2.Zero, body: physics); @@ -128,8 +182,17 @@ private void Embed(EntityUid uid, EntityUid target, EntityUid? user, EmbeddableP } _audio.PlayPredicted(component.Sound, uid, null); - var ev = new EmbedEvent(user, target); + + component.TargetBodyPart = targetPart; + var ev = new EmbedEvent(user, target, targetPart); RaiseLocalEvent(uid, ref ev); + + if (component.AutoRemoveDuration != 0) + component.AutoRemoveTime = _timing.CurTime + TimeSpan.FromSeconds(component.AutoRemoveDuration); + + component.Target = target; + + Dirty(uid, component); } private void PreventCollision(EntityUid uid, ProjectileComponent component, ref PreventCollideEvent args) @@ -149,12 +212,6 @@ public void SetShooter(EntityUid id, ProjectileComponent component, EntityUid sh Dirty(id, component); } - [Serializable, NetSerializable] - private sealed partial class RemoveEmbeddedProjectileEvent : DoAfterEvent - { - public override DoAfterEvent Clone() => this; - } - /// /// Prevent players with the Pacified status effect from throwing embeddable projectiles. /// @@ -162,6 +219,31 @@ private void OnAttemptPacifiedThrow(Entity ent, r { args.Cancel("pacified-cannot-throw-embed"); } + + private void OnExamined(EntityUid uid, EmbeddableProjectileComponent component, ExaminedEvent args) + { + if (!(component.Target is {} target)) + return; + + var targetIdentity = Identity.Entity(target, EntityManager); + + var loc = component.TargetBodyPart == null + ? Loc.GetString("throwing-examine-embedded", + ("embedded", uid), + ("target", targetIdentity)) + : Loc.GetString("throwing-examine-embedded-part", + ("embedded", uid), + ("target", targetIdentity), + ("targetPart", Loc.GetString($"body-part-{component.TargetBodyPart.ToString()}"))); + + args.PushMarkup(loc); + } + + [Serializable, NetSerializable] + private sealed partial class RemoveEmbeddedProjectileEvent : DoAfterEvent + { + public override DoAfterEvent Clone() => this; + } } [Serializable, NetSerializable] diff --git a/Content.Shared/Throwing/BeforeThrowEvent.cs b/Content.Shared/Throwing/BeforeThrowEvent.cs index 36e7dd758b..f949c16b0e 100644 --- a/Content.Shared/Throwing/BeforeThrowEvent.cs +++ b/Content.Shared/Throwing/BeforeThrowEvent.cs @@ -20,3 +20,22 @@ public BeforeThrowEvent(EntityUid itemUid, Vector2 direction, float throwStrengt public bool Cancelled = false; } + +[ByRefEvent] +public struct BeforeGettingThrownEvent +{ + public BeforeGettingThrownEvent(EntityUid itemUid, Vector2 direction, float throwStrength, EntityUid playerUid) + { + ItemUid = itemUid; + Direction = direction; + ThrowStrength = throwStrength; + PlayerUid = playerUid; + } + + public EntityUid ItemUid { get; set; } + public Vector2 Direction { get; } + public float ThrowStrength { get; set;} + public EntityUid PlayerUid { get; } + + public bool Cancelled = false; +} diff --git a/Content.Shared/Throwing/ThrowEvents.cs b/Content.Shared/Throwing/ThrowEvents.cs index 5ea78b862e..ea13a7dbe4 100644 --- a/Content.Shared/Throwing/ThrowEvents.cs +++ b/Content.Shared/Throwing/ThrowEvents.cs @@ -1,3 +1,5 @@ +using Content.Shared.Targeting; + namespace Content.Shared.Throwing { /// @@ -10,17 +12,19 @@ public abstract class ThrowEvent : HandledEntityEventArgs /// The entity that threw . /// public EntityUid? User { get; } - // End Nyano code. + // End Nyano code. public readonly EntityUid Thrown; public readonly EntityUid Target; public ThrownItemComponent Component; + public TargetBodyPart? TargetPart; - public ThrowEvent(EntityUid? user, EntityUid thrown, EntityUid target, ThrownItemComponent component) //Nyano - Summary: User added. + public ThrowEvent(EntityUid? user, EntityUid thrown, EntityUid target, ThrownItemComponent component, TargetBodyPart? targetPart) //Nyano - Summary: User added. { User = user; //Nyano - Summary: User added. Thrown = thrown; Target = target; Component = component; + TargetPart = targetPart; } } @@ -29,7 +33,7 @@ public ThrowEvent(EntityUid? user, EntityUid thrown, EntityUid target, ThrownIte /// public sealed class ThrowHitByEvent : ThrowEvent { - public ThrowHitByEvent(EntityUid? user, EntityUid thrown, EntityUid target, ThrownItemComponent component) : base(user, thrown, target, component) //Nyano - Summary: User added. + public ThrowHitByEvent(EntityUid? user, EntityUid thrown, EntityUid target, ThrownItemComponent component, TargetBodyPart? targetPart) : base(user, thrown, target, component, targetPart) //Nyano - Summary: User added. { } } @@ -39,7 +43,7 @@ public ThrowHitByEvent(EntityUid? user, EntityUid thrown, EntityUid target, Thro /// public sealed class ThrowDoHitEvent : ThrowEvent { - public ThrowDoHitEvent(EntityUid thrown, EntityUid target, ThrownItemComponent component) : base(null, thrown, target, component) //Nyano - Summary: User added. + public ThrowDoHitEvent(EntityUid thrown, EntityUid target, ThrownItemComponent component, TargetBodyPart? targetPart) : base(null, thrown, target, component, targetPart) //Nyano - Summary: User added. { } } diff --git a/Content.Shared/Throwing/ThrownItemImmuneComponent.cs b/Content.Shared/Throwing/ThrownItemImmuneComponent.cs new file mode 100644 index 0000000000..f2bbd29535 --- /dev/null +++ b/Content.Shared/Throwing/ThrownItemImmuneComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Throwing +{ + /// + /// This is used for entities that are immune to getting hit by thrown items. + /// + [RegisterComponent] + public sealed partial class ThrownItemImmuneComponent : Component + { + } +} diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index ef28db2672..f607a2dc93 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Shared.Administration.Logs; +using Content.Shared.Body.Systems; using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Physics; @@ -23,6 +24,7 @@ public sealed class ThrownItemSystem : EntitySystem [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedBodySystem _body = default!; private const string ThrowingFixture = "throw-fixture"; @@ -133,15 +135,20 @@ public void LandComponent(EntityUid uid, ThrownItemComponent thrownItem, Physics /// public void ThrowCollideInteraction(ThrownItemComponent component, EntityUid thrown, EntityUid target) { + if (HasComp(target)) + return; + if (component.Thrower is not null) _adminLogger.Add(LogType.ThrowHit, LogImpact.Low, $"{ToPrettyString(thrown):thrown} thrown by {ToPrettyString(component.Thrower.Value):thrower} hit {ToPrettyString(target):target}."); - if (component.Thrower is not null)// Nyano - Summary: Gotta check if there was a thrower. - RaiseLocalEvent(target, new ThrowHitByEvent(component.Thrower.Value, thrown, target, component), true); // Nyano - Summary: Gotta update for who threw it. + var targetPart = _body.GetRandomBodyPart(target); + + if (component.Thrower is not null)// Nyano - Summary: Gotta check if there was a thrower. + RaiseLocalEvent(target, new ThrowHitByEvent(component.Thrower.Value, thrown, target, component, targetPart), true); // Nyano - Summary: Gotta update for who threw it. else - RaiseLocalEvent(target, new ThrowHitByEvent(null, thrown, target, component), true); // Nyano - Summary: No thrower. - RaiseLocalEvent(thrown, new ThrowDoHitEvent(thrown, target, component), true); + RaiseLocalEvent(target, new ThrowHitByEvent(null, thrown, target, component, targetPart), true); // Nyano - Summary: No thrower. + RaiseLocalEvent(thrown, new ThrowDoHitEvent(thrown, target, component, targetPart), true); } public override void Update(float frameTime) diff --git a/Content.Shared/Tools/Components/ToolTileCompatibleComponent.cs b/Content.Shared/Tools/Components/ToolTileCompatibleComponent.cs index caac41a3de..272a39cfbc 100644 --- a/Content.Shared/Tools/Components/ToolTileCompatibleComponent.cs +++ b/Content.Shared/Tools/Components/ToolTileCompatibleComponent.cs @@ -18,7 +18,7 @@ public sealed partial class ToolTileCompatibleComponent : Component /// The time it takes to modify the tile. /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public TimeSpan Delay = TimeSpan.FromSeconds(1); + public TimeSpan Delay = TimeSpan.FromSeconds(0.5); /// /// Whether or not the tile being modified must be unobstructed diff --git a/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs index 85ecf151dd..97b88f559e 100644 --- a/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs +++ b/Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Traits.Assorted.Components; +using Content.Shared.Damage.Events; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Damage.Components; @@ -17,8 +18,10 @@ public override void Initialize() SubscribeLocalEvent(OnCritStartup); SubscribeLocalEvent(OnDeadStartup); SubscribeLocalEvent(OnStaminaCritStartup); - SubscribeLocalEvent(OnAdrenalineGetDamage); - SubscribeLocalEvent(OnPainToleranceGetDamage); + SubscribeLocalEvent(OnAdrenalineGetMeleeDamage); + SubscribeLocalEvent(OnAdrenalineGetThrowingDamage); + SubscribeLocalEvent(OnPainToleranceGetMeleeDamage); + SubscribeLocalEvent(OnPainToleranceGetThrowingDamage); } private void OnCritStartup(EntityUid uid, CritModifierComponent component, ComponentStartup args) @@ -49,15 +52,35 @@ private void OnStaminaCritStartup(EntityUid uid, StaminaCritModifierComponent co stamina.CritThreshold += component.CritThresholdModifier; } - private void OnAdrenalineGetDamage(EntityUid uid, AdrenalineComponent component, ref GetMeleeDamageEvent args) + private void OnAdrenalineGetMeleeDamage(EntityUid uid, AdrenalineComponent component, ref GetMeleeDamageEvent args) + { + args.Damage *= GetAdrenalineMultiplier(uid, component); + } + + private void OnAdrenalineGetThrowingDamage(EntityUid uid, AdrenalineComponent component, ref GetThrowingDamageEvent args) + { + args.Damage *= GetAdrenalineMultiplier(uid, component); + } + + private float GetAdrenalineMultiplier(EntityUid uid, AdrenalineComponent component) { var modifier = _contests.HealthContest(uid, component.BypassClamp, component.RangeModifier); - args.Damage *= component.Inverse ? 1 / modifier : modifier; + return component.Inverse ? 1 / modifier : modifier; + } + + private void OnPainToleranceGetMeleeDamage(EntityUid uid, PainToleranceComponent component, ref GetMeleeDamageEvent args) + { + args.Damage *= GetPainToleranceMultiplier(uid, component); + } + + private void OnPainToleranceGetThrowingDamage(EntityUid uid, PainToleranceComponent component, ref GetThrowingDamageEvent args) + { + args.Damage *= GetPainToleranceMultiplier(uid, component); } - private void OnPainToleranceGetDamage(EntityUid uid, PainToleranceComponent component, ref GetMeleeDamageEvent args) + private float GetPainToleranceMultiplier(EntityUid uid, PainToleranceComponent component) { var modifier = _contests.StaminaContest(uid, component.BypassClamp, component.RangeModifier); - args.Damage *= component.Inverse ? 1 / modifier : modifier; + return component.Inverse ? 1 / modifier : modifier; } } diff --git a/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs b/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs index 315d752a2c..6ec55a7884 100644 --- a/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs @@ -31,11 +31,8 @@ public void PlaySwingSound(EntityUid userUid, EntityUid weaponUid, MeleeWeaponCo /// /// Serves as a lookup key for a hit sound /// A sound can be supplied by the itself to override everything else - public void PlayHitSound(EntityUid targetUid, EntityUid? userUid, string? damageType, SoundSpecifier? hitSoundOverride, MeleeWeaponComponent weaponComponent) + public void PlayHitSound(EntityUid targetUid, EntityUid? userUid, string? damageType, SoundSpecifier? hitSoundOverride, SoundSpecifier? hitSound, SoundSpecifier? noDamageSound) { - var hitSound = weaponComponent.SoundHit; - var noDamageSound = weaponComponent.SoundNoDamage; - var playedSound = false; if (Deleted(targetUid)) diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 16847c3797..b698728193 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -41,6 +41,26 @@ public sealed partial class MeleeWeaponComponent : Component [DataField] public bool ResetOnHandSelected = true; + /// + /// If true, swaps the keybinds for light attacks and heavy attacks. + /// + [DataField] + public bool SwapKeys = false; + + /// + /// If true, disables heavy attacks for this weapon, and prevents the heavy damage values appearing + /// when the damage values are examined. + /// + [DataField] + public bool DisableHeavy = false; + + /// + /// If true, disables single-target attacks for this weapon, and prevents the single-target damage values appearing + /// when the damage values are examined. + /// + [DataField] + public bool DisableClick = false; + /* * Melee combat works based around 2 types of attacks: * 1. Click attacks with left-click. This attacks whatever is under your mnouse diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 20bf6d5c4e..aa15ecfb28 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -62,8 +62,6 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnMeleeSelected); - SubscribeLocalEvent(OnMeleeShotAttempted); - SubscribeLocalEvent(OnMeleeShot); SubscribeLocalEvent(OnGetBonusMeleeDamage); SubscribeLocalEvent(OnGetBonusHeavyDamageModifier); SubscribeLocalEvent(OnGetBonusMeleeAttackRate); @@ -86,24 +84,6 @@ private void OnMapInit(EntityUid uid, MeleeWeaponComponent component, MapInitEve #endif } - private void OnMeleeShotAttempted(EntityUid uid, MeleeWeaponComponent comp, ref ShotAttemptedEvent args) - { - if (comp.NextAttack > Timing.CurTime) - args.Cancel(); - } - - private void OnMeleeShot(EntityUid uid, MeleeWeaponComponent component, ref GunShotEvent args) - { - if (!TryComp(uid, out var gun)) - return; - - if (gun.NextFire > component.NextAttack) - { - component.NextAttack = gun.NextFire; - Dirty(uid, component); - } - } - private void OnMeleeSelected(EntityUid uid, MeleeWeaponComponent component, HandSelectedEvent args) { var attackRate = GetAttackRate(uid, args.User, component); @@ -169,29 +149,23 @@ private void OnStopAttack(StopAttackEvent msg, EntitySessionEventArgs args) private void OnLightAttack(LightAttackEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity is not {} user) + if (args.SenderSession.AttachedEntity is not {} user || + !TryGetWeapon(user, out var weaponUid, out var weapon) || + weaponUid != GetEntity(msg.Weapon) || + weapon.DisableClick) return; - if (!TryGetWeapon(user, out var weaponUid, out var weapon) || - weaponUid != GetEntity(msg.Weapon)) - { - return; - } - AttemptAttack(user, weaponUid, weapon, msg, args.SenderSession); } private void OnHeavyAttack(HeavyAttackEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity is not {} user) + if (args.SenderSession.AttachedEntity is not {} user || + !TryGetWeapon(user, out var weaponUid, out var weapon) || + weaponUid != GetEntity(msg.Weapon) || + weapon.DisableHeavy) return; - if (!TryGetWeapon(user, out var weaponUid, out var weapon) || - weaponUid != GetEntity(msg.Weapon)) - { - return; - } - AttemptAttack(user, weaponUid, weapon, msg, args.SenderSession); } @@ -529,7 +503,7 @@ protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, Entity } - _meleeSound.PlayHitSound(target.Value, user, GetHighestDamageSound(modifiedDamage, _protoManager), hitEvent.HitSoundOverride, component); + _meleeSound.PlayHitSound(target.Value, user, GetHighestDamageSound(modifiedDamage, _protoManager), hitEvent.HitSoundOverride, component.SoundHit, component.SoundNoDamage); if (damageResult?.GetTotal() > FixedPoint2.Zero) { @@ -678,7 +652,7 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU if (entities.Count != 0) { var target = entities.First(); - _meleeSound.PlayHitSound(target, user, GetHighestDamageSound(appliedDamage, _protoManager), hitEvent.HitSoundOverride, component); + _meleeSound.PlayHitSound(target, user, GetHighestDamageSound(appliedDamage, _protoManager), hitEvent.HitSoundOverride, component.SoundHit, component.SoundNoDamage); } if (appliedDamage.GetTotal() > FixedPoint2.Zero) diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 8d7ecae1a8..d522df5395 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -208,6 +208,12 @@ public sealed partial class GunComponent : Component [AutoPausedField] public TimeSpan NextFire = TimeSpan.Zero; + /// + /// After dealing a melee attack with this gun, the minimum cooldown in seconds before the gun can shoot again. + /// + [DataField] + public float MeleeCooldown = 0.528f; + /// /// What firemodes can be selected. /// diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 2fbb6785e2..7afb41239c 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -114,14 +114,18 @@ private void OnMapInit(Entity gun, ref MapInitEvent args) private void OnGunMelee(EntityUid uid, GunComponent component, MeleeHitEvent args) { - if (!TryComp(uid, out var melee)) - return; + var curTime = Timing.CurTime; - if (melee.NextAttack > component.NextFire) - { - component.NextFire = melee.NextAttack; - Dirty(uid, component); - } + if (component.NextFire < curTime) + component.NextFire = curTime; + + var meleeCooldown = TimeSpan.FromSeconds(component.MeleeCooldown); + + component.NextFire += meleeCooldown; + while (component.NextFire <= curTime) + component.NextFire += meleeCooldown; + + Dirty(uid, component); } private void OnShootRequest(RequestShootEvent msg, EntitySessionEventArgs args) diff --git a/Content.Shared/WhiteDream/BloodCult/Constructs/PhaseShift/PhaseShiftedComponent.cs b/Content.Shared/WhiteDream/BloodCult/Constructs/PhaseShift/PhaseShiftedComponent.cs new file mode 100644 index 0000000000..15b026b514 --- /dev/null +++ b/Content.Shared/WhiteDream/BloodCult/Constructs/PhaseShift/PhaseShiftedComponent.cs @@ -0,0 +1,39 @@ +using Content.Shared.Physics; +using Content.Shared.StatusEffect; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.WhiteDream.BloodCult.Constructs.PhaseShift; + +[RegisterComponent] +public sealed partial class PhaseShiftedComponent : Component +{ + [DataField] + public ProtoId StatusEffectId = "PhaseShifted"; + + [DataField] + public float MovementSpeedBuff = 1.5f; + + [DataField] + public int CollisionMask = (int) CollisionGroup.GhostImpassable; + + [DataField] + public int CollisionLayer; + + [DataField] + public EntProtoId PhaseInEffect = "EffectEmpPulseNoSound"; + + [DataField] + public EntProtoId PhaseOutEffect = "EffectEmpPulseNoSound"; + + [DataField] + public SoundSpecifier PhaseInSound = new SoundPathSpecifier(new ResPath("/Audio/WhiteDream/BloodCult/veilin.ogg")); + + [DataField] + public SoundSpecifier PhaseOutSound = + new SoundPathSpecifier(new ResPath("/Audio/WhiteDream/BloodCult/veilout.ogg")); + + public int StoredMask; + public int StoredLayer; +} diff --git a/Content.Shared/WhiteDream/BloodCult/Constructs/PhaseShift/SharedPhaseShiftSystem.cs b/Content.Shared/WhiteDream/BloodCult/Constructs/PhaseShift/SharedPhaseShiftSystem.cs new file mode 100644 index 0000000000..6caf723a8c --- /dev/null +++ b/Content.Shared/WhiteDream/BloodCult/Constructs/PhaseShift/SharedPhaseShiftSystem.cs @@ -0,0 +1,95 @@ +using System.Linq; +using Content.Shared.Interaction.Events; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Movement.Systems; +using Content.Shared.StatusEffect; +using Content.Shared.Stealth; +using Content.Shared.Stealth.Components; +using Content.Shared.Throwing; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Systems; + +namespace Content.Shared.WhiteDream.BloodCult.Constructs.PhaseShift; + +public abstract class SharedPhaseShiftSystem : EntitySystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedStealthSystem _stealth = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnComponentStartup); + + SubscribeLocalEvent(OnRefresh); + SubscribeLocalEvent(OnAttackAttempt); + SubscribeLocalEvent(OnThrowAttempt); + + SubscribeLocalEvent(OnComponentShutdown); + } + + protected virtual void OnComponentStartup(Entity ent, ref ComponentStartup args) + { + var pos = _transform.GetMapCoordinates(ent); + Spawn(ent.Comp.PhaseInEffect, pos); + _audio.PlayPvs(ent.Comp.PhaseInSound, Transform(ent).Coordinates); + + if (TryComp(ent, out var fixtures) && fixtures.FixtureCount >= 1) + { + var fixture = fixtures.Fixtures.First(); + ent.Comp.StoredMask = fixture.Value.CollisionMask; + ent.Comp.StoredLayer = fixture.Value.CollisionLayer; + _physics.SetCollisionMask(ent, fixture.Key, fixture.Value, ent.Comp.CollisionMask, fixtures); + _physics.SetCollisionLayer(ent, fixture.Key, fixture.Value, ent.Comp.CollisionLayer, fixtures); + } + + var stealth = EnsureComp(ent); + _stealth.SetVisibility(ent, -1, stealth); + + if (TryComp(ent, out PullableComponent? pullable)) + _pulling.TryStopPull(ent, pullable); + + _movement.RefreshMovementSpeedModifiers(ent); + } + + private void OnRefresh(Entity ent, ref RefreshMovementSpeedModifiersEvent args) => + args.ModifySpeed(ent.Comp.MovementSpeedBuff, ent.Comp.MovementSpeedBuff); + + private void OnAttackAttempt(Entity ent, ref AttackAttemptEvent args) + { + if (_statusEffects.HasStatusEffect(ent, ent.Comp.StatusEffectId)) + _statusEffects.TryRemoveStatusEffect(ent, ent.Comp.StatusEffectId); + } + + private void OnThrowAttempt(Entity ent, ref ThrowAttemptEvent args) + { + if (_statusEffects.HasStatusEffect(ent, ent.Comp.StatusEffectId)) + _statusEffects.TryRemoveStatusEffect(ent, ent.Comp.StatusEffectId); + } + + protected virtual void OnComponentShutdown(Entity ent, ref ComponentShutdown args) + { + Spawn(ent.Comp.PhaseOutEffect, _transform.GetMapCoordinates(ent)); + _audio.PlayPvs(ent.Comp.PhaseOutSound, ent); + + if (TryComp(ent, out var fixtures) && fixtures.FixtureCount >= 1) + { + var fixture = fixtures.Fixtures.First(); + + _physics.SetCollisionMask(ent, fixture.Key, fixture.Value, ent.Comp.StoredMask, fixtures); + _physics.SetCollisionLayer(ent, fixture.Key, fixture.Value, ent.Comp.StoredLayer, fixtures); + } + + _stealth.SetVisibility(ent, 1); + RemComp(ent); + + ent.Comp.MovementSpeedBuff = 1; + _movement.RefreshMovementSpeedModifiers(ent); + } +} diff --git a/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs b/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs index 1dbbb769aa..13e51214e0 100644 --- a/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs +++ b/Content.Shared/WhiteDream/BloodCult/Items/CultItemSystem.cs @@ -2,12 +2,15 @@ using Content.Shared.Ghost; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; using Content.Shared.Inventory.Events; using Content.Shared.Popups; +using Content.Shared.Projectiles; using Content.Shared.Stunnable; using Content.Shared.Throwing; using Content.Shared.Weapons.Melee.Events; using Content.Shared.WhiteDream.BloodCult.BloodCultist; +using Robust.Shared.Network; namespace Content.Shared.WhiteDream.BloodCult.Items; @@ -16,11 +19,13 @@ public sealed class CultItemSystem : EntitySystem [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedStunSystem _stun = default!; + [Dependency] private readonly INetManager _net = default!; public override void Initialize() { SubscribeLocalEvent(OnActivate); - SubscribeLocalEvent(OnBeforeThrow); + SubscribeLocalEvent(OnUseInHand); + SubscribeLocalEvent(OnBeforeGettingThrown); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnMeleeAttempt); SubscribeLocalEvent(OnBeforeBlocking); @@ -35,13 +40,24 @@ private void OnActivate(Entity item, ref ActivateInWorldEvent KnockdownAndDropItem(item, args.User, Loc.GetString("cult-item-component-generic")); } - private void OnBeforeThrow(Entity item, ref BeforeThrowEvent args) + private void OnUseInHand(Entity item, ref UseInHandEvent args) + { + if (CanUse(args.User) || + // Allow non-cultists to remove embedded cultist weapons and getting knocked down afterwards on pickup + (TryComp(item.Owner, out var embeddable) && embeddable.Target != null)) + return; + + args.Handled = true; + KnockdownAndDropItem(item, args.User, Loc.GetString("cult-item-component-generic")); + } + + private void OnBeforeGettingThrown(Entity item, ref BeforeGettingThrownEvent args) { if (CanUse(args.PlayerUid)) return; args.Cancelled = true; - KnockdownAndDropItem(item, args.PlayerUid, Loc.GetString("cult-item-component-throw-fail")); + KnockdownAndDropItem(item, args.PlayerUid, Loc.GetString("cult-item-component-throw-fail"), true); } private void OnEquipAttempt(Entity item, ref BeingEquippedAttemptEvent args) @@ -71,9 +87,14 @@ private void OnBeforeBlocking(Entity item, ref BeforeBlocking KnockdownAndDropItem(item, args.User, Loc.GetString("cult-item-component-block-fail")); } - private void KnockdownAndDropItem(Entity item, EntityUid user, string message) + // serverOnly is a very rough hack to make sure OnBeforeGettingThrown (that is only run server-side) can + // show the popup while not causing several popups to show up with PopupEntity. + private void KnockdownAndDropItem(Entity item, EntityUid user, string message, bool serverOnly = false) { - _popup.PopupPredicted(message, item, user); + if (serverOnly) + _popup.PopupEntity(message, item, user); + else + _popup.PopupPredicted(message, item, user); _stun.TryKnockdown(user, item.Comp.KnockdownDuration, true); _hands.TryDrop(user); } diff --git a/Content.Shared/WhiteDream/BloodCult/Runes/RuneDrawerComponent.cs b/Content.Shared/WhiteDream/BloodCult/Runes/RuneDrawerComponent.cs index b6dec321e4..c1388994a4 100644 --- a/Content.Shared/WhiteDream/BloodCult/Runes/RuneDrawerComponent.cs +++ b/Content.Shared/WhiteDream/BloodCult/Runes/RuneDrawerComponent.cs @@ -25,9 +25,15 @@ public enum RuneDrawerBuiKey } [Serializable, NetSerializable] -public sealed class RuneDrawerSelectedMessage(RuneSelectorPrototype selectedRune) : BoundUserInterfaceMessage +public sealed class RuneDrawerMenuState(List> availalbeRunes) : BoundUserInterfaceState { - public ProtoId SelectedRune { get; private set; } = selectedRune.ID; + public List> AvailalbeRunes { get; private set; } = availalbeRunes; +} + +[Serializable, NetSerializable] +public sealed class RuneDrawerSelectedMessage(ProtoId selectedRune) : BoundUserInterfaceMessage +{ + public ProtoId SelectedRune { get; private set; } = selectedRune; } [Serializable, NetSerializable] diff --git a/Content.Shared/WhiteDream/BloodCult/Runes/RuneSelectorPrototype.cs b/Content.Shared/WhiteDream/BloodCult/Runes/RuneSelectorPrototype.cs index 372ab866f0..12350917d0 100644 --- a/Content.Shared/WhiteDream/BloodCult/Runes/RuneSelectorPrototype.cs +++ b/Content.Shared/WhiteDream/BloodCult/Runes/RuneSelectorPrototype.cs @@ -1,5 +1,4 @@ using Content.Shared.Damage; -using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; namespace Content.Shared.WhiteDream.BloodCult.Runes; @@ -11,20 +10,20 @@ public sealed class RuneSelectorPrototype : IPrototype public string ID { get; } = default!; [DataField(required: true)] - public EntProtoId Prototype { get; } + public EntProtoId Prototype; [DataField] - public float DrawTime { get; } = 4f; + public float DrawTime = 4f; + + [DataField] + public bool RequireTargetDead; + + [DataField] + public int RequiredTotalCultists = 1; /// /// Damage dealt on the rune drawing. /// [DataField] - public DamageSpecifier DrawDamage = new() - { - DamageDict = new Dictionary - { - ["Slash"] = 15, - } - }; + public DamageSpecifier DrawDamage = new() { DamageDict = new() { ["Slash"] = 15 } }; } diff --git a/Content.Shared/WhiteDream/BloodCult/Spells/Events.cs b/Content.Shared/WhiteDream/BloodCult/Spells/Events.cs index 293a32691d..6b98514d44 100644 --- a/Content.Shared/WhiteDream/BloodCult/Spells/Events.cs +++ b/Content.Shared/WhiteDream/BloodCult/Spells/Events.cs @@ -2,6 +2,7 @@ using Content.Shared.Chat; using Content.Shared.DoAfter; using Content.Shared.Magic; +using Content.Shared.StatusEffect; using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -27,6 +28,9 @@ public sealed partial class BloodCultTeleportEvent : EntityTargetActionEvent, IS [DataField] public float Range = 5; + [DataField] + public TimeSpan DoAfterDuration = TimeSpan.FromSeconds(2); + [DataField] public string? Speech { get; set; } @@ -91,6 +95,28 @@ public sealed partial class SummonEquipmentEvent : InstantActionEvent, ISpeakSpe public sealed partial class BloodSpearRecalledEvent : InstantActionEvent; +public sealed partial class PlaceTileEntityEvent : WorldTargetActionEvent +{ + [DataField] + public EntProtoId? Entity; + + [DataField] + public string? TileId; + + [DataField] + public SoundSpecifier? Audio; + +} + +public sealed partial class PhaseShiftEvent : InstantActionEvent +{ + [DataField] + public TimeSpan Duration = TimeSpan.FromSeconds(5); + + [DataField] + public ProtoId StatusEffectId = "PhaseShifted"; +} + [Serializable, NetSerializable] public sealed partial class TwistedConstructionDoAfterEvent : SimpleDoAfterEvent; diff --git a/Resources/Audio/WhiteDream/BloodCult/resonator_blast.ogg b/Resources/Audio/WhiteDream/BloodCult/resonator_blast.ogg new file mode 100644 index 0000000000..c37c9e903d Binary files /dev/null and b/Resources/Audio/WhiteDream/BloodCult/resonator_blast.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f90b79e409..60540bb9f6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -8474,3 +8474,156 @@ Entries: id: 6564 time: '2024-12-06T20:30:45.0000000+00:00' url: https://github.com/Simple-Station/Einstein-Engines/pull/1321 +- author: fenndragon + changes: + - type: Tweak + message: Moved the uplink deception category into utility. + id: 6565 + time: '2024-12-07T13:31:16.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1309 +- author: Remuchi + changes: + - type: Add + message: >- + Reintroduced 3 traitors objectives: steal Ian's meat, Die Glorious Death + and Hijack Evacuation Shuttle + id: 6566 + time: '2024-12-07T14:46:48.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1323 +- author: Skubman + changes: + - type: Add + message: >- + The Throwing Update is here. You can throw most melee weapons at the + cost of stamina to deal damage from afar. + - type: Add + message: >- + Dozens of throwable weapons, mainly sharp weapons will now embed on + throw and deal damage every second until they're manually removed or + naturally fall off after some time. + - type: Add + message: >- + Examining the damage values of an item now shows its throwing damage, + throwing stamina cost, whether or not it embeds on a throw, and if the + embed deals damage over time. + - type: Add + message: Examining an embedded item now shows what body part it's embedded in. + - type: Tweak + message: >- + The traits High Adrenaline, Adrenal Dysfunction, Masochism and Low Pain + Tolerance now affect throwing attacks just like melee attacks. + - type: Tweak + message: >- + The default time to remove embedded items has been increased from 3 to 5 + seconds, and both the remover and the target with the embedded item need + to stand still during the removal. + - type: Tweak + message: >- + The time to pry up a floor tile with a crowbar and other tools has been + decreased from 1 second to 0.5 seconds. The throwing damage of floor + tiles has been increased. Go figure. + - type: Fix + message: >- + Attempting to throw a Blood Cultist item without being a cultist will + stun you and drop the item you're holding properly. + id: 6567 + time: '2024-12-08T03:30:08.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1307 +- author: dge21 + changes: + - type: Fix + message: 'Fixed melee weapons. ' + id: 6568 + time: '2024-12-10T00:43:13.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1330 +- author: stellar-novas + changes: + - type: Tweak + message: Flashes are bright again! + id: 6569 + time: '2024-12-10T19:13:47.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1331 +- author: VMSolidus + changes: + - type: Add + message: Added a large number of mapping assets from Nuclear14 + id: 6570 + time: '2024-12-11T22:45:57.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1315 +- author: sleepyyapril + changes: + - type: Add + message: Spin, flip, and jump emotes have been added. + id: 6571 + time: '2024-12-11T22:52:53.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1318 +- author: Skubman + changes: + - type: Fix + message: >- + Fixed an issue where players could not craft clown hardsuits and mime + hardsuits on the crafting menu. + - type: Fix + message: >- + Fixed an issue where clowns did not have their signature silly snore + sound when sleeping. + id: 6572 + time: '2024-12-11T23:12:43.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1324 +- author: Remuchi + changes: + - type: Add + message: In-game guide book to kickstart your sinister activities. + - type: Add + message: Constructs now have abilities. + - type: Add + message: >- + Rending rune and apocalypse rune now should only be placed in the + specific spots on maps. Needs to be mapped. + - type: Add + message: Veil Shifter now displays how much charges it has when examining. + - type: Add + message: >- + Cult runes now have descriptions. Also stating how much invokers + required for each rune. + - type: Add + message: Blood rites can now be dropped&deleted. + - type: Add + message: Blood rites now suck... blood in 0.5 tiles radius. + - type: Remove + message: Non-cultists can no longer examine runes. + - type: Fix + message: >- + Fixed Cult Objective Target selection. You can (and should) sacrifice + your own people now. + - type: Fix + message: Non cultists can no longer use veil shifter. + - type: Fix + message: Teleport spell is no more a cheap rip-off and now actually teleports. + - type: Fix + message: Timed Factories can't no more produce infinite number of entities. + - type: Fix + message: Offering rune should now properly convert someone. + - type: Fix + message: >- + Sacrificing body with mind now properly transfers their mind to soul + shard. + - type: Fix + message: Shadow Shackles now cuffs the target instead of the caster (lmao). + id: 6573 + time: '2024-12-11T23:19:30.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1276 +- author: Skubman + changes: + - type: Add + message: >- + Pistol-whipping has been added. You can press right click with a gun to + perform a Light Attack. Most guns will deal Blunt damage, apart from the + Kardashev-Mosin dealing Piercing/Slash damage with its bayonet. Weaving + bullets and melee attacks correctly will give you the upper hand in + combat. + - type: Add + message: Guns can now be thrown to deal the same damage as their melee damage. + id: 6574 + time: '2024-12-11T23:26:33.0000000+00:00' + url: https://github.com/Simple-Station/Einstein-Engines/pull/1335 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 7438cefeca..0ec128c6fd 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 2digitman, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Aerocrux, Aexolott, Aexxie, africalimedrop, afrokada, Agoichi, Ahion, Aidenkrz, Aikakakah, aitorlogedo, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, AlmondFlour, ALMv1, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, angelofallars, Anzarot121, Appiah, ar4ill, ArchPigeon, areitpog, Arendian, arimah, Arkanic, armoks, Arteben, ArthurMousatov, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, astriloqua, avghdev, AzzyIsNotHere, BananaFlambe, BasedPugilist, BasedUser, beck-thompson, benev0, BGare, bhespiritu, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, bloodrizer, Bloody2372, blueDev2, BlueHNT, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, BYONDFuckery, c0rigin, c4llv07e, CaasGit, CakeQ, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, christhirtle, chromiumboy, Chronophylos, Chubbygummibear, CilliePaint, civilCornball, clorl, clyf, Clyybber, CMDR-Piboy314, CodedCrow, Cohnway, cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, d4kii, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, DarkenedSynergy, Darkenson, DawBla, Daxxi3, dch-GH, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DeltaV-Bot, DerbyX, derek, dersheppard, dexlerxd, dffdff2423, dge21, digitalic, DinoWattz, DJB1gYAPPA, DjfjdfofdjfjD, DocNITE, DoctorBeard, DogZeroX, dolgovmi, dontbetank, dootythefrooty, Dorragon, Doru991, DoubleRiceEddiedd, DoutorWhite, drakewill-CRL, Drayff, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, Dutch-VanDerLinde, dvir001, dylanstrategie, Dynexust, Easypoller, eclips_e, eden077, EEASAS, Efruit, efzapa, ElectroSR, elsie, elthundercloud, Emisse, emmafornash, EmoGarbage404, Endecc, enumerate0, eoineoineoin, eris, ERORR404V1, Errant-4, esguard, estacaoespacialpirata, eugene, Evgencheg, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, Fansana, Feluk6174, fenndragon, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, FluffiestFloof, FluffMe, FluidRock, flybik, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, FoxxoTrystan, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, GalacticChimp, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, ghost581x, Git-Nivrak, gituhabu, GlassEclipse, gluesniffler, GNF54, Golinth, GoodWheatley, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, greggthefather, GreyMario, GTRsound, Guess-My-Name, gusxyz, h3half, Haltell, Hanzdegloker, Hardly3D, harikattar, Hebi, Henry, HerCoyote23, hiucko, Hmeister-fake, Hmeister-real, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, i-justuser-i, iacore, IamVelcroboy, icekot8, icesickleone, Ichaie, iczero, iglov, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Itzbenz, Jackal298, Jackrost, jacksonzck, Jackw2As, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jjtParadox, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justin, justintether, JustinTrotter, justtne, k3yw, Kadeo64, KaiShibaa, kalane15, kalanosh, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, komunre, koteq, Krunklehorn, Kukutis96513, Kupie, kxvvv, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, Leander-0, leonardo-dabepis, leonsfriedrich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, lizelive, lleftTheDragon, localcc, Lomcastar, LordCarve, LordEclipse, LovelyLophi, luckyshotpictures, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, Mervill, metalgearsloth, mhamsterr, michaelcu, micheel665, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, MLGTASTICa, Mnemotechnician, moderatelyaware, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, namespace-Memory, Nannek, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, nok-ko, NonchalantNoob, NoobyLegion, not-gavnaed, notafet, notquitehadouken, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OCOtheOmega, OctoRocket, OldDanceJacket, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Phantom-Lily, PHCodes, Phill101, phunnyguy, pigeonpeas, PilgrimViis, Pill-U, Pireax, pissdemon, PixelTheKermit, PJB3005, Plasmaguy, PlasmaRaptor, plinyvic, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, Rinkashikachi, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, router, RumiTiger, S1ss3l, Saakra, Salex08, sam, Samsterious, SaphireLattice, SapphicOverload, SaveliyM360, sBasalto, ScalyChimp, scrato, Scribbles0, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, ShadowCommander, shadowtheprotogen546, shadowwailker, shaeone, shampunj, shariathotpatrol, ShatteredSwords, SignalWalker, siigiil, SimpleStation14, Simyon264, sirdragooon, Sirionaut, siyengar04, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, SleepyScarecrow, sleepyyapril, Slyfox333, snebl, sniperchance, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, SpaceManiac, SpaceRox1244, SpaceyLady, spartak, SpartanKadence, Spatison, SpeltIncorrectyl, sphirai, SplinterGP, spoogemonster, sporekto, Squishy77, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, suraru, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, TadJohnson00, takemysoult, TaralGit, Taran, Tayrtahn, tday93, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, theOperand, TherapyGoth, TheShuEd, thevinter, ThunderBear2006, Timemaster99, timothyteakettle, TimrodDX, tin-man-tim, Tirochora, Titian3, tk-a369, tkdrg, Tmanzxd, tmtmtl30, toasterpm87, TokenStyle, Tollhouse, tom-leys, tomasalves8, Tomeno, Tonydatguy, Tornado-Technology, tosatur, TotallyLemon, truepaintgit, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, unusualcrow, Uriende, UristMcDorf, user424242420, v0idRift, Vaaankas, valentfingerov, Varen, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, VMSolidus, volotomite, volundr-, Voomra, Vordenburg, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, waylon531, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, zelezniciar1, ZelteHonor, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zymem, zzylex +0x6273, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 2digitman, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Aerocrux, Aexolott, Aexxie, africalimedrop, afrokada, Agoichi, Ahion, Aidenkrz, Aikakakah, aitorlogedo, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, AlmondFlour, ALMv1, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, angelofallars, Anzarot121, Appiah, ar4ill, ArchPigeon, areitpog, Arendian, arimah, Arkanic, armoks, Arteben, ArthurMousatov, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, astriloqua, avghdev, AzzyIsNotHere, BananaFlambe, BasedPugilist, BasedUser, beck-thompson, benev0, BGare, bhespiritu, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, bloodrizer, Bloody2372, blueDev2, BlueHNT, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, BYONDFuckery, c0rigin, c4llv07e, CaasGit, CakeQ, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, christhirtle, chromiumboy, Chronophylos, Chubbygummibear, CilliePaint, civilCornball, clorl, clyf, Clyybber, CMDR-Piboy314, CodedCrow, Cohnway, cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, CormosLemming, CrafterKolyan, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, d4kii, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, DarkenedSynergy, Darkenson, DawBla, Daxxi3, dch-GH, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DeltaV-Bot, DerbyX, derek, dersheppard, dexlerxd, dffdff2423, dge21, digitalic, DinoWattz, DJB1gYAPPA, DjfjdfofdjfjD, DocNITE, DoctorBeard, DogZeroX, dolgovmi, dontbetank, dootythefrooty, Dorragon, Doru991, DoubleRiceEddiedd, DoutorWhite, drakewill-CRL, Drayff, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, Dutch-VanDerLinde, dvir001, dylanstrategie, Dynexust, Easypoller, eclips_e, eden077, EEASAS, Efruit, efzapa, ElectroSR, elsie, elthundercloud, Emisse, emmafornash, EmoGarbage404, Endecc, enumerate0, eoineoineoin, eris, ERORR404V1, Errant-4, esguard, estacaoespacialpirata, eugene, Evgencheg, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, Fansana, Feluk6174, fenndragon, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, FluffiestFloof, FluffMe, FluidRock, flybik, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, FoxxoTrystan, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, GalacticChimp, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, ghost581x, Git-Nivrak, gituhabu, GlassEclipse, gluesniffler, GNF54, Golinth, GoodWheatley, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, greggthefather, GreyMario, GTRsound, Guess-My-Name, gusxyz, h3half, Haltell, Hanzdegloker, Hardly3D, harikattar, Hebi, Henry, HerCoyote23, hiucko, Hmeister-fake, Hmeister-real, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, i-justuser-i, iacore, IamVelcroboy, icekot8, icesickleone, Ichaie, iczero, iglov, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Itzbenz, Jackal298, Jackrost, jacksonzck, Jackw2As, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jjtParadox, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justin, justintether, JustinTrotter, justtne, k3yw, Kadeo64, KaiShibaa, kalane15, kalanosh, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, komunre, koteq, Krunklehorn, Kukutis96513, Kupie, kxvvv, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, Leander-0, leonardo-dabepis, leonsfriedrich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, lizelive, lleftTheDragon, localcc, Lomcastar, LordCarve, LordEclipse, LovelyLophi, luckyshotpictures, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, Mervill, metalgearsloth, mhamsterr, michaelcu, micheel665, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, MLGTASTICa, Mnemotechnician, moderatelyaware, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, namespace-Memory, Nannek, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, nok-ko, NonchalantNoob, NoobyLegion, not-gavnaed, notafet, notquitehadouken, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OCOtheOmega, OctoRocket, OldDanceJacket, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Phantom-Lily, PHCodes, Phill101, phunnyguy, pigeonpeas, PilgrimViis, Pill-U, Pireax, pissdemon, PixelTheKermit, PJB3005, Plasmaguy, PlasmaRaptor, plinyvic, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, Rinkashikachi, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, router, RumiTiger, S1ss3l, Saakra, Salex08, sam, Samsterious, SaphireLattice, SapphicOverload, SaveliyM360, sBasalto, ScalyChimp, scrato, Scribbles0, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, ShadowCommander, shadowtheprotogen546, shadowwailker, shaeone, shampunj, shariathotpatrol, ShatteredSwords, SignalWalker, siigiil, SimpleStation14, Simyon264, sirdragooon, Sirionaut, siyengar04, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, SleepyScarecrow, sleepyyapril, Slyfox333, snebl, sniperchance, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, SpaceManiac, SpaceRox1244, SpaceyLady, spartak, SpartanKadence, Spatison, SpeltIncorrectyl, sphirai, SplinterGP, spoogemonster, sporekto, Squishy77, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, suraru, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, TadJohnson00, takemysoult, TaralGit, Taran, Tayrtahn, tday93, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TherapyGoth, TheShuEd, thevinter, ThunderBear2006, Timemaster99, timothyteakettle, TimrodDX, tin-man-tim, Tirochora, Titian3, tk-a369, tkdrg, Tmanzxd, tmtmtl30, toasterpm87, TokenStyle, Tollhouse, tom-leys, tomasalves8, Tomeno, Tonydatguy, Tornado-Technology, tosatur, TotallyLemon, truepaintgit, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, unusualcrow, Uriende, UristMcDorf, user424242420, v0idRift, Vaaankas, valentfingerov, Varen, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, VMSolidus, volotomite, volundr-, Voomra, Vordenburg, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, waylon531, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, zelezniciar1, ZelteHonor, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zymem, zzylex diff --git a/Resources/Locale/en-US/body/body-parts.ftl b/Resources/Locale/en-US/body/body-parts.ftl new file mode 100644 index 0000000000..5dec76bb71 --- /dev/null +++ b/Resources/Locale/en-US/body/body-parts.ftl @@ -0,0 +1,19 @@ +# Locale values for TargetBodyPart + +body-part-Head = head +body-part-Torso = torso +body-part-Groin = groin +body-part-LeftArm = left arm +body-part-LeftHand = left hand +body-part-RightArm = right arm +body-part-RightHand = right hand +body-part-LeftLeg = left leg +body-part-LeftFoot = left foot +body-part-RightLeg = right leg +body-part-RightFoot = right foot + +body-part-Hands = hands +body-part-Arms = arms +body-part-Legs = legs +body-part-Feet = feet +body-part-All = body diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl index d50c2b3966..900e15ea66 100644 --- a/Resources/Locale/en-US/customization/character-requirements.ftl +++ b/Resources/Locale/en-US/customization/character-requirements.ftl @@ -140,3 +140,11 @@ character-whitelist-requirement = You must{$inverted -> [true]{" "}not *[other]{""} } be whitelisted + +## CVar + +character-cvar-requirement = + The server must{$inverted -> + [true]{" "}not + *[other]{""} +} have [color={$color}]{$cvar}[/color] set to [color={$color}]{$value}[/color]. diff --git a/Resources/Locale/en-US/damage/damage-examine.ftl b/Resources/Locale/en-US/damage/damage-examine.ftl index 3a71fc7262..f6cfe75fa7 100644 --- a/Resources/Locale/en-US/damage/damage-examine.ftl +++ b/Resources/Locale/en-US/damage/damage-examine.ftl @@ -12,4 +12,7 @@ damage-examine = It does the following damage: damage-examine-type = It does the following [color=cyan]{$type}[/color] damage: damage-value = - [color=red]{$amount}[/color] units of [color=yellow]{$type}[/color]. -damage-melee-heavy-stamina-cost = A [color=cyan]{$type}[/color] costs [color=orange]{$cost}[/color] [color=yellow]Stamina[/color]. +damage-stamina-cost = A [color=cyan]{$type}[/color] costs [color=orange]{$cost}[/color] [color=yellow]Stamina[/color]. + +damage-examine-embeddable-harmful = It [color=cyan]embeds[/color] when thrown, doing damage over time. +damage-examine-embeddable = It [color=cyan]embeds[/color] harmlessly when thrown. diff --git a/Resources/Locale/en-US/damage/stamina.ftl b/Resources/Locale/en-US/damage/stamina.ftl index 0d14a52c1e..657f32cb65 100644 --- a/Resources/Locale/en-US/damage/stamina.ftl +++ b/Resources/Locale/en-US/damage/stamina.ftl @@ -1 +1,3 @@ melee-stamina = Not enough stamina + +throw-no-stamina = You don't have enough stamina to throw the {$item}! diff --git a/Resources/Locale/en-US/emotes.ftl b/Resources/Locale/en-US/emotes.ftl new file mode 100644 index 0000000000..8efe738c94 --- /dev/null +++ b/Resources/Locale/en-US/emotes.ftl @@ -0,0 +1,7 @@ +chat-emote-name-flip = Do a flip +chat-emote-name-spin = Spin +chat-emote-name-jump = Jump + +chat-emote-msg-flip = does a flip! +chat-emote-msg-spin = spins! +chat-emote-msg-jump = jumps! \ No newline at end of file diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index ff812155f6..aefe59920a 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -71,6 +71,7 @@ guide-entry-zombies = Zombies guide-entry-revolutionaries = Revolutionaries guide-entry-minor-antagonists = Minor Antagonists guide-entry-space-ninja = Space Ninja +guide-entry-blood-cult = Blood Cult guide-entry-rules = Server Rules guide-entry-rules-core-only = Core Only Ruleset diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 1754bb89d3..2ac91d171e 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -9,7 +9,7 @@ uplink-pistol-cobra-name = Cobra uplink-pistol-cobra-desc = A rugged, robust operator handgun with inbuilt silencer. Uses pistol magazines (.25 caseless). uplink-rifle-mosin-name = Surplus Rifle -uplink-rifle-mosin-desc = A bolt action service rifle that has seen many wars. Not modern by any standard, hand loaded, and terrible recoil, but it is cheap. +uplink-rifle-mosin-desc = A bolt action service rifle that has seen many wars. Not modern by any standard, hand loaded, and terrible recoil, but it is cheap. The attached bayonet allows it to be used as an improvised spear. uplink-esword-name = Energy Sword uplink-esword-desc = A very dangerous energy sword that can reflect shots. Can be stored in pockets when turned off. Makes a lot of noise when used or turned on. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 74eb67bdaf..10e13ae80a 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -144,24 +144,24 @@ trait-description-GlassJaw = trait-name-HighAdrenaline = High Adrenaline trait-description-HighAdrenaline = Whether by natural causes, genetic or bionic augmentation, you have a more potent adrenal gland. - When injured, your melee attacks deal up to 10% more damage, in addition to the natural bonuses from adrenaline. - The standard adrenaline bonuses to melee damage are up to a 20% increase. + When injured, your melee/throwing attacks deal up to 10% more damage, in addition to the natural bonuses from adrenaline. + The standard adrenaline bonuses to melee/throwing damage are up to a 20% increase. trait-name-AdrenalDysfunction = Adrenal Dysfunction trait-description-AdrenalDysfunction = Your adrenal gland is completely nonfunctional, or potentially missing outright. - Your melee attacks do not benefit from Adrenaline when injured. - The standard adrenaline bonuses to melee damage are up to a 20% increase. + Your melee/throwing attacks do not benefit from Adrenaline when injured. + The standard adrenaline bonuses to melee/throwing damage are up to a 20% increase. trait-name-Masochism = Masochism trait-description-Masochism = Deriving enjoyment from your own pain, you are not as inhibited by it as others. - You ignore the first 10% of stamina damage penalties to your melee attacks. + You ignore the first 10% of stamina damage penalties to your melee/throwing attacks. trait-name-LowPainTolerance = Low Pain Tolerance trait-description-LowPainTolerance = Your tolerance for pain is far below average, and its effects are more inhibiting. - Your melee damage is penalized by up to an additional 15% when taking stamina damage. + Your melee/throwing damage is penalized by up to an additional 15% when taking stamina damage. trait-name-MartialArtist = Martial Artist trait-description-MartialArtist = diff --git a/Resources/Locale/en-US/weapons/throwing/throwing.ftl b/Resources/Locale/en-US/weapons/throwing/throwing.ftl new file mode 100644 index 0000000000..c7d2a8f663 --- /dev/null +++ b/Resources/Locale/en-US/weapons/throwing/throwing.ftl @@ -0,0 +1,6 @@ +throwing-falloff = The {$item} falls out of you! +throwing-embed-falloff = The {$item} falls out of you! +throwing-embed-remove-alert-owner = {$other} is removing the {$item} stuck on you! + +throwing-examine-embedded = {CAPITALIZE(OBJECT($embedded))} {CONJUGATE-BE($embedded)} [color=teal]embedded[/color] in [bold]{THE($target)}[/bold]. +throwing-examine-embedded-part = {CAPITALIZE(OBJECT($embedded))} {CONJUGATE-BE($embedded)} [color=teal]embedded[/color] in [bold]{THE($target)}[/bold]'s [color=red]{$targetPart}[/color]. diff --git a/Resources/Locale/en-US/white-dream/alerts.ftl b/Resources/Locale/en-US/white-dream/alerts.ftl index 5156b31ddb..b7dac60bfe 100644 --- a/Resources/Locale/en-US/white-dream/alerts.ftl +++ b/Resources/Locale/en-US/white-dream/alerts.ftl @@ -1,5 +1,2 @@ -alerts-blood-spells-name = Blood spells -alerts-blood-spells-desc = Click to create or remove blood spells. - -alerts-blood-cult-buff-name = Empowered -alerts-blood-cult-buff-desc = Blood magic requires much less time to cast and you lose less blood from it. You're also immune to pressure damage. +alerts-blood-cult-empowered-name = Empowered +alerts-blood-cult-empowered-desc = Blood magic and rune scribing requires much less time to cast and you lose less blood from it. diff --git a/Resources/Locale/en-US/white-dream/cult/gamerule.ftl b/Resources/Locale/en-US/white-dream/cult/gamerule.ftl index 0f7872985f..92fbab3f99 100644 --- a/Resources/Locale/en-US/white-dream/cult/gamerule.ftl +++ b/Resources/Locale/en-US/white-dream/cult/gamerule.ftl @@ -9,6 +9,8 @@ blood-cult-role-greeting = The Geometer of Blood, Nar-Sie, has sent a number of You must work with your brethren to summon an avatar of your eldritch goddess! blood-cult-role-briefing-short = Use '^' to contact other members of your brethren. +blood-cult-role-briefing-rending-locations = The veil can be thorn {$location}, {$coordinates} +blood-cult-role-briefing-emergency-rending = We can draw {$amount} more rending or apocalypse runes! blood-cult-condition-win = The Geometer of Blood has successfully summoned their Eldritch Goddess! blood-cult-condition-draw = Both parties were destroyed. diff --git a/Resources/Locale/en-US/white-dream/cult/items/general.ftl b/Resources/Locale/en-US/white-dream/cult/items/general.ftl index 6ad4938ade..f3702bb66a 100644 --- a/Resources/Locale/en-US/white-dream/cult/items/general.ftl +++ b/Resources/Locale/en-US/white-dream/cult/items/general.ftl @@ -11,6 +11,10 @@ ghost-role-information-soul-shard-name = Soul Shard ghost-role-information-soul-shard-description = Become the servant of The Blood Cult. ghost-role-information-soul-shard-rules = Take the form of one of the constructs and help your Masters bring their Old Goddess back to the world! +ghost-role-information-soul-shard-holy-name = Blessed Soul Shard +ghost-role-information-soul-shard-holy-description = Become the servant of crew and help them defeat the cult. +ghost-role-information-soul-shard-holy-rules = Take the form of one of the converted constructs and help the crew stop Geometer of Blood from bringing their Old Goddess back to the world! + shuttle-curse-cant-activate = Nar'Sien power doesn't seem to work. shuttle-curse-max-charges = You try to shatter the orb, but it remains as solid as a rock! shuttle-curse-shuttle-arrived = The shuttle has already arived! You can't delay it anymore. @@ -19,4 +23,5 @@ shuttle-curse-shuttle-not-called = The shuttle has not yet been called. shuttle-curse-system-failure = SYSTEM FAILURE shuttle-curse-success-global = The shuttle will be delayed by {$time} minutes. +veil-shifter-description = It has {$charges} charges left. veil-shifter-cant-teleport = Couldn't find a place to teleport you. Try again! diff --git a/Resources/Locale/en-US/white-dream/cult/runes.ftl b/Resources/Locale/en-US/white-dream/cult/runes.ftl index f13e72a372..7e166e2b68 100644 --- a/Resources/Locale/en-US/white-dream/cult/runes.ftl +++ b/Resources/Locale/en-US/white-dream/cult/runes.ftl @@ -1,4 +1,5 @@ cult-rune-cant-draw = You can not draw rune here! +cult-rune-cant-draw-rending = You have to be near the area where the veil between our Worlds is the thinnest. cult-rune-started-erasing = Started erasing... cult-rune-erased = Rune has been erased. cult-rune-not-enough-cultists = Not enough cultists to perform the ritual! @@ -11,8 +12,8 @@ cult-revive-rune-already-alive = The target is already alive. cult-buff-already-buffed = You are already empowered. -cult-rending-drawing-finished = The Geometer Of Blood has finished drawing the rune of end! Nearby location: {$location}. +cult-rending-drawing-finished = The Geometer Of Blood has finished drawing the rune of end {$location}! cult-rending-target-alive = Can not start the ritual: the target is alive. cult-rending-already-summoning = Can not start the ritual: it's already in progress. -cult-rending-started = The Geometer Of Blood has started the ritual of Dimensional Rending! +cult-rending-started = The Geometer Of Blood has started the ritual of Dimensional Rending {$location}! cult-rending-prevented = Someone has stopped the ritual. diff --git a/Resources/Locale/en-US/white-dream/cult/spells.ftl b/Resources/Locale/en-US/white-dream/cult/spells.ftl index f0934d74cb..52fa5939fb 100644 --- a/Resources/Locale/en-US/white-dream/cult/spells.ftl +++ b/Resources/Locale/en-US/white-dream/cult/spells.ftl @@ -1,5 +1,5 @@ blood-cult-spells-too-many = Too many spells already selected. blood-cult-no-spells = You have no spells selected. -blood-cult-select-spells-verb = Select blood spells +blood-cult-select-spells-verb = Prepare blood spells blood-cult-remove-spells-verb = Remove blood spells diff --git a/Resources/Prototypes/Actions/emotes.yml b/Resources/Prototypes/Actions/emotes.yml new file mode 100644 index 0000000000..6f34a4dc94 --- /dev/null +++ b/Resources/Prototypes/Actions/emotes.yml @@ -0,0 +1,23 @@ +- type: emote + id: Flip + name: chat-emote-name-flip + chatMessages: ["chat-emote-msg-flip"] + chatTriggers: + - does a flip + event: !type:AnimationFlipEmoteEvent + +- type: emote + id: Spin + name: chat-emote-name-spin + chatMessages: ["chat-emote-msg-spin"] + chatTriggers: + - spins + event: !type:AnimationSpinEmoteEvent + +- type: emote + id: Jump + name: chat-emote-name-jump + chatMessages: ["chat-emote-msg-jump"] + chatTriggers: + - jumps + event: !type:AnimationJumpEmoteEvent diff --git a/Resources/Prototypes/Body/Parts/base.yml b/Resources/Prototypes/Body/Parts/base.yml index 7b90b09794..356b961856 100644 --- a/Resources/Prototypes/Body/Parts/base.yml +++ b/Resources/Prototypes/Body/Parts/base.yml @@ -66,6 +66,11 @@ - type: ContainerContainer containers: torso_slot: !type:ContainerSlot {} + - type: DamageOtherOnHit + damage: + types: + Blunt: 11 + staminaCost: 12 - type: entity id: BaseHead @@ -82,6 +87,11 @@ - type: Tag tags: - Head + - type: DamageOtherOnHit + damage: + types: + Blunt: 5 + staminaCost: 5 - type: entity id: BaseLeftArm @@ -93,6 +103,11 @@ partType: Arm symmetry: Left toolName: "a left arm" + - type: DamageOtherOnHit + damage: + types: + Blunt: 7 + staminaCost: 7 - type: entity id: BaseRightArm @@ -104,6 +119,11 @@ partType: Arm symmetry: Right toolName: "a right arm" + - type: DamageOtherOnHit + damage: + types: + Blunt: 7 + staminaCost: 7 - type: entity id: BaseLeftHand @@ -115,6 +135,10 @@ partType: Hand symmetry: Left toolName: "a left hand" + - type: DamageOtherOnHit + damage: + types: + Blunt: 3 - type: entity id: BaseRightHand @@ -126,6 +150,10 @@ partType: Hand symmetry: Right toolName: "a right hand" + - type: DamageOtherOnHit + damage: + types: + Blunt: 3 - type: entity id: BaseLeftLeg @@ -138,6 +166,11 @@ symmetry: Left toolName: "a left leg" - type: MovementBodyPart + - type: DamageOtherOnHit + damage: + types: + Blunt: 8 + staminaCost: 9 - type: entity id: BaseRightLeg @@ -150,6 +183,11 @@ symmetry: Right toolName: "a right leg" - type: MovementBodyPart + - type: DamageOtherOnHit + damage: + types: + Blunt: 8 + staminaCost: 9 - type: entity id: BaseLeftFoot @@ -161,6 +199,10 @@ partType: Foot symmetry: Left toolName: "a left foot" + - type: DamageOtherOnHit + damage: + types: + Blunt: 4 - type: entity id: BaseRightFoot @@ -172,5 +214,9 @@ partType: Foot symmetry: Right toolName: "a right foot" + - type: DamageOtherOnHit + damage: + types: + Blunt: 4 # Shitmed Change End diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 20c4cc4ac8..fdfb4ed33a 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -509,7 +509,7 @@ cost: Telecrystal: 3 categories: - - UplinkDeception + - UplinkUtility - type: listing id: UplinkStealthBox @@ -519,7 +519,7 @@ cost: Telecrystal: 5 categories: - - UplinkDeception + - UplinkUtility - type: listing id: UplinkChameleonProjector @@ -529,7 +529,7 @@ cost: Telecrystal: 7 categories: - - UplinkDeception + - UplinkUtility - type: listing id: UplinkCyberpen @@ -539,7 +539,7 @@ cost: Telecrystal: 1 categories: - - UplinkDeception + - UplinkUtility - type: listing id: UplinkDecoyDisk @@ -549,7 +549,7 @@ cost: Telecrystal: 1 categories: - - UplinkDeception + - UplinkUtility - type: listing id: UplinkUltrabrightLantern @@ -559,7 +559,7 @@ cost: Telecrystal: 2 categories: - - UplinkDeception + - UplinkUtility - type: listing id: UplinkBribe @@ -569,7 +569,7 @@ cost: Telecrystal: 4 categories: - - UplinkDeception + - UplinkUtility # - type: listing # id: UplinkGigacancerScanner @@ -579,7 +579,7 @@ # cost: # Telecrystal: 5 # categories: -# - UplinkDeception +# - UplinkUtility - type: listing id: UplinkHolster @@ -974,7 +974,7 @@ cost: Telecrystal: 4 categories: - - UplinkDeception + - UplinkUtility # Disruption @@ -1788,3 +1788,4 @@ conditions: - !type:ListingLimitedStockCondition stock: 1 + diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml index c7aae33c76..94e898955a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml @@ -27,9 +27,14 @@ - type: MeleeWeapon damage: types: - Blunt: 2 + Blunt: 5.5 + heavyRateModifier: 1.25 + heavyStaminaCost: 5 + angle: 80.5 soundHit: path: "/Audio/Weapons/click.ogg" + - type: DamageOtherOnHit + staminaCost: 6 - type: StaticPrice price: 10 diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/Medical/portafib.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/Medical/portafib.yml index a02023f4a8..0f3095663d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/Medical/portafib.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/Medical/portafib.yml @@ -43,6 +43,13 @@ - type: GuideHelp guides: - Medical Doctor + - type: DamageOtherOnHit + damage: + types: + Blunt: 6.5 + staminaCost: 8 + soundHit: + path: /Audio/Weapons/smash.ogg - type: entity id: PortafibEmpty diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Mail/mail.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Mail/mail.yml index 43e26db635..f88fa13591 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Mail/mail.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Mail/mail.yml @@ -1584,9 +1584,9 @@ - id: MobMouse2 orGroup: Critter prob: 0.33 - - id: MobMouseCancer - orGroup: Critter - prob: 0.01 # Rare + #- id: MobMouseCancer + # orGroup: Critter + # prob: 0.01 # Rare - type: entity categories: [ HideSpawnMenu ] diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index f3b41bdbfe..d1251659ec 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -165,6 +165,15 @@ Disabler: { state: mode-disabler } Lethal: { state: mode-lethal } Special: { state: mode-stun } # Unused + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + bluntStaminaDamageFactor: 1.0 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: miniature energy gun @@ -232,6 +241,15 @@ - Sidearm - type: StaticPrice price: 750 + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + bluntStaminaDamageFactor: 1.0 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: PDW-9 Energy Pistol diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index 9fb68453ee..64fdf76f9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: Experimental L6 SAW parent: BaseItem id: WeaponLightMachineGunL6Borg @@ -38,4 +38,21 @@ # - type: DynamicPrice # price: 500 - type: Appearance - + - type: MeleeWeapon + attackRate: 1.4 + damage: + types: + Blunt: 11 + bluntStaminaDamageFactor: 1.3333 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 3 + - type: DamageOtherOnHit + staminaCost: 12 diff --git a/Resources/Prototypes/Entities/Clothing/Head/welding.yml b/Resources/Prototypes/Entities/Clothing/Head/welding.yml index c0ae440a56..4854df983b 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/welding.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/welding.yml @@ -23,6 +23,13 @@ - type: HideLayerClothing slots: - Snout + - type: DamageOtherOnHit + damage: + types: + Blunt: 7 + staminaCost: 5 + soundHit: + collection: MetalThud - type: entity parent: WeldingMaskBase diff --git a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml index 0054a3645c..b868c86699 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/pins.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/pins.yml @@ -7,6 +7,11 @@ components: - type: Item size: Tiny + - type: DamageOtherOnHit + damage: + types: + Blunt: 1 + staminaCost: 1 - type: entity parent: ClothingNeckPinBase @@ -151,7 +156,7 @@ clothingVisuals: neck: - state: trans-equipped - + - type: entity parent: ClothingNeckPinBase id: ClothingNeckAutismPin diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index c18e5d6ab6..323895491a 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -151,6 +151,13 @@ coefficient: 0.75 # 25% - type: ClothingRequiredStepTriggerImmune slots: WITHOUT_POCKET + - type: DamageOtherOnHit + damage: + types: + Blunt: 19 + staminaCost: 44 + soundHit: + collection: MetalThud - type: entity abstract: true @@ -199,4 +206,4 @@ id: ClothingOuterBaseMedium components: - type: Item - size: Huge \ No newline at end of file + size: Huge diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index d197632990..a9bb8f1dc7 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -1043,9 +1043,9 @@ walkModifier: 0.9 sprintModifier: 0.9 - type: HeldSpeedModifier - #- type: Construction # DeltaV - Prevent clowns from making the hardsuit - # graph: ClownHardsuit - # node: clownHardsuit + - type: Construction + graph: ClownHardsuit + node: clownHardsuit - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitClown @@ -1060,9 +1060,9 @@ sprite: Clothing/OuterClothing/Hardsuits/mime.rsi - type: Clothing sprite: Clothing/OuterClothing/Hardsuits/mime.rsi -# - type: Construction # DeltaV - Nuh uh -# graph: MimeHardsuit -# node: mimeHardsuit + - type: Construction + graph: MimeHardsuit + node: mimeHardsuit - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitMime diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml index 034064b943..13fbc08716 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml @@ -32,6 +32,14 @@ difficulty: 2 recipes: - ClothingShoesBootsMag + - type: DamageOtherOnHit + damage: + types: + Blunt: 9 + staminaCost: 11.5 + soundHit: + path: /Audio/Weapons/smash.ogg + - type: entity parent: ClothingShoesBootsMag @@ -59,6 +67,11 @@ price: 750 - type: StealTarget stealGroup: ClothingShoesBootsMagAdv + - type: DamageOtherOnHit + damage: + types: + Blunt: 13 + staminaCost: 15 - type: entity parent: ClothingShoesBootsMag @@ -131,6 +144,13 @@ - type: Tag tags: - WhitelistChameleon + - type: DamageOtherOnHit + damage: + types: + Blunt: 20 + staminaCost: 25 + soundHit: + collection: MetalThud - type: entity id: ActionBaseToggleMagboots diff --git a/Resources/Prototypes/Entities/Effects/emp_effects.yml b/Resources/Prototypes/Entities/Effects/emp_effects.yml index d1096b85f5..e386f902a5 100644 --- a/Resources/Prototypes/Entities/Effects/emp_effects.yml +++ b/Resources/Prototypes/Entities/Effects/emp_effects.yml @@ -1,5 +1,5 @@ - type: entity - id: EffectEmpPulse + id: EffectEmpPulseNoSound categories: [ HideSpawnMenu ] components: - type: TimedDespawn @@ -8,18 +8,24 @@ drawdepth: Effects noRot: true layers: - - shader: unshaded - map: ["enum.EffectLayers.Unshaded"] - sprite: Effects/emp.rsi - state: emp_pulse + - shader: unshaded + map: [ "enum.EffectLayers.Unshaded" ] + sprite: Effects/emp.rsi + state: emp_pulse - type: EffectVisuals - type: Tag tags: - - HideContextMenu + - HideContextMenu + - type: AnimationPlayer + +- type: entity + parent: EffectEmpPulseNoSound + id: EffectEmpPulse + categories: [ HideSpawnMenu ] + components: - type: EmitSoundOnSpawn - sound: + sound: path: /Audio/Effects/Lightning/lightningbolt.ogg - - type: AnimationPlayer - type: entity id: EffectEmpDisabled @@ -31,12 +37,12 @@ drawdepth: Effects noRot: true layers: - - shader: unshaded - map: ["enum.EffectLayers.Unshaded"] - sprite: Effects/emp.rsi - state: emp_disable + - shader: unshaded + map: [ "enum.EffectLayers.Unshaded" ] + sprite: Effects/emp.rsi + state: emp_disable - type: EffectVisuals - type: Tag tags: - - HideContextMenu + - HideContextMenu - type: AnimationPlayer diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xenopet.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xenopet.yml index 37cfa7b46d..7cdf61352b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xenopet.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xenopet.yml @@ -338,28 +338,28 @@ interactSuccessSound: path: /Audio/Animals/lizard_happy.ogg -- type: entity - id: neutralXenoVents - parent: BaseGameRule - categories: [ HideSpawnMenu ] - components: - - type: StationEvent - startAnnouncement: true - earliestStart: 20 - reoccurrenceDelay: 12 - minimumPlayers: 1 - weight: 6 # Really weak compared to other critters - duration: 60 - - type: VentCrittersRule - entries: - - id: MobXenoNeutralRouny - prob: 0.0075 - - id: MobXenoNeutralDrone - prob: 0.0075 - - id: MobXenoNeutralPraetorian - prob: 0.0075 - - id: MobXenoNeutralRavager - prob: 0.0075 +#- type: entity +# id: neutralXenoVents +# parent: BaseGameRule +# categories: [ HideSpawnMenu ] +# components: +# - type: StationEvent +# startAnnouncement: true +# earliestStart: 20 +# reoccurrenceDelay: 12 +# minimumPlayers: 1 +# weight: 6 # Really weak compared to other critters +# duration: 60 +# - type: VentCrittersRule +# entries: +# - id: MobXenoNeutralRouny +# prob: 0.0075 +# - id: MobXenoNeutralDrone +# prob: 0.0075 +# - id: MobXenoNeutralPraetorian +# prob: 0.0075 +# - id: MobXenoNeutralRavager +# prob: 0.0075 - type: entity id: ArgocyteVents diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index 5ab790feee..da413c339d 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -46,6 +46,14 @@ - type: LanguageSpeaker # Einstein Engines. This component is required to support speech, although it does not define known languages. - type: RequireProjectileTarget active: False + - type: AnimatedEmotes + +- type: entity + save: false + id: MobPolymorphable + abstract: true + components: + - type: Polymorphable - type: OwnInteractionVerbs allowedVerbs: [] # TODO: define something here, or don't. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index 319c8a634e..728ca962f9 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -53,6 +53,12 @@ damage: types: Blunt: 0 + - type: DamageOtherOnHit + damage: + types: + Blunt: 3 + soundHit: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg - type: Tool qualities: - Rolling diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml index 0b2af4c97f..454cd9b025 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_flasks.yml @@ -9,6 +9,10 @@ Steel: 300 - type: FitsInDispenser solution: drink + - type: DamageOtherOnHit + damage: + types: + Blunt: 5 - type: entity parent: FlaskBase diff --git a/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml b/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml index b7ad8ddd6a..8ebcc7dc16 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml @@ -24,6 +24,19 @@ - type: Tag tags: - HolosignProjector + - type: MeleeWeapon + wideAnimationRotation: 90 + attackRate: 0.8 + damage: + types: + Blunt: 6.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.9 + maxTargets: 1 + angle: 20 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit - type: entity parent: Holoprojector diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index e32271f4cd..2dbcfc60ab 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -108,6 +108,10 @@ - type: LanguageKnowledge speaks: [TauCetiBasic, RobotTalk] understands: [TauCetiBasic, RobotTalk] + - type: DamageOtherOnHit + damage: + types: + Blunt: 4 - type: entity parent: BasePDA @@ -504,7 +508,7 @@ parent: BasePDA id: CaptainPDA name: captain PDA - description: Surprisingly no different from your PDA. + description: Surprisingly no different from your PDA... Wait, it's a fair bit heavy to hold. components: - type: Pda id: CaptainIDCard @@ -519,6 +523,13 @@ borderColor: "#7C5D00" - type: Icon state: pda-captain + - type: DamageOtherOnHit + damage: + types: + Blunt: 8 + staminaCost: 5 + soundHit: + collection: MetalThud - type: entity parent: BasePDA diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml index 730d532930..b069b7de72 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml @@ -27,6 +27,8 @@ heavyDamageBaseModifier: 1.2 heavyStaminaCost: 7.5 angle: 75 + - type: DamageOtherOnHit + staminaCost: 8 - type: Item size: Normal sprite: Objects/Fun/Instruments/eguitar.rsi @@ -65,10 +67,12 @@ Blunt: 6 Shock: 1 bluntStaminaDamageFactor: 1.5 - heavyRateModifier: 0.75 + heavyRateModifier: 1.3333 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 7.5 angle: 75 + - type: DamageOtherOnHit + staminaCost: 8 - type: Item size: Normal sprite: Objects/Fun/Instruments/bassguitar.rsi @@ -101,7 +105,7 @@ soundHit: path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg range: 1.85 - attackRate: 1.25 + attackRate: .8 wideAnimationRotation: 45 damage: types: @@ -112,6 +116,8 @@ heavyDamageBaseModifier: 1.2 heavyStaminaCost: 10 angle: 160 + - type: DamageOtherOnHit + staminaCost: 8 - type: Wieldable - type: IncreaseDamageOnWield damage: @@ -179,6 +185,10 @@ damage: types: Blunt: 20 + - type: DamageOnLand + damage: + types: + Blunt: 20 - type: MeleeWeapon range: 1.5 wideAnimationRotation: 45 @@ -190,6 +200,8 @@ heavyDamageBaseModifier: 1.2 heavyStaminaCost: 10 angle: 75 + - type: DamageOtherOnHit + staminaCost: 7 - type: IncreaseDamageOnWield damage: types: @@ -236,6 +248,8 @@ heavyDamageBaseModifier: 1.2 heavyStaminaCost: 7.5 angle: 75 + - type: DamageOtherOnHit + staminaCost: 8 - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml index 7c69aa0901..36c8563bce 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml @@ -39,6 +39,7 @@ damage: types: Blunt: 0 + - type: DamageOtherOnHit - type: Tool qualities: - Honking diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 5c0bbc8445..0adbc49230 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -88,6 +88,10 @@ - Elyran - RobotTalk - Sign # It's intentional that they don't "Speak" sign language. + - type: DamageOtherOnHit + damage: + types: + Blunt: 3 - type: entity parent: PersonalAI diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index fc771414b4..a547f33b59 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -35,6 +35,7 @@ damage: types: Blunt: 0 + - type: DamageOtherOnHit - type: PhysicalComposition materialComposition: Cloth: 100 @@ -629,7 +630,7 @@ sprite: Objects/Fun/ducky.rsi state: icon - type: MeleeWeapon - attackRate: 1.5 + attackRate: .6666 range: 1.5 damage: types: @@ -1386,7 +1387,7 @@ sprite: Objects/Fun/toys.rsi state: foamblade - type: MeleeWeapon - attackRate: 1.5 + attackRate: .6666 angle: 0 animation: WeaponArcThrust wideAnimationRotation: 90 @@ -1672,7 +1673,7 @@ sprite: Objects/Weapons/Melee/cutlass.rsi state: foam_icon - type: MeleeWeapon - attackRate: 1.5 + attackRate: .6666 range: 2.0 angle: 0 animation: WeaponArcThrust @@ -1942,7 +1943,7 @@ damage: 0.8 - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 10 + attackRate: .1 damage: types: Blunt: 0 @@ -1964,4 +1965,4 @@ components: - type: Sprite sprite: Objects/Fun/toys.rsi - state: shadowkin \ No newline at end of file + state: shadowkin diff --git a/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml b/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml index 8f522abce4..2880bd00ec 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml @@ -20,7 +20,7 @@ - type: SpaceGarbage - type: MeleeWeapon wideAnimationRotation: -22.5 - attackRate: 1.5 + attackRate: .6666 damage: types: Slash: 3.5 diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 28f206a4f0..e90aafa414 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -43,11 +43,12 @@ mask: - ItemMask - type: DamageOtherOnHit - damage: - types: - Slash: 2 + meleeDamageMultiplier: 2 - type: EmbeddableProjectile sound: /Audio/Weapons/bladeslice.ogg + removalTime: 2.5 + autoRemoveDuration: 30 + - type: EmbedPassiveDamage - type: Tag tags: - Trash @@ -168,6 +169,10 @@ damage: types: Slash: 5.5 + - type: EmbedPassiveDamage + damage: + types: + Slash: 0.15 - type: WelderRefinable refineResult: - id: SheetGlass1 diff --git a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml index 760a0bafb6..bd1b7c8b24 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml @@ -21,6 +21,8 @@ heavyDamageBaseModifier: 2 heavyStaminaCost: 5 maxTargets: 8 + - type: DamageOtherOnHit + staminaCost: 5 - type: Tag tags: - Briefcase diff --git a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml index a6cbe9a6e7..dc9ee0d09d 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml @@ -6,12 +6,12 @@ components: - type: Sharp - type: MeleeWeapon - attackRate: 1.4 + attackRate: .71 range: 1.4 damage: types: Slash: 4 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 0.8 heavyDamageBaseModifier: 1.5 heavyStaminaCost: 5 @@ -25,7 +25,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 2 + Slash: 4 - type: Tag tags: - Trash diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index 6194be4848..c3b0eebe98 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -38,18 +38,20 @@ hasSafety: true - type: MeleeWeapon wideAnimationRotation: 180 - attackRate: 0.8 + attackRate: 1.25 bluntStaminaDamageFactor: 2.5 range: 1.75 damage: types: Blunt: 8 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 2 heavyStaminaCost: 7.5 maxTargets: 6 soundHit: path: /Audio/Weapons/smash.ogg + - type: DamageOtherOnHit + staminaCost: 9 - type: Tool qualities: - Rolling diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index d30fead363..cc12965a95 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -339,12 +339,6 @@ path: /Audio/Medical/Surgery/retractor1.ogg endSound: path: /Audio/Medical/Surgery/hemostat1.ogg - -- type: entity - parent: Pen - id: PenEmbeddable - abstract: true - components: - type: EmbeddableProjectile offset: 0.3,0.0 removalTime: 0.0 @@ -355,6 +349,16 @@ types: Piercing: 3 +- type: entity + parent: Pen + id: PenEmbeddable + abstract: true + components: + - type: DamageOtherOnHit + damage: + types: + Piercing: 5 + #TODO: I want the luxury pen to write a cool font like Merriweather in the future. - type: entity @@ -408,6 +412,10 @@ - type: Sprite sprite: Objects/Misc/bureaucracy.rsi state: pen_cap + - type: DamageOtherOnHit + damage: + types: + Piercing: 8 - type: entity name: CentCom pen diff --git a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml index 99f9ccaa87..3d3675dd33 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml @@ -12,9 +12,10 @@ - type: DamageOtherOnHit damage: types: - Blunt: 2 - - type: EmbeddableProjectile - sound: /Audio/Weapons/star_hit.ogg + Blunt: 5.5 + staminaCost: 5 + soundHit: + collection: MetalThud - type: Stack count: 1 - type: Tag @@ -67,9 +68,9 @@ - type: DamageOtherOnHit damage: types: - Blunt: 5 #Metal floor tiles deal more damage than standard - - type: EmbeddableProjectile - sound: /Audio/Weapons/block_metal1.ogg + Blunt: 9.5 #Metal floor tiles deal more damage than standard + staminaCost: 6 + soundHit: /Audio/Weapons/block_metal1.ogg - type: entity name: steel dark checker tile diff --git a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml index 7dee744ff7..f15219e137 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml @@ -31,7 +31,7 @@ - Trash - type: MeleeWeapon wideAnimationRotation: 180 - attackRate: 1.5 + attackRate: .6666 damage: types: Blunt: 0 @@ -53,12 +53,20 @@ - Fork - type: MeleeWeapon wideAnimationRotation: 180 - attackRate: 1.5 + attackRate: .6666 damage: types: Piercing: 5 - type: Tweezers # Forks are better than spoons speed: 0.35 + - type: DamageOtherOnHit + staminaCost: 2.5 + - type: EmbeddableProjectile + removalTime: 0.5 + autoRemoveDuration: 10 + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 180 - type: entity parent: UtensilBasePlastic @@ -92,10 +100,13 @@ - Spoon - type: MeleeWeapon wideAnimationRotation: 180 - attackRate: 1.5 + attackRate: .6666 damage: types: Blunt: 1 + - type: DamageOtherOnHit + - type: ThrowingAngle + angle: 180 - type: Shovel speedModifier: 0.1 # you can try @@ -150,9 +161,12 @@ - Spoon - type: MeleeWeapon wideAnimationRotation: 180 - attackRate: 2 + attackRate: .5 damage: types: Blunt: 2 + - type: DamageOtherOnHit + - type: ThrowingAngle + angle: 180 - type: Shovel speedModifier: 0.05 # nah diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 61866b149d..7dd0f0b71d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -45,7 +45,7 @@ types: Blunt: 4 Holy: 20 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1 heavyStaminaCost: 5 maxTargets: 4 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index 316294787b..cf347513fd 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -23,6 +23,10 @@ heavyDamageBaseModifier: 1.2 maxTargets: 5 angle: 100 + - type: DamageOtherOnHit + staminaCost: 5 + - type: ThrowingAngle + angle: 135 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi @@ -40,15 +44,17 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 90 - attackRate: 0.8 + attackRate: 1.25 damage: types: Piercing: 7 - heavyRateModifier: 0.9 + heavyRateModifier: 1.1 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.2 maxTargets: 1 angle: 20 + - type: DamageOtherOnHit + staminaCost: 5 - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 @@ -78,12 +84,19 @@ damage: types: Slash: 7 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.5 heavyStaminaCost: 5 maxTargets: 1 angle: 120 + - type: DamageOtherOnHit + staminaCost: 7 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 315 - type: Item size: Normal - type: Clothing @@ -109,13 +122,19 @@ - type: MeleeWeapon wideAnimationRotation: 135 swingLeft: true - attackRate: 1.25 + attackRate: .8 range: 1.4 damage: types: Slash: 10 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 5 + - type: DamageOtherOnHit + meleeDamageMultiplier: 1.5 + staminaCost: 6.5 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: EmbedPassiveDamage - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi - type: BoneSaw @@ -142,13 +161,17 @@ types: Blunt: 6 Slash: 2 # I guess you can stab it into them? - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 5 angle: 80 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 5 + - type: ThrowingAngle + angle: 45 - type: Item sprite: Objects/Tools/Hydroponics/spade.rsi - type: Shovel diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index a3a26299bf..2aee628394 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -13,7 +13,7 @@ types: Blunt: 2 bluntStaminaDamageFactor: 3 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.25 heavyStaminaCost: 7.5 @@ -21,6 +21,11 @@ angle: 180 soundHit: collection: MetalThud + - type: DamageOtherOnHit + damage: + types: + Blunt: 6 + staminaCost: 8 - type: Spillable solution: absorbed - type: Wieldable @@ -64,7 +69,7 @@ types: Blunt: 2 bluntStaminaDamageFactor: 3 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.25 heavyStaminaCost: 7.5 @@ -72,6 +77,11 @@ angle: 180 soundHit: collection: MetalThud + - type: DamageOtherOnHit + damage: + types: + Blunt: 6 + staminaCost: 8 - type: Spillable solution: absorbed - type: Wieldable diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index 6b5c634e93..9da1e9753f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -43,7 +43,7 @@ type: MechBoundUserInterface - type: MeleeWeapon hidden: true - attackRate: 0.75 + attackRate: 1.3333 damage: types: Blunt: 25 #thwack @@ -204,7 +204,7 @@ - Hamster - type: MeleeWeapon hidden: true - attackRate: 0.8 + attackRate: 1.25 damage: types: Blunt: 10 #thwack @@ -267,7 +267,7 @@ - VimPilot - type: MeleeWeapon hidden: true - attackRate: 0.8 + attackRate: 1.25 damage: types: Blunt: 10 #thwack diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml index 4a61074a8d..1a90568593 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml @@ -42,6 +42,13 @@ - type: GuideHelp guides: - Medical Doctor + - type: DamageOtherOnHit + damage: + types: + Blunt: 16 + staminaCost: 22.5 + soundHit: + path: /Audio/Weapons/smash.ogg - type: entity id: Defibrillator diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml index ab338b9da9..a9d6bbb20f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml @@ -38,6 +38,10 @@ - HighRiskItem - type: StealTarget stealGroup: HandheldCrewMonitor + - type: DamageOtherOnHit + damage: + types: + Blunt: 5 - type: entity id: HandheldCrewMonitorEmpty @@ -47,7 +51,7 @@ - type: ItemSlots slots: cell_slot: - name: power-cell-slot-component-slot-name-default + name: power-cell-slot-component-slot-name-default - type: entity id: SpyCrewMonitor @@ -73,7 +77,7 @@ - type: ItemSlots slots: cell_slot: - name: power-cell-slot-component-slot-name-default + name: power-cell-slot-component-slot-name-default - type: entity id: SyndiCrewMonitor @@ -97,5 +101,4 @@ - type: ItemSlots slots: cell_slot: - name: power-cell-slot-component-slot-name-default - \ No newline at end of file + name: power-cell-slot-component-slot-name-default diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index c01aaa84a9..47e633276b 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -37,6 +37,10 @@ - type: GuideHelp guides: - Medical Doctor + - type: DamageOtherOnHit + damage: + types: + Blunt: 5 - type: entity id: HandheldHealthAnalyzer diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index 638b194c34..f990736d70 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -33,6 +33,9 @@ Heat: 5 soundHit: path: /Audio/Effects/lightburn.ogg + - type: DamageOtherOnHit + - type: ThrowingAngle + angle: 45 - type: SurgeryTool startSound: path: /Audio/Medical/Surgery/cautery1.ogg @@ -90,7 +93,7 @@ - 0,0,1,0 - 1,1,1,1 - type: MeleeWeapon - attackRate: 0.75 + attackRate: 1.3333 range: 1.4 damage: types: @@ -101,6 +104,15 @@ angle: 20 soundHit: path: /Audio/Items/drill_hit.ogg + - type: DamageOtherOnHit + damage: + types: + Piercing: 11 + staminaCost: 8 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 90 - type: StaticPrice price: 40 - type: SurgeryTool @@ -130,18 +142,24 @@ - type: MeleeWeapon wideAnimationRotation: 90 swingLeft: true - attackRate: 1.25 + attackRate: .8 range: 1.4 damage: types: Slash: 7.5 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.25 heavyStaminaCost: 5 maxTargets: 1 angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 90 - type: SurgeryTool startSound: path: /Audio/Medical/Surgery/scalpel1.ogg @@ -248,6 +266,27 @@ - type: Item sprite: Objects/Specific/Medical/Surgery/retractor.rsi storedRotation: 90 + - type: MeleeWeapon + wideAnimationRotation: 90 + attackRate: 1.25 + range: 1.4 + damage: + types: + Slash: 2.5 + Blunt: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 4 + maxTargets: 1 + angle: 20 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: ThrowingAngle + angle: 315 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage - type: SurgeryTool startSound: path: /Audio/Medical/Surgery/retractor1.ogg @@ -283,6 +322,8 @@ types: Slash: 6.5 Heat: 1 + - type: ThrowingAngle + angle: 270 - type: Hemostat speed: 1.5 - type: Retractor @@ -306,6 +347,26 @@ - type: Item sprite: Objects/Specific/Medical/Surgery/hemostat.rsi storedRotation: 90 + - type: MeleeWeapon + wideAnimationRotation: 90 + attackRate: 1.25 + range: 1.4 + damage: + types: + Slash: 6 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 4.5 + maxTargets: 1 + angle: 20 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 35 - type: SurgeryTool startSound: path: /Audio/Medical/Surgery/retractor1.ogg @@ -362,17 +423,25 @@ - Sawing speed: 1.0 - type: MeleeWeapon - attackRate: 0.75 + attackRate: 1.3333 range: 1.35 damage: types: Blunt: 2.5 Slash: 6.5 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.0 heavyStaminaCost: 20 maxTargets: 8 angle: 20 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 10 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 0 - type: BoneSaw # --No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb.-- # No, I'm going to saw through your bones. @@ -388,19 +457,21 @@ - type: Item heldPrefix: improv - type: MeleeWeapon - attackRate: 0.85 + attackRate: 1.17 damage: types: Blunt: 3 Slash: 7 bluntStaminaDamageFactor: 3 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.0 heavyStaminaCost: 20 maxTargets: 8 angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: ThrowingAngle + angle: 90 - type: Tool qualities: - Sawing @@ -421,20 +492,27 @@ sprite: Objects/Specific/Medical/Surgery/circular-saw.rsi storedRotation: 90 - type: MeleeWeapon - attackRate: 1.15 + attackRate: .86 range: 1.5 bluntStaminaDamageFactor: 3.0 damage: types: Blunt: 4.5 Slash: 5.5 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyDamageBaseModifier: 1 heavyStaminaCost: 10 maxTargets: 8 angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg + - type: DamageOtherOnHit + damage: + types: + Slash: 10 + staminaCost: 14 + - type: ThrowingAngle + angle: 90 - type: Tool qualities: - Sawing @@ -457,20 +535,27 @@ heldPrefix: advanced storedRotation: 90 - type: MeleeWeapon - attackRate: 1.15 + attackRate: .86 range: 1.5 bluntStaminaDamageFactor: 5.0 damage: types: Blunt: 4.5 Slash: 7.5 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyDamageBaseModifier: 1 heavyStaminaCost: 10 maxTargets: 8 angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg + - type: DamageOtherOnHit + damage: + types: + Slash: 12 + staminaCost: 14 + - type: ThrowingAngle + angle: 90 - type: Tool qualities: - Sawing diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml index 113017cc84..3c3b215422 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml @@ -129,7 +129,7 @@ - type: Item size: Large - type: MeleeWeapon - attackRate: 0.5 + attackRate: 2 angle: 0 animation: WeaponArcFist wideAnimationRotation: -135 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml index 451230bbf1..2a09c9ede9 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: BarberScissors name: barber scissors description: is able to reshape the hairstyle of any crew cut to your liking. @@ -28,3 +28,9 @@ Piercing: 6 soundHit: path: "/Audio/Weapons/bladeslice.ogg" + - type: DamageOtherOnHit + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml index 953c05f107..478aec4ce4 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml @@ -20,6 +20,11 @@ path: /Audio/Weapons/genhit2.ogg soundSwing: path: /Audio/Weapons/punchmiss.ogg + - type: DamageOtherOnHit + damage: + types: + Blunt: 11 + staminaCost: 15 - type: Item size: Normal - type: Damageable diff --git a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml index 87959ebef3..399e14cc97 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml @@ -37,7 +37,7 @@ - type: Item sprite: Objects/Tools/Cowtools/moodriver.rsi - type: MeleeWeapon - attackRate: 1.5 + attackRate: .6666 damage: types: Blunt: 0.1 #poke poke poke @@ -60,7 +60,7 @@ - type: Item sprite: Objects/Tools/Cowtools/wronch.rsi - type: MeleeWeapon - attackRate: 1.5 + attackRate: .6666 damage: types: Blunt: 0.1 diff --git a/Resources/Prototypes/Entities/Objects/Tools/emag.yml b/Resources/Prototypes/Entities/Objects/Tools/emag.yml index 0117d44d6d..4461d952c0 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/emag.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/emag.yml @@ -12,6 +12,13 @@ - type: Item sprite: Objects/Tools/emag.rsi storedRotation: -90 + - type: DamageOtherOnHit # An emag has sharp edges + damage: + types: + Slash: 5 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: EmbedPassiveDamage - type: entity parent: EmagUnlimited diff --git a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml index cbb5dfee0a..1e10cc7ba0 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: flashlight parent: BaseItem id: FlashlightLantern @@ -55,13 +55,15 @@ visible: false map: [ "light" ] - type: MeleeWeapon - attackRate: 0.8 + attackRate: 1.25 bluntStaminaDamageFactor: 1.5 damage: types: Blunt: 6 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 3.5 - type: Item sprite: Objects/Tools/flashlight.rsi storedRotation: -90 @@ -117,7 +119,7 @@ map: [ "light" ] - type: MeleeWeapon wideAnimationRotation: 90 - attackRate: 0.8 + attackRate: 1.25 damage: types: Blunt: 6.5 diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 8590a32a6a..c8e47b6fda 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -33,17 +33,21 @@ maxIntensity: 20 - type: MeleeWeapon wideAnimationRotation: 45 - attackRate: 0.8 + attackRate: 1.25 range: 1.75 damage: types: Blunt: 8 bluntStaminaDamageFactor: 2.5 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.5 heavyStaminaCost: 10 maxTargets: 3 angle: 100 + soundHit: + path: /Audio/Weapons/smash.ogg + - type: DamageOtherOnHit + staminaCost: 8 - type: PhysicalComposition materialComposition: Steel: 185 @@ -111,6 +115,8 @@ damage: types: Blunt: 5 + - type: DamageOtherOnHit + staminaCost: 3.5 - type: PhysicalComposition materialComposition: Steel: 100 @@ -179,6 +185,8 @@ damage: types: Blunt: 7.5 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity parent: DoubleEmergencyOxygenTank diff --git a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml index 936e832224..3beb11f423 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml @@ -44,20 +44,24 @@ changeSound: /Audio/Items/change_jaws.ogg - type: MeleeWeapon wideAnimationRotation: 90 - attackRate: 0.85 + attackRate: 1.17 range: 1.65 damage: types: Blunt: 10 Slash: 2 bluntStaminaDamageFactor: 2.0 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.5 heavyStaminaCost: 5 maxTargets: 1 angle: 20 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 7 + - type: ThrowingAngle + angle: 90 - type: ReverseEngineering # Delta difficulty: 3 recipes: @@ -102,3 +106,4 @@ types: Blunt: 12 Slash: 2 + - type: DamageOtherOnHit diff --git a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml index 8a832c746e..52b224a61e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lighters.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lighters.yml @@ -16,6 +16,17 @@ activatedDamage: types: Heat: 1 + activatedSoundOnHit: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg + params: + variation: 0.250 + volume: -15 + activatedSoundOnHitNoDamage: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg + params: + variation: 0.250 + volume: -17 + - type: ItemToggleDamageOtherOnHit - type: ItemToggleSize activatedSize: Small - type: ItemToggleHot @@ -78,6 +89,7 @@ damage: types: Blunt: 0 + - type: DamageOtherOnHit - type: Welder fuelConsumption: 0.01 fuelLitCost: 0.1 @@ -159,6 +171,17 @@ activatedDamage: types: Heat: 1 + activatedSoundOnHit: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg + params: + variation: 0.250 + volume: -15 + activatedSoundOnHitNoDamage: + path: /Audio/Weapons/Guns/Hits/energy_meat1.ogg + params: + variation: 0.250 + volume: -17 + - type: ItemToggleDamageOtherOnHit - type: ItemToggleSize activatedSize: Small - type: ItemToggleHot @@ -207,6 +230,7 @@ damage: types: Blunt: 1 # does a little bit of damage on hit when off + - type: DamageOtherOnHit - type: PointLight enabled: false netsync: false diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index bfbb0573ca..fcb41ceef3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -21,7 +21,7 @@ - type: Item size: Ginormous - type: MeleeWeapon - attackRate: 0.9 + attackRate: 1.1 range: 1.75 damage: types: @@ -32,6 +32,9 @@ angle: 80.5 soundHit: path: "/Audio/Weapons/smash.ogg" + - type: DamageOtherOnHit + meleeDamageMultiplier: 1.33 + staminaCost: 12.5 - type: Tag tags: - Toolbox @@ -141,6 +144,10 @@ damage: types: Blunt: 11.5 + - type: DamageOtherOnHit + damage: + types: + Blunt: 15 - type: entity name: golden toolbox @@ -157,6 +164,10 @@ damage: types: Blunt: 12 + - type: DamageOtherOnHit + damage: + types: + Blunt: 16 - type: entity id: ToolboxThief diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index a58cf5fc66..69af8e4741 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -31,7 +31,7 @@ - state: cutters-cutty-thingy - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 0.9 + attackRate: 1.1 range: 1.6 damage: types: @@ -41,6 +41,12 @@ maxTargets: 4 soundHit: path: "/Audio/Items/wirecutter.ogg" + - type: DamageOtherOnHit + damage: + types: + Blunt: 4 + soundHit: + collection: MetalThud - type: Tool qualities: - Cutting @@ -108,7 +114,7 @@ storedRotation: -90 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1.35 + attackRate: .74 damage: types: Piercing: 6 @@ -118,6 +124,14 @@ angle: 20 soundHit: path: "/Audio/Weapons/bladeslice.ogg" + - type: DamageOtherOnHit + staminaCost: 5 + - type: ThrowingAngle + angle: 270 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + removalTime: 1 + - type: EmbedPassiveDamage - type: Tool qualities: - Screwing @@ -176,7 +190,7 @@ state: storage - type: MeleeWeapon wideAnimationRotation: 135 - attackRate: 0.9 + attackRate: 1.1 range: 1.6 damage: types: @@ -187,6 +201,7 @@ angle: 100 soundHit: collection: MetalThud + - type: DamageOtherOnHit - type: Tool qualities: - Anchoring @@ -233,7 +248,7 @@ state: storage - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.25 + attackRate: .8 damage: types: Blunt: 6 @@ -241,6 +256,8 @@ heavyStaminaCost: 5 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 6 - type: Tool qualities: - Prying @@ -295,7 +312,7 @@ - state: green-unlit shader: unshaded - type: MeleeWeapon - attackRate: 0.75 + attackRate: 1.3333 damage: types: Shock: 2 @@ -303,6 +320,7 @@ heavyDamageBaseModifier: 1.2 maxTargets: 1 angle: 20 + - type: DamageOtherOnHit - type: Item size: Small - type: Clothing @@ -438,7 +456,7 @@ price: 100 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 0.9 + attackRate: 1.1 range: 1.4 damage: types: @@ -449,6 +467,13 @@ angle: 20 soundHit: path: "/Audio/Items/drill_hit.ogg" + - type: DamageOtherOnHit + damage: + types: + Blunt: 8 + staminaCost: 7.5 + soundHit: + collection: MetalThud - type: ReverseEngineering # Nyano difficulty: 2 recipes: @@ -660,7 +685,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 45 - attackRate: 0.8 + attackRate: 1.25 range: 1.75 damage: types: @@ -672,6 +697,10 @@ angle: 100 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 8.5 + - type: ThrowingAngle + angle: 45 - type: Item size: Normal sprite: Objects/Tools/shovel.rsi @@ -709,7 +738,7 @@ - Belt - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.9 + attackRate: 1.1 damage: types: Blunt: 7 @@ -720,6 +749,7 @@ angle: 20 soundHit: collection: MetalThud + - type: DamageOtherOnHit - type: Tool qualities: - Rolling diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 69d6d80ab4..eae5cdbf46 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -56,6 +56,11 @@ activatedDamage: types: Heat: 7 + - type: ItemToggleDamageOtherOnHit + activatedDamage: + types: + Heat: 4 + Blunt: 3 - type: ItemToggleSize activatedSize: Large - type: ItemToggleHot @@ -78,6 +83,7 @@ Blunt: 6 #i mean... i GUESS you could use it like that soundHit: collection: MetalThud + - type: DamageOtherOnHit - type: RefillableSolution solution: Welder - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml index 93621bc3a2..4eec74f05a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml @@ -48,3 +48,20 @@ - Belt - type: UseDelay delay: 1 + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 9.0 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 8 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 62a98bd5da..62291cc271 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -37,6 +37,24 @@ - type: SurgeryTool endSound: path: /Audio/Weapons/Guns/Gunshots/laser.ogg + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 8.5 + bluntStaminaDamageFactor: 1.25 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 7 - type: entity id: BaseWeaponPowerCell @@ -78,6 +96,24 @@ - type: SurgeryTool endSound: path: /Audio/Weapons/Guns/Gunshots/laser.ogg + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 9.0 + bluntStaminaDamageFactor: 1.25 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 7 - type: entity id: BaseWeaponBatterySmall @@ -98,6 +134,15 @@ slots: - Belt - suitStorage + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + bluntStaminaDamageFactor: 1.0 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity id: BaseWeaponPowerCellSmall @@ -114,6 +159,15 @@ quickEquip: false slots: - Belt + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + bluntStaminaDamageFactor: 1.0 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: svalinn laser pistol @@ -248,6 +302,10 @@ fireCost: 62.5 - type: StaticPrice price: 300 + - type: MeleeWeapon + damage: + types: + Blunt: 4 - type: entity name: pulse pistol @@ -377,6 +435,14 @@ - type: HitscanBatteryAmmoProvider proto: RedHeavyLaser fireCost: 100 + - type: MeleeWeapon + attackRate: 1.4 + damage: + types: + Blunt: 10 + bluntStaminaDamageFactor: 1.3333 + - type: DamageOtherOnHit + staminaCost: 9.5 - type: entity name: portable particle decelerator @@ -408,6 +474,22 @@ - type: Battery maxCharge: 10000 startingCharge: 10000 + - type: MeleeWeapon + attackRate: 1.6 + damage: # This is super expensive, low attack rate, slows down the user and high stam cost so it can be high + types: + Blunt: 34 + Structural: 10 + swapKeys: false + disableHeavy: false + disableClick: true + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 1.0 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 21 + wideAnimationRotation: 270 + - type: DamageOtherOnHit + staminaCost: 48 - type: entity name: x-ray cannon @@ -476,6 +558,12 @@ - type: GuideHelp guides: - Security + - type: MeleeWeapon + damage: + types: + Blunt: 5.0 + bluntStaminaDamageFactor: 2.5 + wideAnimationRotation: 135 - type: entity name: disabler SMG @@ -514,6 +602,12 @@ zeroVisible: true - type: StaticPrice price: 260 + - type: MeleeWeapon + damage: + types: + Blunt: 6.5 + bluntStaminaDamageFactor: 2.5 + wideAnimationRotation: 180 - type: entity name: practice disabler @@ -539,6 +633,11 @@ - type: ProjectileBatteryAmmoProvider proto: BulletDisablerPractice fireCost: 100 + - type: MeleeWeapon + damage: + types: + Blunt: 3 + bluntStaminaDamageFactor: 1.0 - type: entity name: taser @@ -615,6 +714,15 @@ price: 750 - type: StealTarget stealGroup: WeaponCaptain + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 9 + bluntStaminaDamageFactor: 1.25 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: advanced laser pistol @@ -650,6 +758,12 @@ - type: Appearance - type: StaticPrice price: 63 + - type: MeleeWeapon + damage: + types: + Blunt: 8 + - type: DamageOtherOnHit + staminaCost: 6 - type: entity name: C.H.I.M.P. handcannon diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/HMGs/hmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/HMGs/hmgs.yml index 9d685e1ddc..72df09ac50 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/HMGs/hmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/HMGs/hmgs.yml @@ -20,6 +20,20 @@ - type: StaticPrice price: 500 # No chamber because HMG may want its own + - type: MeleeWeapon + attackRate: 1.5 + damage: + types: + Blunt: 16 + bluntStaminaDamageFactor: 1.5 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 16 - type: entity name: minigun diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index f90cbb6e60..4b6e21a492 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -62,6 +62,24 @@ price: 500 - type: UseDelay delay: 1 + - type: MeleeWeapon + attackRate: 1.4 + damage: + types: + Blunt: 11 + bluntStaminaDamageFactor: 1.3333 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 3 + - type: DamageOtherOnHit + staminaCost: 12 - type: entity name: L6 SAW diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index be4ea534d7..dc49dce0f3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -19,6 +19,20 @@ containers: ballistic-ammo: !type:Container ents: [] + - type: MeleeWeapon + attackRate: 1.5 + damage: + types: + Blunt: 14 + bluntStaminaDamageFactor: 1.5 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 14 - type: entity name: china lake diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 73c2231b23..fefc41ae86 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -66,6 +66,19 @@ - type: StaticPrice price: 500 - type: AmmoCounter + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 135 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: viper diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml index 6f925139fb..bc04106267 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/arrows.yml @@ -28,6 +28,7 @@ - type: EmbeddableProjectile sound: /Audio/Weapons/star_hit.ogg embedOnThrow: false + - type: EmbedPassiveDamage - type: ThrowingAngle angle: 0 - type: Ammo diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml index 734b6c4adc..c85ce56974 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml @@ -50,6 +50,19 @@ path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg - type: StaticPrice price: 500 + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 135 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: Deckard diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index 61df2b857e..0aa281b95c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -51,6 +51,24 @@ gun_chamber: !type:ContainerSlot - type: StaticPrice price: 500 + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 8.5 + bluntStaminaDamageFactor: 1.25 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 7.5 - type: entity name: AKMS diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index b448ddea3e..8d43953a07 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -54,6 +54,24 @@ gun_chamber: !type:ContainerSlot - type: StaticPrice price: 500 + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 9.0 + bluntStaminaDamageFactor: 1.25 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 8 - type: entity name: Atreides diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 44ee4a08c1..40c8537412 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -43,6 +43,24 @@ ents: [] - type: StaticPrice price: 500 + - type: MeleeWeapon + attackRate: 1.4 + damage: + types: + Blunt: 10 + bluntStaminaDamageFactor: 1.3333 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 9.5 - type: entity name: Bulldog @@ -102,6 +120,24 @@ - type: Appearance - type: StaticPrice price: 500 + - type: MeleeWeapon + attackRate: 1.4 + damage: + types: + Blunt: 10 + bluntStaminaDamageFactor: 1.3333 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 9.5 - type: entity name: antique Bulldog @@ -136,6 +172,12 @@ graph: ShotgunSawn node: start deconstructionTarget: null + - type: MeleeWeapon + damage: + types: + Blunt: 8.5 + - type: DamageOtherOnHit + staminaCost: 7.5 - type: entity name: double-barreled shotgun @@ -162,6 +204,13 @@ - type: BallisticAmmoProvider - type: Wieldable - type: GunRequiresWield + - type: MeleeWeapon + attackRate: 1.4 + damage: + types: + Blunt: 9 + - type: DamageOtherOnHit + staminaCost: 8.0 - type: entity parent: WeaponShotgunEnforcer @@ -216,6 +265,13 @@ graph: ShotgunSawn node: shotgunsawn deconstructionTarget: null + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + - type: DamageOtherOnHit + staminaCost: 6 - type: entity name: sawn-off shogun @@ -255,6 +311,14 @@ deconstructionTarget: null - type: StaticPrice price: 0 + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 - type: entity name: blunderbuss diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 88c00bedbd..86b90f2bde 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -39,12 +39,30 @@ ents: [] - type: StaticPrice price: 500 + - type: MeleeWeapon + attackRate: 1.3333 + damage: + types: + Blunt: 8.0 + bluntStaminaDamageFactor: 1.25 + swapKeys: true + disableHeavy: true + wideAnimationRotation: 135 + animation: WeaponArcThrust + soundHit: + collection: MetalThud + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2.5 + - type: DamageOtherOnHit + staminaCost: 7.5 - type: entity name: Kardashev-Mosin parent: [BaseWeaponSniper, BaseGunWieldable] id: WeaponSniperMosin - description: A weapon for hunting, or endless trench warfare. Uses .30 rifle ammo. + description: A weapon for hunting, or endless trench warfare, with a bayonet attached at the barrel. Uses .30 rifle ammo. components: - type: Sprite sprite: Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi @@ -56,6 +74,30 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/sniper.ogg fireOnDropChance: 1 + - type: MeleeWeapon + range: 1.75 + damage: + types: + Piercing: 5 + Slash: 3.5 + wideAnimationRotation: -135 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: IncreaseDamageOnWield + damage: + types: + Piercing: 4 + Slash: 2 + - type: DamageOtherOnHit + damage: + types: + Piercing: 8 + Slash: 3 + - type: EmbeddableProjectile + removalTime: 3.5 + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: entity name: Kardashev-Mosin @@ -114,15 +156,29 @@ capacity: 1 proto: CartridgeAntiMateriel - type: MeleeWeapon - wideAnimationRotation: -135 + range: 1.75 damage: types: - Piercing: 15 #you fucking stab em - Bloodloss: 2 #no way to apply bleed, triangular bayonet wounds are hard to fix(source:that one copypasta) - angle: 0 - animation: WeaponArcThrust + Piercing: 5 + Slash: 3.5 + wideAnimationRotation: -135 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: IncreaseDamageOnWield + damage: + types: + Piercing: 4 + Slash: 2 + - type: DamageOtherOnHit + damage: + types: + Piercing: 8 + Slash: 3 + - type: EmbeddableProjectile + removalTime: 3.5 + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: entity name: flintlock pistol @@ -152,4 +208,12 @@ proto: CartridgeAntiMateriel - type: StaticPrice price: 0 - + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 7.5 + bluntStaminaDamageFactor: 1.0 + wideAnimationRotation: 135 + - type: DamageOtherOnHit + staminaCost: 5 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml index 9b046a7aae..0ad30e9ed6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml @@ -37,3 +37,16 @@ slots: - Belt - suitStorage + - type: MeleeWeapon + attackRate: 1.2 + damage: + types: + Blunt: 6.5 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 135 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 4.5 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml index 1251172946..2f1527d359 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml @@ -61,6 +61,19 @@ storagebase: !type:Container ents: [] gas_tank: !type:ContainerSlot + - type: MeleeWeapon + attackRate: 1.33 + damage: + types: + Blunt: 9 + swapKeys: true + disableHeavy: true + animation: WeaponArcThrust + wideAnimationRotation: 180 + soundHit: + collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 8 - type: entity name: pie cannon diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml index 2d31e4372a..de22ef22c7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml @@ -10,7 +10,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 90 - attackRate: 0.75 + attackRate: 1.3333 damage: types: Slash: 25 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml index 60f599af93..60ba7aa2c3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml @@ -15,7 +15,7 @@ Blunt: 7.5 Structural: 5 bluntStaminaDamageFactor: 2.0 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyDamageBaseModifier: 1.75 heavyStaminaCost: 10 maxTargets: 2 @@ -28,6 +28,8 @@ types: Blunt: 4 Structural: 10 + - type: DamageOtherOnHit + staminaCost: 10 - type: Item size: Normal - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml index 5c26020d72..c2b9ac7a76 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml @@ -16,6 +16,7 @@ damage: types: Blunt: 5 + - type: DamageOtherOnHit - type: StaminaDamageOnHit damage: 5 - type: Wieldable @@ -38,7 +39,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 65 - attackRate: 1.5 + attackRate: .6666 damage: types: Slash: 14 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index d69173ff46..9fb4af58fe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -16,13 +16,13 @@ - type: MeleeWeapon autoAttack: true wideAnimationRotation: -135 - attackRate: 4 + attackRate: .25 damage: types: Slash: 2 Blunt: 2 Structural: 4 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyDamageBaseModifier: 1.0 heavyStaminaCost: 15 maxTargets: 20 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml index 3fee36a58a..c32563623a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml @@ -13,7 +13,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.85 + attackRate: 1.17 range: 1.75 damage: types: @@ -26,6 +26,11 @@ angle: 100 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 9 + - type: EmbeddableProjectile + - type: ThrowingAngle + angle: 225 - type: Wieldable - type: IncreaseDamageOnWield damage: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index ec1d8a82be..59c6d63c6e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -38,6 +38,14 @@ Slash: 8 Heat: 10 Structural: 20 + - type: ItemToggleDamageOtherOnHit + activatedStaminaCost: 6 + - type: ItemToggleEmbedPassiveDamage + - type: ItemToggleEmbeddableProjectile + activatedEmbedOnThrow: true + - type: ItemToggleThrowingAngle + activatedAngle: 225 + deleteOnDeactivate: true - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi layers: @@ -49,10 +57,14 @@ map: [ "blade" ] - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.25 + attackRate: .8 damage: types: Blunt: 4.5 + - type: DamageOtherOnHit + - type: EmbeddableProjectile + embedOnThrow: false + - type: EmbedPassiveDamage - type: Item size: Small sprite: DeltaV/Objects/Weapons/Melee/e_sword.rsi # Delta-V @@ -145,6 +157,12 @@ volume: -6 - type: ItemToggleDisarmMalus activatedDisarmMalus: 0.4 + - type: ItemToggleEmbeddableProjectile + activatedOffset: 0.0,0.0 + activatedRemovalTime: 3 + - type: ItemToggleThrowingAngle + activatedAngle: 135 + deleteOnDeactivate: false - type: Sprite sprite: Objects/Weapons/Melee/e_dagger.rsi layers: @@ -161,6 +179,21 @@ damage: types: Blunt: 1 + - type: DamageOtherOnHit + damage: + types: + Piercing: 3 + staminaCost: 3.5 + - type: EmbeddableProjectile + offset: 0.3,0.0 + removalTime: 0.0 + embedOnThrow: true + - type: EmbedPassiveDamage + damage: + types: + Blunt: 0 + - type: ThrowingAngle + angle: 315 - type: Item size: Tiny sprite: Objects/Weapons/Melee/e_dagger.rsi @@ -288,7 +321,7 @@ - type: Wieldable - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: .6666 angle: 100 damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index ffbb1c6d05..df060c2503 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -14,7 +14,7 @@ - type: MeleeWeapon wideAnimationRotation: 135 swingLeft: true - attackRate: 0.75 + attackRate: 1.3333 damage: types: # axes are kinda like sharp hammers, you know? @@ -26,6 +26,11 @@ angle: 100 soundHit: collection: MetalThud + - type: DamageOtherOnHit + meleeDamageMultiplier: 1.5 + staminaCost: 18 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage - type: Wieldable - type: IncreaseDamageOnWield damage: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/home_run_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/home_run_bat.yml index 43a4fb6c59..75e0e0764c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/home_run_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/home_run_bat.yml @@ -18,6 +18,9 @@ angle: 120 soundHit: collection: ExplosionSmall + - type: DamageOtherOnHit + soundHit: + collection: MetalThud # A throw won't knock them back so it's just a normal thud - type: MeleeRequiresWield # You can't hit a home run with one hand, jimbo. - type: MeleeThrowOnHit speed: 30 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 3705775dd6..8d6496e013 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -12,17 +12,22 @@ - Knife - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.25 + attackRate: .8 range: 1.5 damage: types: Slash: 8 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.2 maxTargets: 3 angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + sound: /Audio/Weapons/star_hit.ogg + - type: EmbedPassiveDamage - type: Sprite - type: Item size: Small @@ -52,6 +57,8 @@ - type: Sprite sprite: Objects/Weapons/Melee/kitchen_knife.rsi state: icon + - type: ThrowingAngle + angle: 225 - type: Item sprite: Objects/Weapons/Melee/kitchen_knife.rsi - type: GuideHelp @@ -78,6 +85,10 @@ types: Slash: 8 Blunt: 1 + - type: DamageOtherOnHit + staminaCost: 7.5 + - type: ThrowingAngle + angle: 245 - type: Item size: Normal sprite: Objects/Weapons/Melee/cleaver.rsi @@ -100,16 +111,12 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 - damage: - types: - Slash: 9 - - type: EmbeddableProjectile - sound: /Audio/Weapons/star_hit.ogg - - type: DamageOtherOnHit + attackRate: .6666 damage: types: Slash: 9 + - type: ThrowingAngle + angle: 225 - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi - type: DisarmMalus @@ -126,10 +133,12 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.25 + attackRate: .8 damage: types: Slash: 8 + - type: ThrowingAngle + angle: 225 - type: Item sprite: Objects/Weapons/Melee/survival_knife.rsi @@ -148,6 +157,8 @@ damage: types: Slash: 10 + - type: ThrowingAngle + angle: 225 - type: Item sprite: Objects/Weapons/Melee/kukri_knife.rsi @@ -163,14 +174,14 @@ node: icon - type: MeleeWeapon wideAnimationRotation: 90 - attackRate: 1.2 + attackRate: .83 damage: types: Slash: 5 - type: DamageOtherOnHit - damage: - types: - Slash: 10 + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage - type: Sprite sprite: Clothing/Head/Hats/greyflatcap.rsi - type: Clothing @@ -207,11 +218,13 @@ sprite: Objects/Weapons/Melee/shiv.rsi state: icon - type: MeleeWeapon - attackRate: 1.75 + attackRate: .57 range: 1.4 damage: types: Slash: 5.5 + - type: ThrowingAngle + angle: 200 - type: Item sprite: Objects/Weapons/Melee/shiv.rsi - type: DisarmMalus @@ -287,12 +300,10 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 2 + attackRate: .5 damage: types: Slash: 5 - - type: EmbeddableProjectile - sound: /Audio/Weapons/star_hit.ogg - type: DamageOtherOnHit ignoreResistances: true damage: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index 38a203ce90..900950cb9e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -57,6 +57,8 @@ angle: 120 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 8 - type: Wieldable - type: IncreaseDamageOnWield damage: @@ -94,6 +96,12 @@ heavyDamageBaseModifier: 1.2 maxTargets: 2 angle: 20 + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Tag tags: - Knife @@ -114,6 +122,10 @@ groups: Brute: -21 - type: MeleeWeapon + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Tag tags: - Pickaxe diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/needle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/needle.yml index 11efeba5f8..7ebbf3bf11 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/needle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/needle.yml @@ -12,6 +12,11 @@ damage: types: Piercing: 1 + - type: DamageOtherOnHit + - type: EmbeddableProjectile + removalTime: 0 + - type: ThrowingAngle + angle: 225 - type: Item size: Tiny - type: BalloonPopper diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml index 92bb33d177..ff01e5692e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml @@ -11,7 +11,7 @@ sprite: Objects/Weapons/Melee/pickaxe.rsi state: pickaxe - type: MeleeWeapon - attackRate: 0.85 + attackRate: 1.17 range: 1.5 wideAnimationRotation: -135 soundHit: @@ -26,6 +26,8 @@ heavyDamageBaseModifier: 1.75 maxTargets: 5 angle: 80 + - type: DamageOtherOnHit + staminaCost: 5 - type: Wieldable - type: IncreaseDamageOnWield damage: @@ -60,7 +62,7 @@ wideAnimationRotation: -90 soundHit: path: "/Audio/Items/drill_hit.ogg" - attackRate: 1.2 + attackRate: .83 range: 1.5 damage: types: @@ -72,6 +74,10 @@ heavyRangeModifier: 2 heavyDamageBaseModifier: 1 angle: 20 + - type: DamageOtherOnHit + staminaCost: 8 + - type: ThrowingAngle + angle: 270 - type: ReverseEngineering # Nyano difficulty: 2 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml index ffe791ce0c..99592e6a0f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml @@ -9,7 +9,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.75 + attackRate: 1.3333 range: 1.75 damage: types: @@ -23,6 +23,8 @@ angle: 120 soundHit: collection: MetalThud + - type: DamageOtherOnHit + staminaCost: 10 - type: Wieldable - type: IncreaseDamageOnWield damage: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml index 576d0b2a0c..ca5efc2daf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml @@ -6,6 +6,7 @@ components: - type: EmbeddableProjectile offset: 0.15,0.15 + - type: EmbedPassiveDamage - type: ThrowingAngle angle: 225 - type: Tag @@ -40,7 +41,7 @@ types: Piercing: 7 Slash: 1 - heavyRateModifier: 0.75 + heavyRateModifier: 1.3 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.0 heavyStaminaCost: 5 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml index 5214358ff9..6680c2a2c0 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml @@ -26,6 +26,7 @@ activatedDamage: types: Shock: 5 + - type: ItemToggleDamageOtherOnHit - type: Stunbaton energyPerUse: 120 - type: MeleeWeapon @@ -36,9 +37,10 @@ types: Blunt: 7.5 bluntStaminaDamageFactor: 2.0 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyDamageBaseModifier: 1.2 animation: WeaponArcThrust + - type: DamageOtherOnHit - type: StaminaDamageOnHit damage: 22 sound: /Audio/Weapons/egloves.ogg diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 046e9f76f7..2da3d3bb92 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -10,19 +10,25 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.25 + attackRate: .8 range: 1.75 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 15 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1 heavyDamageBaseModifier: 1 heavyStaminaCost: 5 maxTargets: 7 angle: 80 + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Reflect enabled: true # Design intent: a robust captain or tot can sacrifice movement to make the most of this weapon, but they have to @@ -55,18 +61,24 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: .6666 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 12 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyRangeModifier: 2.75 #Superior Japanese folded steel heavyDamageBaseModifier: 1.25 heavyStaminaCost: 15 maxTargets: 1 angle: 20 + - type: DamageOtherOnHit + staminaCost: 10 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Item size: Normal sprite: DeltaV/Objects/Weapons/Melee/katana.rsi #DeltaV @@ -86,6 +98,8 @@ damage: types: Slash: 25 + - type: ThrowingAngle + angle: 300 - type: Item size: Normal sprite: Objects/Weapons/Melee/energykatana.rsi @@ -121,17 +135,23 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.8 + attackRate: 1.25 damage: types: Slash: 15 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1.25 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 7.5 angle: 80 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Item size: Normal sprite: Objects/Weapons/Melee/machete.rsi @@ -149,14 +169,14 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.65 + attackRate: 1.53 range: 1.85 damage: types: Slash: 19 Blunt: 1 bluntStaminaDamageFactor: 25.0 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyRangeModifier: 1 heavyDamageBaseModifier: 1 heavyStaminaCost: 15 @@ -164,6 +184,12 @@ angle: 200 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 18 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Item size: Normal - type: Clothing @@ -187,11 +213,11 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.25 + attackRate: .8 damage: types: Slash: 12 - heavyRateModifier: 0.8 + heavyRateModifier: 1.25 heavyRangeModifier: 1.2 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 7.5 @@ -199,6 +225,12 @@ angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Item size: Normal sprite: Objects/Weapons/Melee/cutlass.rsi @@ -216,7 +248,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 10 + attackRate: .1 damage: types: Structural: 150 @@ -227,6 +259,7 @@ Radiation: 10 soundHit: path: /Audio/Effects/explosion_small1.ogg + - type: DamageOtherOnHit - type: Reflect enabled: true reflectProb: 0.5 # In robust hands, deflects as well as an e-sword diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml index 5e797c8536..7851a9403b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/telescopic_baton.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: TelescopicBaton parent: BaseItem name: telescopic baton @@ -26,6 +26,7 @@ activatedDamage: types: Blunt: 12 + - type: ItemToggleDamageOtherOnHit - type: ItemToggleSize activatedSize: Normal - type: UseDelay @@ -35,7 +36,7 @@ duration: 1.5 dropHeldItemsBehavior: NoDrop - type: MeleeWeapon - attackRate: 0.8 + attackRate: 1.25 bluntStaminaDamageFactor: 1.5 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 5 @@ -44,6 +45,8 @@ damage: types: Blunt: 1 + - type: DamageOtherOnHit + staminaCost: 6 - type: Appearance - type: GenericVisualizer visuals: @@ -64,7 +67,7 @@ - type: KnockdownOnHit duration: 60 # - type: MeleeWeapon - attackRate: 1.2 + attackRate: .83 - type: ItemToggleMeleeWeapon activatedDamage: types: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/weapon_toolbox.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/weapon_toolbox.yml index 240a17a0a4..408e3c6562 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/weapon_toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/weapon_toolbox.yml @@ -13,7 +13,7 @@ sprite: Objects/Tools/Toolboxes/toolbox_red.rsi - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: .6 damage: types: Blunt: 20 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml index 123de813cb..ec744764be 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml @@ -12,18 +12,19 @@ sprite: Objects/Weapons/Melee/white_cane.rsi - type: MeleeWeapon wideAnimationRotation: 45 - attackRate: 0.9 + attackRate: 1.1 range: 1.6 damage: types: Blunt: 6 bluntStaminaDamageFactor: 2.5 - heavyRateModifier: 0.5 + heavyRateModifier: 2 heavyRangeModifier: 1.75 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 0 maxTargets: 1 angle: 20 + - type: DamageOtherOnHit - type: Wieldable - type: IncreaseDamageOnWield damage: @@ -31,4 +32,3 @@ Blunt: 2 - type: UseDelay delay: 1 - diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml index c68feff0b5..293d284d52 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml @@ -36,6 +36,7 @@ types: Slash: 8 Piercing: 10 + - type: EmbedPassiveDamage - type: StaminaDamageOnCollide damage: 45 - type: StaminaDamageOnEmbed diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 1b07eab9fa..561af78a56 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -29,6 +29,7 @@ activatedDamage: types: Blunt: 0 + - type: ItemToggleDamageOtherOnHit - type: MeleeWeapon wideAnimationRotation: -135 damage: @@ -39,6 +40,7 @@ heavyDamageBaseModifier: 1.75 heavyStaminaCost: 1 animation: WeaponArcSlash + - type: DamageOtherOnHit - type: StaminaDamageOnHit damage: 35 sound: /Audio/Weapons/egloves.ogg @@ -109,10 +111,12 @@ heavyRateModifier: 1 heavyDamageBaseModifier: 1.2 heavyStaminaCost: 7.5 + - type: DamageOtherOnHit + staminaCost: 9 - type: Item size: Normal - type: Tag - tags: + tags: - Truncheon - type: Clothing sprite: Objects/Weapons/Melee/truncheon.rsi diff --git a/Resources/Prototypes/Entities/Structures/Decoration/floordecor.yml b/Resources/Prototypes/Entities/Structures/Decoration/floordecor.yml new file mode 100644 index 0000000000..2ed9c186ee --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Decoration/floordecor.yml @@ -0,0 +1,720 @@ +- type: entity + id: DecorFloorBase + abstract: true + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: Structures/Decoration/cave_decor.rsi + netsync: false + noRot: true + drawdepth: FloorObjects + - type: Damageable + damageModifierSet: Wood + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Transform + anchored: true + - type: Physics + bodyType: Static + canCollide: false + - type: Clickable + - type: InteractionOutline +# No fixture on this base, inherit from further down for fixture + +# Cave Decor +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard1 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_ns-1 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard2 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_ns-2 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard3 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_ns-3 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard4 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_ns-4 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard5 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_ns-5 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard6 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_ns-6 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard7 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_we-1 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard8 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_we-2 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard9 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_we-3 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard10 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_we-4 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard11 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_we-5 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard12 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_drought_we-6 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard13 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_ns-1 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard14 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_ns-2 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard15 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_ns-3 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard16 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_ns-4 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard17 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_ns-5 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard18 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_ns-6 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard19 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_we-1 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard20 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_we-2 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard21 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_we-3 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard22 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_we-4 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard23 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_we-5 + +- type: entity + parent: DecorFloorBase + id: DecorFloorBoard24 + name: floor board + description: Keep the mud off your feet. + components: + - type: Sprite + state: boards_mammoth_we-6 + +- type: entity + parent: DecorFloorBase + id: DecorStalagmite1 + name: stalagmite + description: Pointy rocks! Mites go up, tites come... + components: + - type: Sprite + state: stalagmite + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.20 + density: 1000 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + parent: DecorStalagmite1 + id: DecorStalagmite2 + components: + - type: Sprite + state: stalagmite1 + +- type: entity + parent: DecorStalagmite1 + id: DecorStalagmite3 + components: + - type: Sprite + state: stalagmite2 + +- type: entity + parent: DecorStalagmite1 + id: DecorStalagmite4 + components: + - type: Sprite + state: stalagmite3 + +- type: entity + parent: DecorStalagmite1 + id: DecorStalagmite5 + components: + - type: Sprite + state: stalagmite4 + +- type: entity + parent: DecorStalagmite1 + id: DecorStalagmite6 + components: + - type: Sprite + state: stalagmite5 + +- type: entity + parent: DecorStalagmite1 + id: DecorMinecart + name: minecrart + description: It seems to have fallen over... + components: + - type: Sprite + state: minecart_fallen + +- type: entity + parent: DecorFloorBase + id: DecorSignLeftMine + name: sign + description: A sign, for a mine, pointing li...left + components: + - type: Sprite + state: sign_left + +- type: entity + parent: DecorFloorBase + id: DecorSignRightMine + name: sign + description: A sign, pointing right. + components: + - type: Sprite + state: sign_right + +# World Decor +- type: entity + parent: DecorFloorBase + id: DecorFloorWorldBase + abstract: true + components: + - type: Sprite + sprite: Structures/Decoration/world.rsi + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorPaper + name: scattered paper + description: A mess of papers + suffix: 8 states + components: + - type: Sprite + sprite: Structures/Decoration/world.rsi + state: scattered_papers + # add destruction drop for materials + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorPaper1 + suffix: 4 states + name: scattered paper + description: A mess of papers + components: + - type: Sprite + state: papers_1 + +- type: entity + parent: DecorFloorPaper1 + id: DecorFloorPaper2 + components: + - type: Sprite + state: papers_2 + +- type: entity + parent: DecorFloorPaper1 + id: DecorFloorPaper3 + components: + - type: Sprite + state: papers_3 + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorScrapwood + name: wood scraps + description: wood scraps + suffix: 6 states + components: + - type: Sprite + state: woodscrap + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorBrickrubble + name: brick rubble + description: brick rubble + suffix: "6 states" + components: + - type: Sprite + state: brickrubble + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorCardboard + name: cardboard boxes + description: cardboard scrap boxes + suffix: "6 states" + components: + - type: Sprite + state: cardboard + # add destruction drop for materials + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorPallet + name: pallet + description: a wooden pallet. + suffix: "2 states" + components: + - type: Sprite + state: pallet + # add destruction drop for materials + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorPalletStack + name: pallet stack + description: a stack of wooden pallets + suffix: "2 states" + components: + - type: Sprite + state: pallet_stack + # add destruction drop for materials + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.20 + density: 1000 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + parent: DecorFloorPalletStack + id: DecorFloorBrickStack + name: brick stack + description: a neat stack of bricks + components: + - type: Sprite + state: brickpile + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorBookstack1 + name: book stack + description: a stack of books + components: + - type: Sprite + state: bookstack_1 + # add destruction drop for materials + +- type: entity + parent: DecorFloorBookstack1 + id: DecorFloorBookstack2 + components: + - type: Sprite + state: bookstack_2 + +- type: entity + parent: DecorFloorBookstack1 + id: DecorFloorBookstack3 + components: + - type: Sprite + state: bookstack_3 + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorBookPile1 + name: book pile + description: a pile of books + components: + - type: Sprite + state: bookpile_1 + # add destruction drop for materials + +- type: entity + parent: DecorFloorBookPile1 + id: DecorFloorBookPile2 + components: + - type: Sprite + state: bookpile_2 + +- type: entity + parent: DecorFloorBookPile1 + id: DecorFloorBookPile3 + components: + - type: Sprite + state: bookpile_3 + +- type: entity + parent: DecorFloorBookPile1 + id: DecorFloorBookPile4 + components: + - type: Sprite + state: bookpile_4 + +- type: entity + parent: DecorFloorBookPile1 + id: DecorFloorBookPile5 + components: + - type: Sprite + state: bookpile_5 + +- type: entity + parent: DecorFloorBookPile1 + id: DecorFloorBookPile6 + components: + - type: Sprite + state: bookpile_6 + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorFood1 + name: food stuff + description: some old food stuff + components: + - type: Sprite + state: foodstuff_1 + +- type: entity + parent: DecorFloorFood1 + id: DecorFloorFood2 + components: + - type: Sprite + state: foodstuff_2 + +- type: entity + parent: DecorFloorFood1 + id: DecorFloorFood3 + components: + - type: Sprite + state: foodstuff_3 + +- type: entity + parent: DecorFloorFood1 + id: DecorFloorFood4 + components: + - type: Sprite + state: foodstuff_4 + +- type: entity + parent: DecorFloorFood1 + id: DecorFloorFood5 + components: + - type: Sprite + state: foodstuff_5 + +- type: entity + parent: DecorFloorFood1 + id: DecorFloorFood6 + components: + - type: Sprite + state: foodstuff_6 + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorTrashbags1 + name: trash bags + description: some old trash bags + components: + - type: Sprite + state: trashbags_1 + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.20 + density: 1000 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + parent: DecorFloorTrashbags1 + id: DecorFloorTrashbags2 + components: + - type: Sprite + state: trashbags_2 + +- type: entity + parent: DecorFloorTrashbags1 + id: DecorFloorTrashbags3 + components: + - type: Sprite + state: trashbags_3 + +- type: entity + parent: DecorFloorTrashbags1 + id: DecorFloorTrashbags4 + components: + - type: Sprite + state: trashbags_4 + +- type: entity + parent: DecorFloorTrashbags1 + id: DecorFloorTrashbags5 + components: + - type: Sprite + state: trashbags_5 + +- type: entity + parent: DecorFloorTrashbags1 + id: DecorFloorTrashbags6 + components: + - type: Sprite + state: trashbags_6 + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorGlass1 + name: glass bottles + description: some old glass scraps + components: + - type: Sprite + state: glass_1 + # add glass shard destruction + +- type: entity + parent: DecorFloorGlass1 + id: DecorFloorGlass2 + components: + - type: Sprite + state: glass_2 + +- type: entity + parent: DecorFloorGlass1 + id: DecorFloorGlass3 + components: + - type: Sprite + state: glass_3 + +- type: entity + parent: DecorFloorGlass1 + id: DecorFloorGlass4 + components: + - type: Sprite + state: glass_4 + +- type: entity + parent: DecorFloorGlass1 + id: DecorFloorGlass5 + components: + - type: Sprite + state: glass_5 + +- type: entity + parent: DecorFloorGlass1 + id: DecorFloorGlass6 + components: + - type: Sprite + state: glass_6 + +- type: entity + parent: DecorFloorWorldBase + id: DecorSignMines + name: mines + description: danger of mines and death... + components: + - type: Sprite + state: mine_sign + +- type: entity + parent: DecorFloorWorldBase + id: DecorFloorSkeleton + name: skeleton + description: looks a little worse for wear + components: + - type: Sprite + state: skeleton + +- type: entity + parent: DecorFloorWorldBase + id: DecorBarrels + name: barrels + description: a bunch of old rusty barrels. + components: + - type: Sprite + layers: + - state: barrels1 + map: [ "body" ] + - type: RandomSprite + available: + - body: + barrels1: "" + barrels2: "" + barrels3: "" + barrels4: "" + barrels5: "" + barrels6: "" + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.3 + density: 1000 + mask: + - MachineMask + layer: + - MachineLayer + +- type: entity + parent: DecorFloorSkeleton + id: DecorFloorSkeletonOver + suffix: draws over objects + components: + - type: Sprite + drawdepth: Mobs diff --git a/Resources/Prototypes/Entities/Structures/Decoration/rails.yml b/Resources/Prototypes/Entities/Structures/Decoration/rails.yml new file mode 100644 index 0000000000..a41b474622 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Decoration/rails.yml @@ -0,0 +1,95 @@ +- type: entity + id: Rails + name: railway + placement: + mode: SnapgridCenter + components: + - type: Sprite + sprite: Structures/Decoration/rails64.rsi + state: rails + netsync: false + drawdepth: FloorObjects + - type: Damageable + damageModifierSet: Wood + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Transform + anchored: true + - type: Physics + bodyType: Static + canCollide: false + - type: Clickable + +- type: entity + parent: Rails + id: RailsJunctionRightTop + suffix: junction right top + components: + - type: Sprite + state: junction-right-top + +- type: entity + parent: Rails + id: RailsJunctionLeftTop + suffix: junction left top + components: + - type: Sprite + state: junction-left-top + +- type: entity + parent: Rails + id: RailsJunctionRightBottom + suffix: junction right bottom + components: + - type: Sprite + state: junction-right-bottom + +- type: entity + parent: Rails + id: RailsJunctionLeftBottom + suffix: junction left bottom + components: + - type: Sprite + state: junction-left-bottom + +- type: entity + parent: Rails + id: RailsTurnWS + suffix: turn west-south + components: + - type: Sprite + state: turn-WS + +- type: entity + parent: Rails + id: RailsTurnNW + suffix: turn north-west + components: + - type: Sprite + state: turn-NW + +- type: entity + parent: Rails + id: RailsTurnNE + suffix: turn north-east + components: + - type: Sprite + state: turn-NE + +- type: entity + parent: Rails + id: RailsTurnSE + suffix: turn south-east + components: + - type: Sprite + state: turn-SE diff --git a/Resources/Prototypes/Entities/Structures/Decoration/torches.yml b/Resources/Prototypes/Entities/Structures/Decoration/torches.yml new file mode 100644 index 0000000000..1646ec9f70 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Decoration/torches.yml @@ -0,0 +1,73 @@ +- type: entity + id: Torch2 + name: torch + suffix: floor + description: A flaming torch for lighting an area. + placement: + mode: SnapgridCenter + components: + - type: Transform + anchored: true + - type: Clickable + - type: InteractionOutline + - type: Physics + bodyType: Static + canCollide: false + - type: Sprite + netsync: false + noRot: true + sprite: Structures/Decoration/torches.rsi + state: torch_unlit + - type: Appearance + - type: Reactive + groups: + Flammable: [ Touch ] + Extinguish: [ Touch ] + - type: ExtinguishOnInteract + extinguishAttemptSound: + path: /Audio/Items/candle_blowing.ogg + params: + variation: 0.05 + volume: 10 + - type: UseDelay + - type: Flammable + fireSpread: false + canResistFire: false + alwaysCombustible: true + canExtinguish: true + firestacksOnIgnite: 3.0 + firestackFade: -0.01 + damage: + types: + Heat: 0.1 + - type: FireVisuals + sprite: Structures/Decoration/torches.rsi + normalState: torch_lit + - type: Damageable + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: ToggleableLightVisuals + spriteLayer: null + - type: PointLight + color: "#e39c40" + radius: 5 + power: 16 + +- type: entity + parent: Torch2 + id: TorchWall + suffix: wall + components: + - type: Sprite + noRot: false + state: wall_torch_unlit + - type: FireVisuals + sprite: Structures/Decoration/torches.rsi + normalState: wall_torch_lit diff --git a/Resources/Prototypes/Entities/Structures/Furniture/Tables/base_structuretables.yml b/Resources/Prototypes/Entities/Structures/Furniture/Tables/base_structuretables.yml index dbef5a7504..7a926d66d3 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/Tables/base_structuretables.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/Tables/base_structuretables.yml @@ -40,7 +40,8 @@ footstepSoundCollection: collection: FootstepHull - type: RequireProjectileTarget - + - type: ThrownItemImmune + - type: entity id: CounterBase parent: TableBase diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml index 7d7bc94bb3..787421556d 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml @@ -49,6 +49,11 @@ node: done containers: - entity_storage + - type: DamageOtherOnHit + damage: + types: + Blunt: 10 + staminaCost: 35 - type: entity id: LockerBaseSecure diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml index c1efc5a63f..aa1d53a065 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -43,6 +43,11 @@ stateBaseClosed: secure stateDoorOpen: secure_open stateDoorClosed: secure_door + - type: DamageOtherOnHit + damage: + types: + Blunt: 15 + staminaCost: 50 # Cargo - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index e966a41780..9d89f86a7a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -98,6 +98,11 @@ stateDoorClosed: generic_door - type: StaticPrice price: 50 + - type: DamageOtherOnHit + damage: + types: + Blunt: 10 + staminaCost: 35 # steel closet base (that can be constructed/deconstructed) - type: entity @@ -109,6 +114,11 @@ node: done containers: - entity_storage + - type: DamageOtherOnHit + damage: + types: + Blunt: 15 + staminaCost: 50 #Wall Closet - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index bd76a87f55..bd8281f194 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -12,6 +12,11 @@ - Energy reflectProb: 0.2 spread: 90 + - type: DamageOtherOnHit + damage: + types: + Blunt: 16 + staminaCost: 45 - type: entity parent: CrateBaseWeldable @@ -29,6 +34,11 @@ - entity_storage - type: StaticPrice price: 80 + - type: DamageOtherOnHit + damage: + types: + Blunt: 10 + staminaCost: 30 - type: entity parent: CratePlastic @@ -140,7 +150,7 @@ map: ["enum.StorageVisualLayers.Door"] - state: paper sprite: Structures/Storage/Crates/labels.rsi - map: ["enum.PaperLabelVisuals.Layer"] + map: ["enum.PaperLabelVisuals.Layer"] - type: Construction graph: WebStructures node: crate @@ -338,7 +348,7 @@ - state: paper sprite: Structures/Storage/Crates/labels.rsi offset: "-0.25,0.625" - map: ["enum.PaperLabelVisuals.Layer"] + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/livestock.rsi state: base @@ -393,7 +403,7 @@ - state: paper sprite: Structures/Storage/Crates/labels.rsi offset: "0.0,0.125" - map: ["enum.PaperLabelVisuals.Layer"] + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/cage.rsi - type: Destructible @@ -495,7 +505,7 @@ - state: closed map: ["enum.StorageVisualLayers.Door"] - state: paper - map: ["enum.PaperLabelVisuals.Layer"] + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/coffin.rsi state: base @@ -537,7 +547,7 @@ - state: paper sprite: Structures/Storage/Crates/labels.rsi offset: "-0.28125,0.625" - map: ["enum.PaperLabelVisuals.Layer"] + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/wooden_grave.rsi state: base @@ -585,7 +595,7 @@ - state: paper sprite: Structures/Storage/Crates/labels.rsi offset: "-0.3125,0.5625" - map: ["enum.PaperLabelVisuals.Layer"] + map: ["enum.PaperLabelVisuals.Layer"] - type: Icon sprite: Structures/Storage/Crates/stone_grave.rsi state: base diff --git a/Resources/Prototypes/Entities/Structures/Storage/barrels.yml b/Resources/Prototypes/Entities/Structures/Storage/barrels.yml new file mode 100644 index 0000000000..0cbbb2ede8 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Storage/barrels.yml @@ -0,0 +1,287 @@ +# Barrels +# Base +- type: entity + parent: BaseStructureDynamic + id: BaseBarrel + name: barrel + description: This barrel looks like it could contain something. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: blue-closed + netsync: false + noRot: true + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.2,-0.2,0.2,0.45" + density: 50 + mask: + - MachineMask + layer: + - WallLayer + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 5 + behaviors: + - !type:SolutionExplosionBehavior + solution: barrel + - trigger: + !type:DamageTypeTrigger + damageType: Piercing + damage: 5 + behaviors: + - !type:SolutionExplosionBehavior + solution: barrel + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:SpillBehavior + solution: barrel + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:DoActsBehavior + acts: ["Destruction"] + +# Base Open +- type: entity + parent: BaseBarrel + id: BaseBarrelOpen + suffix: open + categories: [ HideSpawnMenu ] + components: + - type: SolutionContainerManager + solutions: + barrel: + maxVol: 500 + - type: DrainableSolution + solution: barrel + - type: ReagentTank + +# Closed +- type: entity + parent: BaseBarrel + id: BlackBarrel + name: black barrel + description: A worn out black barrel. The label is torn off. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: black-closed + +- type: entity + parent: BaseBarrel + id: BlueBarrel + name: blue barrel + description: A blue barrel with a warning sign of. Maybe it contains water? + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: blue-closed + +- type: entity + parent: BaseBarrel + id: RedBarrel + name: red barrel + description: A red barrel with an explosive warning sign on. Better be careful. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: red-closed + - type: Explosive + explosionType: Default + totalIntensity: 120 # ~ 5 tile radius + +- type: entity + parent: BaseBarrel + id: YellowBarrel + name: yellow barrel + description: A yellow barrel with a radiation warning sign on. Better be careful. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: yellow-closed + - type: RadiationSource + intensity: 2 + slope: 1 + +# Open +- type: entity + parent: BaseBarrelOpen + id: BlackBarrelOpen + suffix: open + name: black barrel + description: A worn out black barrel. The label is torn off. The lid is off and you can see inside. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: black-open + +- type: entity + parent: BaseBarrelOpen + id: BlueBarrelOpen + suffix: open + name: blue barrel + description: A blue barrel with a warning sign of. The lid is off and you can see inside. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: blue-open + +- type: entity + parent: BaseBarrelOpen + id: RedBarrelOpen + suffix: open + name: red barrel + description: A red barrel with an explosive warning sign on. The lid is off and you can see inside. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: red-open + +- type: entity + parent: BaseBarrelOpen + id: YellowBarrelOpen + suffix: open + name: yellow barrel + description: A yellow barrel with a radiation warning sign on. The lid is off and you can see inside but it still makes you twitch. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: yellow-open + - type: RadiationSource + intensity: 1 + slope: 1 + +# Full barrels +- type: entity + parent: BlackBarrelOpen + id: BlackBarrelFull + suffix: full + description: A worn out black barrel. This one looks full of some dark liquid. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: black-full + # TODO - fill with some sort of waste product? Maybe just dirty water. + +- type: entity + parent: RedBarrelOpen + id: RedBarrelFull + suffix: full + description: A red barrel with an explosive warning sign on. It has a golden liquid inside. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: red-full + - type: SolutionContainerManager + solutions: + barrel: + reagents: + - ReagentId: WeldingFuel + Quantity: 500 + - type: DamageOnToolInteract + tools: + - Welding + weldingDamage: + types: + Heat: 10 + - type: Explosive + explosionType: Default + totalIntensity: 120 # ~ 5 tile radius + +- type: entity + parent: YellowBarrelOpen + id: YellowBarrelFull + suffix: full + description: A yellow barrel with a radiation warning sign on. You can see the glowing goo bubble. + components: + - type: Sprite + sprite: Structures/Storage/barrels.rsi + state: yellow-full + - type: RadiationSource + intensity: 3 + slope: 1 + - type: PointLight + netsync: false + radius: 1.5 + energy: 1.6 + color: "#3db83b" + castShadows: false + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1000 + behaviors: + - !type:SpillBehavior + solution: barrel + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:DoActsBehavior + acts: ["Destruction"] + # TODO - fill with some sort of radioactive waste reagent. + +# Burning Barrels +- type: entity + parent: BaseStructureDynamic + id: BurningBarrel + name: burnt barrel + description: This barrel looks like it once contained a fire. + components: + - type: Sprite + sprite: Structures/Storage/burningbarrel.rsi + state: burnbarrel + netsync: false + noRot: true + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.2 + density: 50 + mask: + - MachineMask + layer: + - MidImpassable + - LowImpassable + +- type: entity + parent: BurningBarrel + id: BurningBarrelLit + name: burning barrel + description: This barrel is smoldering. Toasty + components: + - type: Sprite + sprite: Structures/Storage/burningbarrel.rsi + state: burnbarrel_lit + netsync: false + - type: PointLight + color: "#E25822" + radius: 1.0 + energy: 5.0 + netsync: false + - type: LightBehaviour + behaviours: + - !type:RandomizeBehaviour # immediately make it bright and flickery + id: burnbarrel_lit + interpolate: Nearest + minDuration: 0.02 + maxDuration: 0.06 + startValue: 6.0 + endValue: 9.0 + property: Energy + isLooped: true diff --git a/Resources/Prototypes/Entities/Structures/Storage/closets.yml b/Resources/Prototypes/Entities/Structures/Storage/closets.yml new file mode 100644 index 0000000000..394840caf4 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Storage/closets.yml @@ -0,0 +1,228 @@ +# TODO:RESET:TIMEDSTORAGEFILL + +# Metal Closets +- type: entity + parent: ClosetBase + id: ClosetBase2 + abstract: true + components: + - type: Sprite + sprite: Structures/Storage/Closets/closet.rsi + layers: + - state: closet + map: ["enum.StorageVisualLayers.Base"] + - state: closet_door + map: ["enum.StorageVisualLayers.Door"] + - type: EntityStorageVisuals + stateBaseClosed: closet + stateDoorOpen: closet_open + stateDoorClosed: closet_door + - type: Transform + anchored: true + noRot: true + - type: Physics + bodyType: Static + - type: Anchorable # Makes the anchoring near impossible due to high time requirement + delay: 3600 + +- type: entity + parent: ClosetBase2 + id: ClosetBaseW + name: closet + description: A basic closet for storing things. + components: + - type: Weldable + - type: Sprite + noRot: true + netsync: false + sprite: Structures/Storage/Closets/closet.rsi + layers: + - state: closet + map: ["enum.StorageVisualLayers.Base"] + - state: closet_door + map: ["enum.StorageVisualLayers.Door"] + - state: welded + visible: false + map: ["enum.WeldableLayers.BaseWelded"] + - type: EntityStorageVisuals + stateBaseClosed: closet + stateDoorOpen: closet_open + stateDoorClosed: closet_door + + +- type: entity + parent: ClosetBaseW + id: ClosetGrey1 + components: + - type: Sprite + sprite: Structures/Storage/Closets/closetgrey.rsi + - type: Weldable + +- type: entity + id: ClosetGrey2 + parent: ClosetBaseW + components: + - type: Sprite + sprite: Structures/Storage/Closets/closetgrey2.rsi + +- type: entity + parent: ClosetBaseW + id: ClosetRusty + name: rusty closet + description: A rusty old closet for storing things. + components: + - type: Sprite + sprite: Structures/Storage/Closets/closetold.rsi + +- type: entity + parent: ClosetBaseW + id: ClosetGunCabinet + name: gun cabinet + description: A secure cabinet for storing guns. + components: + - type: Sprite + sprite: Structures/Storage/Closets/guncabinet.rsi + +- type: entity + parent: ClosetBaseW + id: ClosetFridgeDirty + name: fridge + description: A dirty old fridge for keeping food fresh + components: + - type: Sprite + sprite: Structures/Storage/Closets/fridgedirty.rsi + - type: ExplosionResistance + damageCoefficient: 0.90 + - type: AntiRottingContainer + +- type: entity + parent: ClosetBaseW + id: ClosetFridgeWideDirty + name: fridge + description: A dirty old fridge for keeping food fresh + components: + - type: Sprite + sprite: Structures/Storage/Closets/fridgewidedirty.rsi + - type: ExplosionResistance + damageCoefficient: 0.90 + - type: AntiRottingContainer + +- type: entity + parent: ClosetBaseW + id: ClosetDouble + name: double closet + description: A double closet for holding twice the things. + components: + - type: Sprite + sprite: Structures/Storage/Closets/doublecloset.rsi + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.15,-0.45,0.45,0.45" + density: 145 + mask: + - MachineMask + layer: + - MachineLayer + +# Wooden Closets + +- type: entity + parent: ClosetBase2 + id: ClosetCabinetWood + name: cabinet + description: An old pre-war wooden cabinet. + components: + - type: Sprite + sprite: Structures/Storage/Closets/cabinet.rsi + - type: Damageable + damageModifierSet: Wood + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 30 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 0 + max: 1 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Tag + tags: + - Wooden + +- type: entity + parent: ClosetBaseW + id: ClosetGeneric + suffix: generic roller + components: + - type: Sprite + sprite: Structures/Storage/Closets/closetgeneric.rsi + +# Wallmounted Closets +- type: entity + id: ClosetWallMedicabinet + placement: + mode: SnapgridCenter + name: medicabinet + description: A medicabinet mounted on the wall. + components: + - type: InteractionOutline + - type: Clickable + - type: ResistLocker + - type: Weldable + - type: WallMount + arc: 180 + - type: Transform + noRot: false + - type: Sprite + drawdepth: WallMountedItems + netsync: false + noRot: false + sprite: Structures/Storage/Closets/medicabinet.rsi + layers: + - state: closet + - state: closet_door + map: ["enum.StorageVisualLayers.Door"] + - state: welded + visible: false + map: ["enum.WeldableLayers.BaseWelded"] + - type: EntityStorage + isCollidableWhenOpen: true + enteringOffset: 0, -0.75 + closeSound: + path: /Audio/Items/deconstruct.ogg + openSound: + path: /Audio/Items/deconstruct.ogg + - type: ContainerContainer + containers: + entity_storage: !type:Container + ents: [] + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 150 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 1 + max: 1 diff --git a/Resources/Prototypes/Entities/Structures/Storage/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/crates.yml new file mode 100644 index 0000000000..e6292912b0 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Storage/crates.yml @@ -0,0 +1,227 @@ +- type: entity + parent: CrateGenericSteel + id: CrateFootlocker + name: footlocker + description: A footlocker for someones equipment. + components: + - type: Icon + sprite: Structures/Storage/Crates/footlocker.rsi + - type: Sprite + sprite: Structures/Storage/Crates/footlocker.rsi + - type: Reflect + reflects: + - Energy + reflectProb: 0.2 + spread: 90 + +- type: entity + parent: CrateGenericSteel + id: CrateAluminium + name: aluminium crate + description: An aluminium crate for storing stuff. + components: + - type: Icon + sprite: Structures/Storage/Crates/aluminiumcrate.rsi + - type: Sprite + sprite: Structures/Storage/Crates/aluminiumcrate.rsi + +- type: entity + parent: CrateGenericSteel + id: CrateArmy + name: army crate + description: A crate with a US Army star on. + components: + - type: Icon + sprite: Structures/Storage/Crates/armycrate.rsi + - type: Sprite + sprite: Structures/Storage/Crates/armycrate.rsi + +- type: entity + parent: CrateGenericSteel + id: CrateMedical2 + name: medical crate + description: A metal crate for storing medical equipment. + components: + - type: Icon + sprite: Structures/Storage/Crates/medicalcrate.rsi + - type: Sprite + sprite: Structures/Storage/Crates/medicalcrate.rsi + +- type: entity + parent: CrateGenericSteel + id: CrateRed + name: red crate + description: A faded red crate for storing stuff. + components: + - type: Icon + sprite: Structures/Storage/Crates/redcrate.rsi + - type: Sprite + sprite: Structures/Storage/Crates/redcrate.rsi + +- type: entity + parent: CrateGeneric + id: Trashbin + name: trash bin + description: A trash bin for putting rubbish in. + components: + - type: Icon + sprite: Structures/Storage/Crates/trashbin.rsi + - type: Sprite + sprite: Structures/Storage/Crates/trashbin.rsi + layers: + - state: base + map: ["enum.StorageVisualLayers.Base"] + - state: closed + map: ["enum.StorageVisualLayers.Door"] + +- type: entity + parent: CrateFootlocker + id: CrateTrashcart + name: trash cart + description: A trash cart for transporting waste. + components: + - type: Icon + sprite: Structures/Storage/Crates/trashcart.rsi + - type: Sprite + sprite: Structures/Storage/Crates/trashcart.rsi + - type: TileFrictionModifier + modifier: 0.4 + +- type: entity + parent: CrateGeneric + id: CrateFreezer2 + name: freezer + description: A freezer for keeping things cool. + components: + - type: Icon + sprite: Structures/Storage/Crates/freezer.rsi + - type: Sprite + sprite: Structures/Storage/Crates/freezer.rsi + layers: + - state: base + map: ["enum.StorageVisualLayers.Base"] + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - type: AntiRottingContainer + +# Wooden +- type: entity + parent: CrateGeneric + id: CrateWooden + name: wooden crate + components: + - type: Icon + sprite: Structures/Storage/Crates/cratewooden.rsi + state: icon + - type: Sprite + sprite: Structures/Storage/Crates/cratewooden.rsi + layers: + - state: base + map: ["enum.StorageVisualLayers.Base"] + - state: closed + map: ["enum.StorageVisualLayers.Door"] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.4,-0.4,0.4,0.29" + density: 50 + mask: + - SmallMobMask #this is so they can go under plastic flaps + layer: + - MachineLayer + +- type: entity + parent: CrateWooden + id: CrateMilitary + name: military crate + description: An old wooden crate. Looks like it might have some supplies in. + components: + - type: Icon + sprite: Structures/Storage/Crates/cratemilitary.rsi + - type: Sprite + sprite: Structures/Storage/Crates/cratemilitary.rsi + +# Breakable Crates (deconstruct or destroy) +- type: entity + parent: BaseStructureDynamic + id: CrateBreakBase + name: wooden crate + description: A wooden crate for storage. + abstract: true + components: + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 75 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 0 + max: 1 + - !type:EmptyAllContainersBehaviour + - type: Sprite + sprite: Structures/Storage/Crates/woodencrates.rsi + - type: Storage + grid: + - 0,0,6,3 + maxItemSize: Huge + - type: UserInterface + interfaces: + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [] + +- type: entity + parent: CrateBreakBase + id: CrateBreakWood + suffix: wood + components: + - type: Sprite + state: wood_crate + +- type: entity + parent: CrateBreakBase + id: CrateBreakPlain + suffix: plain + components: + - type: Sprite + state: plain_crate + +- type: entity + parent: CrateBreakBase + id: CrateBreakPlainDamaged + suffix: plain damaged + components: + - type: Sprite + state: plain_crate-1 # TODO: Make this random between states -1, -2 and -3 + +- type: entity + parent: CrateBreakBase + id: CrateBreakArmy + name: army crate + components: + - type: Sprite + state: army_crate + +- type: entity + parent: CrateBreakArmy + id: CrateBreakArmyDamaged + suffix: damaged + components: + - type: Sprite + state: army_crate-1 # TODO: Make this random between states -1 and -2 diff --git a/Resources/Prototypes/Entities/Structures/Storage/furniture.yml b/Resources/Prototypes/Entities/Structures/Storage/furniture.yml new file mode 100644 index 0000000000..6ea2a5e564 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Storage/furniture.yml @@ -0,0 +1,49 @@ +# Washing Machines +- type: entity + parent: ClosetBase + id: FurnitureWashingmachine + name: washing machine + description: wishy washy. + components: + - type: Sprite + sprite: Structures/Storage/Furniture/washingmachine.rsi + layers: + - state: generic + map: ["enum.StorageVisualLayers.Base"] + - state: generic_door + map: ["enum.StorageVisualLayers.Door"] + - type: EntityStorageVisuals + stateBaseClosed: generic + stateDoorOpen: generic_open + stateDoorClosed: generic_door + - type: Transform + anchored: true + noRot: false + - type: Physics + bodyType: Static + +- type: entity + parent: FurnitureWashingmachine + id: FurnitureWashingmachineIndustrial + suffix: Industrial + components: + - type: Sprite + sprite: Structures/Storage/Furniture/washingmachine_industrial.rsi + +# Safes +- type: entity + parent: ClosetBaseW + id: ClosetSafe + name: safe + description: Might be filled with valuables. + components: + - type: Sprite + sprite: Structures/Storage/Furniture/safe.rsi + +- type: entity + parent: ClosetSafe + id: ClosetSafeSpinner + suffix: spinner + components: + - type: Sprite + sprite: Structures/Storage/Furniture/safespinner.rsi diff --git a/Resources/Prototypes/Entities/Structures/Storage/tanks.yml b/Resources/Prototypes/Entities/Structures/Storage/tanks.yml new file mode 100644 index 0000000000..41038fb74d --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Storage/tanks.yml @@ -0,0 +1,182 @@ +# :TODO: Add the destroyed versions of these as a destruction spawn. + +- type: entity + parent: BaseStructure + id: StorageTankBase + name: storage tank + description: A liquids storage tank. + abstract: true + components: + - type: Sprite + noRot: true + - type: InteractionOutline + - type: Physics + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTypeTrigger + damageType: Heat + damage: 5 + behaviors: + - !type:SolutionExplosionBehavior + solution: tank + - trigger: + !type:DamageTypeTrigger + damageType: Piercing + damage: 5 + behaviors: + - !type:SolutionExplosionBehavior + solution: tank + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:SpillBehavior + solution: tank + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:DoActsBehavior + acts: ["Destruction"] + - type: SolutionContainerManager + solutions: + tank: + maxVol: 1500 + - type: DrainableSolution + solution: tank + - type: ReagentTank + - type: Transform + noRot: true + +# In use +- type: entity + id: StorageTankWide + parent: StorageTankBase + name: fuel tank + description: A fuel tank. It's used to store high amounts of fuel. + suffix: Empty + components: + - type: Sprite + sprite: Structures/Storage/tanksx64.rsi + layers: + - state: chemical_container + # - state: chemical_container + # map: ["enum.SolutionContainerLayers.Fill"] + # visible: false + - type: Appearance + # - type: SolutionContainerVisuals + # maxFillLevels: 3 + # fillBaseName: fueltank-2- + - type: ExaminableSolution + solution: tank + - type: ReagentTank + tankType: Fuel + - type: DamageOnToolInteract + tools: + - Welding + weldingDamage: + types: + Heat: 10 + - type: PacifismDangerousAttack + - type: Explosive + explosionType: Default + totalIntensity: 120 # ~ 5 tile radius + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.9,-0.5,0.9,0.2" + density: 155 + mask: + - MachineMask + layer: + - WallLayer + +- type: entity + parent: StorageTankWide + id: StorageTankWideFullFuel + suffix: Full + components: + - type: SolutionContainerManager + solutions: + tank: + reagents: + - ReagentId: WeldingFuel + Quantity: 2000 + + +- type: entity + parent: StorageTankWide + id: StorageTank2 + suffix: Empty + components: + - type: Sprite + sprite: Structures/Storage/tanksx64.rsi + layers: + - state: largetank_chemical + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.9,-0.7,-0.1,0.4" + density: 155 + mask: + - MachineMask + layer: + - WallLayer + +- type: entity + id: StorageTankFullFuel + parent: StorageTank2 + suffix: Full + components: + - type: SolutionContainerManager + solutions: + tank: + reagents: + - ReagentId: WeldingFuel + Quantity: 1500 + +- type: entity + id: StorageTankHuge + parent: StorageTankWide + suffix: Empty + components: + - type: Sprite + sprite: Structures/Storage/tanksx64.rsi + layers: + - state: largetank_chemical_huge + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.7,-0.7,0.2,0.6" + density: 155 + mask: + - MachineMask + layer: + - WallLayer + +- type: entity + id: StorageTankHugeFullFuel + parent: StorageTankHuge + suffix: Full + components: + - type: SolutionContainerManager + solutions: + tank: + reagents: + - ReagentId: WeldingFuel + Quantity: 2000 diff --git a/Resources/Prototypes/Entities/Structures/Wallmount/adverts.yml b/Resources/Prototypes/Entities/Structures/Wallmount/adverts.yml new file mode 100644 index 0000000000..53c2cb05f3 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmount/adverts.yml @@ -0,0 +1,19 @@ +- type: entity + parent: BaseSign + id: SignBase # for non directional signs otherwise remove snapCardinals: true + abstract: true + components: + - type: WallMount + arc: 360 + - type: Sprite + drawdepth: Overdoors + sprite: Structures/Wallmounts/signs_32x32.rsi + state: bar + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] diff --git a/Resources/Prototypes/Entities/Structures/Wallmount/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Wallmount/base_lighting.yml new file mode 100644 index 0000000000..bdbce362f4 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmount/base_lighting.yml @@ -0,0 +1,43 @@ +#Small lights +- type: entity + parent: SmallLight + id: LightSmallAlwayson + name: small light + suffix: Always on + description: "An always powered light." + components: + - type: Sprite + sprite: Structures/Wallmounts/lightbulbcaged.rsi + state: base + drawdepth: Overdoors + offset: 0, 1 # 0.75 is better but breaks for east west placement + - type: PointLight + energy: 1.0 + radius: 6 + softness: 1.1 + enabled: true + - type: WallMount + +- type: entity + parent: PoweredSmallLightEmpty + id: LightSmallEmpty + name: small light + description: "A light fixture. Draws power and produces light when equipped with a light bulb." + suffix: Empty + components: + - type: Sprite + sprite: Structures/Wallmounts/lightbulbcaged.rsi + state: empty + offset: 0, 1 + - type: WallMount + +- type: entity + parent: PoweredSmallLight + id: LightSmall + suffix: "" + components: + - type: Sprite + sprite: Structures/Wallmounts/lightbulbcaged.rsi + state: base + offset: 0, 1 + - type: WallMount diff --git a/Resources/Prototypes/Entities/Structures/Wallmount/monitors_televisions.yml b/Resources/Prototypes/Entities/Structures/Wallmount/monitors_televisions.yml new file mode 100644 index 0000000000..6cda440ada --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmount/monitors_televisions.yml @@ -0,0 +1,54 @@ +- type: entity + parent: BaseComputer + id: ComputerVDU + name: VDU + description: A wall mounted video display unit. + components: + - type: Sprite + drawdepth: Overdoors + sprite: Structures/Wallmounts/vdu.rsi + layers: + - map: ["computerLayerBody"] + state: VDU + - map: ["computerLayerKeyboard"] + state: keyboard + - map: ["computerLayerScreen"] + state: screen + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.20,-0.10,0.25,0.35" + density: 250 + mask: + - FullTileMask + layer: + - WallLayer + - type: WallMount + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: #excess damage, don't spawn entities. + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Transform + anchored: true + +# See terminals for more wall mounted versions diff --git a/Resources/Prototypes/Entities/Structures/Wallmount/noticeboard.yml b/Resources/Prototypes/Entities/Structures/Wallmount/noticeboard.yml new file mode 100644 index 0000000000..c02f56e249 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmount/noticeboard.yml @@ -0,0 +1,63 @@ +- type: entity + id: NoticeBoard2 + name: notice board + description: Something important to post? + placement: + mode: SnapgridCenter + components: + - type: WallMount + - type: Sprite + sprite: Structures/Wallmounts/noticeboard.rsi + layers: + - state: noticeboard + - state: notice-0 + - map: ["enum.StorageFillLayers.Fill"] + - type: StorageFillVisualizer + maxFillLevels: 6 + fillBaseName: notice + - type: Appearance + - type: InteractionOutline + - type: Clickable + - type: Transform + anchored: true + - type: Damageable + damageModifierSet: Wood + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 30 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Storage + grid: + - 0,0,4,3 + maxItemSize: Small + whitelist: + tags: + - Folder + - Document + - Write + - type: UserInterface + interfaces: + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + - type: ContainerContainer + containers: + storagebase: !type:Container + - type: Tag + tags: + - Wooden + - type: Construction + graph: NoticeBoard + node: noticeBoard diff --git a/Resources/Prototypes/Entities/Structures/Wallmount/signs.yml b/Resources/Prototypes/Entities/Structures/Wallmount/signs.yml new file mode 100644 index 0000000000..b7ea2004a6 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmount/signs.yml @@ -0,0 +1,154 @@ +# see adverts for sign base +# see street_furniture for floor signs + +# 32x32 +- type: entity + parent: SignBase + id: SignBar2 + name: bar sign + description: Bar! Get drunk here. + components: + - type: Sprite + sprite: Structures/Wallmounts/signs_32x32.rsi + state: bar + +- type: entity + parent: SignBar2 + id: SignClinic + name: clinic sign + description: A clinic sign. Hopefully they have meds. + components: + - type: Sprite + state: clinic + - type: PointLight + radius: 3 + energy: 1 + color: '#00ff00' + +- type: entity + parent: SignBar2 + id: SignOpen1 + name: open sign + description: Open for business. Maybe. + components: + - type: Sprite + state: open + - type: PointLight + radius: 3 + energy: 1 + color: '#ff0000' + +- type: entity + parent: SignOpen1 + id: SignOpen2 + components: + - type: Sprite + state: open_bar + +- type: entity + parent: SignOpen1 + id: SignOpenOn1 + components: + - type: Sprite + state: open_on + +- type: entity + parent: SignOpen1 + id: SignOpenOn2 + components: + - type: Sprite + state: open_bar_on + +- type: entity + parent: SignBase + id: SignForRent + name: for rent sign + description: A sign advertising a place for rent. + components: + - type: Sprite + sprite: Structures/Wallmounts/signs_32x32.rsi + state: rent + +- type: entity + parent: SignBase + id: SignNotice + name: notice sign + description: NOTICE! + components: + - type: Sprite + sprite: Structures/Wallmounts/walldecor.rsi + state: notice_sign + +- type: entity + parent: SignNotice + id: SignDanger2 + name: danger sign + description: Danger. + components: + - type: Sprite + state: danger_sign + +- type: entity + parent: SignNotice + id: WallDecorExitsign + name: exit sign + description: A sign that says EXIT. I wonder what it means. + components: + - type: Sprite + state: exit + noRot: true + +# 64x32 +- type: entity + parent: SignBar2 + id: SignBazaarOn + name: bazaar sign + description: A sign for a bazaar. How bizarre. + components: + - type: Sprite + sprite: Structures/Wallmounts/signs_64x32.rsi + state: bazaar_on + - type: PointLight + radius: 2 + energy: 1 + color: '#ff8000' + +- type: entity + parent: SignBazaarOn + id: SignHotel + name: hotel sign + description: A sign for a hotel. Get a room! + components: + - type: Sprite + state: hotel + +- type: entity + parent: SignBazaarOn + id: SignPrivateProperty + name: private property sign + description: A private property sign. + components: + - type: Sprite + state: private + +- type: entity + parent: SignBazaarOn + id: SignOpenBig + name: open sign + description: We are open sign. I hope so. + components: + - type: Sprite + state: we_open_open + - type: PointLight + radius: 2 + energy: 1 + color: '#ff0000' + +- type: entity + parent: SignBazaarOn + id: SignWorkersOnly + name: workers only sign + description: No tresspassing! + components: + - type: Sprite + state: workers diff --git a/Resources/Prototypes/Entities/Structures/Wallmount/wallmounts.yml b/Resources/Prototypes/Entities/Structures/Wallmount/wallmounts.yml new file mode 100644 index 0000000000..9946e6b2db --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmount/wallmounts.yml @@ -0,0 +1,45 @@ +# For wallmount things that don't fit in any other file. + +# Safes + +# Vents +- type: entity + parent: BaseSign + id: WallmountVent + name: vent + description: An airvent. Could be a good stash. + components: + - type: WallMount + arc: 360 + - type: Sprite + drawdepth: Overdoors + sprite: Structures/Storage/storage.rsi + state: vent + - type: SecretStash + secretPartName: secret-stash-part-vent + maxItemSize: Normal + - type: ContainerContainer + containers: + stash: !type:ContainerSlot {} + - type: PottedPlantHide # TODO: This needs changed to be generic stash hide? + +- type: entity + parent: WallmountVent + id: WallmountVentDamaged + suffix: damaged + components: + - type: Sprite + sprite: Structures/Storage/storage.rsi + state: vent-damaged + +- type: entity + parent: WallmountVent + id: WallmountVentOpen + suffix: open + components: + - type: Sprite + sprite: Structures/Storage/storage.rsi + state: vent-open + + +# First Aid diff --git a/Resources/Prototypes/Entities/Structures/base_structure.yml b/Resources/Prototypes/Entities/Structures/base_structure.yml index 71971a6624..207881894b 100644 --- a/Resources/Prototypes/Entities/Structures/base_structure.yml +++ b/Resources/Prototypes/Entities/Structures/base_structure.yml @@ -25,6 +25,11 @@ - type: Tag tags: - Structure + - type: DamageOtherOnHit + damage: + types: + Blunt: 8 + staminaCost: 50 - type: entity # This means that it's not anchored on spawn. diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index cb7aed17ef..c0f446adbe 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -189,11 +189,11 @@ prob: 0.02 - id: MobMouse2 prob: 0.02 - - id: MobMouseCancer - prob: 0.001 - specialEntries: - - id: SpawnPointGhostRatKing - prob: 0.001 + #- id: MobMouseCancer + # prob: 0.001 + #specialEntries: + #- id: SpawnPointGhostRatKing + # prob: 0.001 - type: entity id: CockroachMigration diff --git a/Resources/Prototypes/Guidebook/antagonist.yml b/Resources/Prototypes/Guidebook/antagonist.yml index 081ff7ef0a..4b27544680 100644 --- a/Resources/Prototypes/Guidebook/antagonist.yml +++ b/Resources/Prototypes/Guidebook/antagonist.yml @@ -9,6 +9,7 @@ - Revolutionaries - MinorAntagonists - SpaceNinja + - BloodCult - type: guideEntry id: Traitors @@ -39,3 +40,8 @@ id: SpaceNinja name: guide-entry-space-ninja text: "/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml" + +- type: guideEntry + id: BloodCult + name: guide-entry-blood-cult + text: "/ServerInfo/Guidebook/Antagonist/BloodCult.xml" diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Fun/instruments.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Fun/instruments.yml index 67978f89fe..764ff9ed66 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Fun/instruments.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Fun/instruments.yml @@ -43,11 +43,12 @@ soundHit: path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg bluntStaminaDamageFactor: 4.5 - attackRate: 1.25 + attackRate: .8 range: 1.85 damage: types: Blunt: 7 + - type: DamageOtherOnHit - type: Wieldable - type: IncreaseDamageOnWield damage: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/blunt.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/blunt.yml index a9a5a82937..f7b3dacb77 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/blunt.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/blunt.yml @@ -10,7 +10,7 @@ - type: Item size: Normal - type: MeleeWeapon - attackRate: 0.75 + attackRate: 1.3333 range: 1.75 damage: types: @@ -21,6 +21,8 @@ # - type: MeleeStaminaCost # swing: 10 # wieldCoefficient: 0.35 #if wielded you will only consume 3.5 stam its a weapon after all + - type: DamageOtherOnHit + staminaCost: 10 - type: Wieldable - type: IncreaseDamageOnWield damage: @@ -42,7 +44,7 @@ sprite: Nyanotrasen/Objects/Weapons/Melee/shinai.rsi state: icon - type: MeleeWeapon - attackRate: 1.25 + attackRate: .8 range: 1.75 bluntStaminaDamageFactor: 2.0 damage: @@ -52,10 +54,10 @@ collection: WoodDestroy # - type: MeleeStaminaCost # swing: 5 + - type: DamageOtherOnHit - type: StaminaDamageOnHit damage: 10 - type: Item size: Normal sprite: Nyanotrasen/Objects/Weapons/Melee/shinai.rsi - type: DisarmMalus - diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/breaching_hammer.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/breaching_hammer.yml index d019cee136..2c6bba1cbe 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/breaching_hammer.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/breaching_hammer.yml @@ -10,7 +10,7 @@ - type: Item size: Huge - type: MeleeWeapon - attackRate: 0.75 + attackRate: 1.3333 range: 1.70 damage: types: @@ -23,6 +23,8 @@ # - type: MeleeStaminaCost # swing: 10 # wieldCoefficient: 0.5 #if wielded you will only consume 5 + - type: DamageOtherOnHit + staminaCost: 12 - type: Wieldable - type: IncreaseDamageOnWield damage: @@ -46,5 +48,3 @@ quickEquip: false slots: - back - - diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/dulled.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/dulled.yml index 9cab55f2a7..4fd986190f 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/dulled.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/dulled.yml @@ -16,6 +16,10 @@ types: Blunt: 5 Slash: 1 + - type: DamageOtherOnHit + staminaCost: 10 + - type: ThrowingAngle + angle: 225 - type: Item size: Normal sprite: Objects/Weapons/Melee/katana.rsi @@ -31,11 +35,15 @@ sprite: Objects/Weapons/Melee/claymore.rsi state: icon - type: MeleeWeapon - attackRate: 0.75 + attackRate: 1.3333 damage: types: Blunt: 6 Slash: 1 + - type: DamageOtherOnHit + staminaCost: 18 + - type: ThrowingAngle + angle: 225 - type: Item size: Normal - type: Clothing diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/knives.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/knives.yml index 4ac4dacdc5..b2ee1bcfdc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/knives.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/knives.yml @@ -5,7 +5,7 @@ description: A special knife designed for killing psychics. components: - type: MeleeWeapon - attackRate: 1.5 + attackRate: .6666 damage: types: Slash: 10 diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/sword.yml index f2604f044f..8335bf53f5 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Weapons/Melee/sword.yml @@ -15,12 +15,16 @@ sprite: Nyanotrasen/Objects/Weapons/Melee/wakizashi.rsi state: icon - type: MeleeWeapon - attackRate: 2 + attackRate: .5 damage: types: Slash: 12 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage - type: Item size: Normal sprite: Nyanotrasen/Objects/Weapons/Melee/wakizashi.rsi diff --git a/Resources/Prototypes/Nyanotrasen/GameRules/events.yml b/Resources/Prototypes/Nyanotrasen/GameRules/events.yml index 8612fb0fec..b926f151fe 100644 --- a/Resources/Prototypes/Nyanotrasen/GameRules/events.yml +++ b/Resources/Prototypes/Nyanotrasen/GameRules/events.yml @@ -24,13 +24,13 @@ earliestStart: 25 - type: MidRoundAntagRule -- type: entity - categories: [ HideSpawnMenu ] - parent: BaseMidRoundAntag - id: RatKingSpawn - components: - - type: MidRoundAntagRule - spawner: SpawnPointGhostRatKing +#- type: entity +# categories: [ HideSpawnMenu ] +# parent: BaseMidRoundAntag +# id: RatKingSpawn +# components: +# - type: MidRoundAntagRule +# spawner: SpawnPointGhostRatKing - type: entity categories: [ HideSpawnMenu ] diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index 6929d1e1a4..fb4ce6f4a1 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -16,7 +16,7 @@ RDHardsuitStealObjective: 1 NukeDiskStealObjective: 1 MagbootsStealObjective: 1 - # CorgiMeatStealObjective: 1 # DeltaV - Disable the horrible murder of Ian as an objective + CorgiMeatStealObjective: 1 MantisKnifeStealObjective: 1 # Nyanotrasen - ForensicMantis steal objective, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml ClipboardStealObjective: 1 CaptainGunStealObjective: 0.5 @@ -38,8 +38,8 @@ id: TraitorObjectiveGroupState weights: EscapeShuttleObjective: 1 - # DieObjective: 0.05 # DeltaV - Disable the lrp objective aka murderbone justification - #HijackShuttleObjective: 0.02 + DieObjective: 0.05 + HijackShuttleObjective: 0.02 - type: weightedRandom id: TraitorObjectiveGroupSocial @@ -48,7 +48,6 @@ RandomTraitorProgressObjective: 1 RaiseGlimmerObjective: 0.5 # Nyanotrasen - Raise glimmer to a target amount, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml - #Thief groups - type: weightedRandom id: ThiefObjectiveGroups @@ -67,37 +66,35 @@ weights: ThiefObjectiveGroupEscape: 1 - - - type: weightedRandom id: ThiefObjectiveGroupCollection weights: - HeadCloakStealCollectionObjective: 1 #command + HeadCloakStealCollectionObjective: 1 #command HeadBedsheetStealCollectionObjective: 1 StampStealCollectionObjective: 1 DoorRemoteStealCollectionObjective: 1 - TechnologyDiskStealCollectionObjective: 1 #rnd - FigurineStealCollectionObjective: 0.3 #service + TechnologyDiskStealCollectionObjective: 1 #rnd + FigurineStealCollectionObjective: 0.3 #service IDCardsStealCollectionObjective: 1 LAMPStealCollectionObjective: 2 #only for moth - type: weightedRandom id: ThiefObjectiveGroupItem weights: - ForensicScannerStealObjective: 1 #sec + ForensicScannerStealObjective: 1 #sec FlippoEngravedLighterStealObjective: 0.5 ClothingHeadHatWardenStealObjective: 1 - ClothingOuterHardsuitVoidParamedStealObjective: 1 #med + ClothingOuterHardsuitVoidParamedStealObjective: 1 #med MedicalTechFabCircuitboardStealObjective: 1 ClothingHeadsetAltMedicalStealObjective: 1 - FireAxeStealObjective: 1 #eng + FireAxeStealObjective: 1 #eng AmePartFlatpackStealObjective: 1 - ExpeditionsCircuitboardStealObjective: 1 #sup + ExpeditionsCircuitboardStealObjective: 1 #sup CargoShuttleCircuitboardStealObjective: 1 SalvageShuttleCircuitboardStealObjective: 1 - ClothingEyesHudBeerStealObjective: 1 #srv + ClothingEyesHudBeerStealObjective: 1 #srv BibleStealObjective: 1 - ClothingNeckGoldmedalStealObjective: 1 #other + ClothingNeckGoldmedalStealObjective: 1 #other ClothingNeckClownmedalStealObjective: 0.5 - type: weightedRandom diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index c9faeb80fd..f9dfe5c310 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -34,7 +34,7 @@ limit: 2 # there is usually only 1 of each steal objective, have 2 max for drama - type: entity # Head of Security steal objective. - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseTraitorStealObjective id: HoSAntiqueWeaponStealObjective components: @@ -50,7 +50,7 @@ # state - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: [BaseTraitorObjective, BaseLivingObjective] id: EscapeShuttleObjective name: Escape to centcom alive and unrestrained. @@ -63,43 +63,43 @@ state: shuttle - type: EscapeShuttleCondition -##- type: entity # DeltaV -# categories: [ HideSpawnMenu ] -# parent: BaseTraitorObjective -# id: DieObjective -# name: Die a glorious death -# description: Die. -# components: -# - type: Objective -# difficulty: 0.5 -# icon: -# sprite: Mobs/Ghosts/ghost_human.rsi -# state: icon -# - type: ObjectiveBlacklistRequirement -# blacklist: -# components: -# - EscapeShuttleCondition -# - StealCondition -# - type: DieCondition +- type: entity + categories: [HideSpawnMenu] + parent: BaseTraitorObjective + id: DieObjective + name: Die a glorious death + description: Die. + components: + - type: Objective + difficulty: 0.5 + icon: + sprite: Mobs/Ghosts/ghost_human.rsi + state: icon + - type: ObjectiveBlacklistRequirement + blacklist: + components: + - EscapeShuttleCondition + - StealCondition + - type: DieCondition -#- type: entity -# categories: [ HideSpawnMenu ] -# parent: [BaseTraitorObjective, BaseLivingObjective] -# id: HijackShuttleObjective -# name: Hijack emergency shuttle -# description: Leave on the shuttle free and clear of the loyal Nanotrasen crew on board. Use ANY methods available to you. Syndicate agents, Nanotrasen enemies, and handcuffed hostages may remain alive on the shuttle. Ignore assistance from anyone other than a support agent. -# components: -# - type: Objective -# difficulty: 5 # insane, default config max difficulty -# icon: -# sprite: Objects/Tools/emag.rsi -# state: icon -# - type: HijackShuttleCondition +- type: entity + categories: [HideSpawnMenu] + parent: [BaseTraitorObjective, BaseLivingObjective] + id: HijackShuttleObjective + name: Hijack emergency shuttle + description: Leave on the shuttle free and clear of the loyal Nanotrasen crew on board. Use ANY methods available to you. Syndicate agents, Nanotrasen enemies, and handcuffed hostages may remain alive on the shuttle. Ignore assistance from anyone other than a support agent. + components: + - type: Objective + difficulty: 5 # insane, default config max difficulty + icon: + sprite: Objects/Tools/emag.rsi + state: icon + - type: HijackShuttleCondition # kill - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: [BaseTraitorObjective, BaseKillObjective] id: KillRandomPersonObjective description: Do it however you like, just make sure they don't make it to centcom. @@ -112,7 +112,7 @@ - type: PickRandomPerson - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: [BaseTraitorObjective, BaseKillObjective] id: KillRandomHeadObjective description: We need this head gone and you probably know why. Good luck, agent. @@ -133,7 +133,7 @@ # social - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: [BaseTraitorSocialObjective, BaseKeepAliveObjective] id: RandomTraitorAliveObjective description: Identify yourself at your own risk. We just need them alive. @@ -145,7 +145,7 @@ - type: RandomTraitorAlive - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: [BaseTraitorSocialObjective, BaseHelpProgressObjective] id: RandomTraitorProgressObjective description: Identify yourself at your own risk. We just need them to succeed. @@ -171,7 +171,7 @@ owner: job-name-cmo - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseCMOStealObjective id: CMOHyposprayStealObjective components: @@ -202,7 +202,7 @@ owner: job-name-rd - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseRDStealObjective id: RDHardsuitStealObjective components: @@ -214,7 +214,7 @@ difficulty: 3 - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseRDStealObjective id: HandTeleporterStealObjective components: @@ -225,7 +225,7 @@ ## hos - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseTraitorStealObjective id: SecretDocumentsStealObjective components: @@ -242,7 +242,7 @@ ## ce - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseTraitorStealObjective id: MagbootsStealObjective components: @@ -256,7 +256,7 @@ ## qm - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseTraitorStealObjective id: ClipboardStealObjective components: @@ -270,7 +270,7 @@ ## hop - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseTraitorStealObjective id: CorgiMeatStealObjective components: @@ -296,7 +296,7 @@ job: Captain - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseCaptainObjective id: CaptainIDStealObjective components: @@ -305,7 +305,7 @@ verifyMapExistence: true - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseCaptainObjective id: CaptainJetpackStealObjective components: @@ -314,7 +314,7 @@ verifyMapExistence: true - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseCaptainObjective id: CaptainGunStealObjective components: @@ -324,7 +324,7 @@ verifyMapExistence: true - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseCaptainObjective id: NukeDiskStealObjective components: @@ -340,7 +340,7 @@ owner: objective-condition-steal-station - type: entity - categories: [ HideSpawnMenu ] + categories: [HideSpawnMenu] parent: BaseTraitorStealObjective id: StealSupermatterSliverObjective components: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/mime_hardsuit.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/mime_hardsuit.yml index 4d9c55fbc6..a72a5ccc8c 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/mime_hardsuit.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/mime_hardsuit.yml @@ -1,43 +1,43 @@ -#- type: constructionGraph # DeltaV - Nuh uh -# id: MimeHardsuit -# start: start -# graph: -# - node: start -# edges: -# - to: mimeHardsuit -# steps: -# - material: Cloth -# amount: 5 -# doAfter: 1 -# - tag: SuitEVA -# name: An EVA suit -# icon: -# sprite: Clothing/OuterClothing/Suits/eva.rsi -# state: icon -# doAfter: 1 -# - tag: HelmetEVA -# name: An EVA helmet -# icon: -# sprite: Clothing/Head/Helmets/eva.rsi -# state: icon -# doAfter: 1 -# - tag: CrayonRed -# name: red crayon -# icon: -# sprite: Objects/Fun/crayons.rsi -# state: red -# doAfter: 1 -# - tag: CrayonBlack -# name: black crayon -# icon: -# sprite: Objects/Fun/crayons.rsi -# state: black -# doAfter: 1 -# - tag: MimeBelt -# name: suspenders -# icon: -# sprite: Clothing/Belt/suspenders.rsi -# state: icon -# doAfter: 1 -# - node: mimeHardsuit -# entity: ClothingOuterHardsuitMime +- type: constructionGraph + id: MimeHardsuit + start: start + graph: + - node: start + edges: + - to: mimeHardsuit + steps: + - material: Cloth + amount: 5 + doAfter: 1 + - tag: SuitEVA + name: An EVA suit + icon: + sprite: Clothing/OuterClothing/Suits/eva.rsi + state: icon + doAfter: 1 + - tag: HelmetEVA + name: An EVA helmet + icon: + sprite: Clothing/Head/Helmets/eva.rsi + state: icon + doAfter: 1 + - tag: CrayonRed + name: red crayon + icon: + sprite: Objects/Fun/crayons.rsi + state: red + doAfter: 1 + - tag: CrayonBlack + name: black crayon + icon: + sprite: Objects/Fun/crayons.rsi + state: black + doAfter: 1 + - tag: MimeBelt + name: suspenders + icon: + sprite: Clothing/Belt/suspenders.rsi + state: icon + doAfter: 1 + - node: mimeHardsuit + entity: ClothingOuterHardsuitMime diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index ba0c0d6c59..3036463fb0 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -1,24 +1,24 @@ -# - type: construction # DeltaV - Prevent clowns from making the hardsuit -# name: clown hardsuit -# id: ClownHardsuit -# graph: ClownHardsuit -# startNode: start -# targetNode: clownHardsuit -# category: construction-category-clothing -# description: A modified hardsuit fit for a clown. -# icon: { sprite: Clothing/OuterClothing/Hardsuits/clown.rsi, state: icon } -# objectType: Item +- type: construction + name: clown vacsuit + id: ClownHardsuit + graph: ClownHardsuit + startNode: start + targetNode: clownHardsuit + category: construction-category-clothing + description: A modified vacsuit fit for a clown. + icon: { sprite: Clothing/OuterClothing/Hardsuits/clown.rsi, state: icon } + objectType: Item -#- type: construction # DeltaV - No mimes either -# name: mime hardsuit -# id: MimeHardsuit -# graph: MimeHardsuit -# startNode: start -# targetNode: mimeHardsuit -# category: construction-category-clothing -# description: A modified hardsuit fit for a mime. -# icon: { sprite: Clothing/OuterClothing/Hardsuits/mime.rsi, state: icon } -# objectType: Item +- type: construction + name: mime vacsuit + id: MimeHardsuit + graph: MimeHardsuit + startNode: start + targetNode: mimeHardsuit + category: construction-category-clothing + description: A modified vacsuit fit for a mime. + icon: { sprite: Clothing/OuterClothing/Hardsuits/mime.rsi, state: icon } + objectType: Item - type: construction name: bone armor diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml index be7d5c87b2..f446040560 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml @@ -20,10 +20,10 @@ Piercing: 4 groups: Burn: 3 -# DeltaV - Commenting out the clown snore sound because I am not fond of it (it makes me itchy and feral). By "I", I mean Leonardo_DaBepis. -# - type: SleepEmitSound -# snore: /Audio/Voice/Misc/silly_snore.ogg -# interval: 10 + - type: SleepEmitSound + snore: /Audio/Voice/Misc/silly_snore.ogg + interval: 10 + - type: Snoring # Necessary so SleepEmitSound sound effects play - !type:AddImplantSpecial implants: [ SadTromboneImplant ] diff --git a/Resources/Prototypes/WhiteDream/Entities/Actions/cultists.yml b/Resources/Prototypes/WhiteDream/Entities/Actions/cultists.yml index 814b950ead..45e6217c60 100644 --- a/Resources/Prototypes/WhiteDream/Entities/Actions/cultists.yml +++ b/Resources/Prototypes/WhiteDream/Entities/Actions/cultists.yml @@ -73,7 +73,7 @@ - type: entity id: ActionBloodCultShadowShackles - name: shadow shackles + name: Shadow Shackles description: Empowers your hand to handcuff a victim on contact, and mute them if successful. categories: [ HideSpawnMenu ] components: @@ -100,7 +100,7 @@ - type: entity id: ActionBloodCultTwistedConstruction - name: twisted construction + name: Twisted Construction description: Empowers your hand to corrupt certain metallic objects. categories: [ HideSpawnMenu ] components: @@ -127,7 +127,7 @@ - type: entity id: ActionBloodCultSummonCombatEquipment - name: summon combat equipment + name: Summon Combat Equipment description: Allows you to summon combat cult gear, including cult armor, a cult bola and a cult sword. categories: [ HideSpawnMenu ] components: @@ -151,7 +151,7 @@ - type: entity id: ActionBloodCultSummonRitualDagger - name: summon ritual dagger + name: Summon Ritual Dagger description: Allows you to summon a ritual dagger, in case you've lost the dagger that was given to you. categories: [ HideSpawnMenu ] components: @@ -173,7 +173,7 @@ - type: entity id: ActionBloodCultBloodRites - name: blood rites + name: Blood Rites description: Empowers your hand to absorb blood to be used for advanced rites, or heal a cultist on contact. Use the spell in-hand to cast advanced rites categories: [ HideSpawnMenu ] components: @@ -193,3 +193,180 @@ prototypes: hand1: BloodRitesAura - type: BaseCultSpell + +- type: entity + id: ActionSummonCultFloor + name: Summon Cult Floor + description: This spell constructs a cult floor. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: create_cult_floor + - type: WorldTargetAction + useDelay: 10 + range: 5 + itemIconStyle: BigAction + checkCanAccess: false + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: create_cult_floor + event: !type:PlaceTileEntityEvent + tileId: CultFloor + audio: !type:SoundPathSpecifier + path: /Audio/WhiteDream/BloodCult/curse.ogg + - type: BaseCultSpell + +- type: entity + id: ActionLesserConstruction + name: Lesser Construction + description: This spell constructs a cult wall. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: lesser_construct + - type: WorldTargetAction + useDelay: 20 + range: 5 + itemIconStyle: BigAction + checkCanAccess: false + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: lesser_construct + event: !type:PlaceTileEntityEvent + entity: WallCult + audio: !type:SoundPathSpecifier + path: /Audio/WhiteDream/BloodCult/curse.ogg + - type: BaseCultSpell + +- type: entity + id: ActionSummonCultDoor + name: Summon Cult Door + description: This spell constructs a cult door. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: lesser_construct + - type: WorldTargetAction + useDelay: 30 + range: 5 + itemIconStyle: BigAction + checkCanAccess: false + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: lesser_construct + event: !type:PlaceTileEntityEvent + entity: CultDoor + audio: !type:SoundPathSpecifier + path: /Audio/WhiteDream/BloodCult/curse.ogg + - type: BaseCultSpell + +- type: entity + id: ActionSummonSoulStone + name: Summon Soulshard + description: This spell reaches into Nar'Sie's realm, summoning one of the legendary fragments across time and space. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: create_soul_stone + - type: WorldTargetAction + useDelay: 30 + range: 5 + itemIconStyle: BigAction + checkCanAccess: false + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: create_soul_stone + event: !type:PlaceTileEntityEvent + entity: SoulShardGhost + audio: !type:SoundPathSpecifier + path: /Audio/WhiteDream/BloodCult/curse.ogg + - type: BaseCultSpell + +- type: entity + id: ActionSummonSoulStoneHoly + name: Summon Holy Soulshard + description: This spell reaches into Nar'Sie's realm, summoning one of the legendary fragments across time and space. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: create_soul_stone + - type: WorldTargetAction + useDelay: 30 + range: 5 + itemIconStyle: BigAction + checkCanAccess: false + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: create_soul_stone + event: !type:PlaceTileEntityEvent + entity: SoulShardHolyGhost + audio: !type:SoundPathSpecifier + path: /Audio/WhiteDream/BloodCult/curse.ogg + - type: BaseCultSpell + +- type: entity + id: ActionForceWallCult + name: Shield + description: This spell creates a temporary forcefield to shield yourself and allies from incoming fire. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: summon_force_wall + - type: InstantAction + useDelay: 40 + itemIconStyle: BigAction + sound: !type:SoundPathSpecifier + path: /Audio/Magic/forcewall.ogg + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: summon_force_wall + event: !type:InstantSpawnSpellEvent + prototype: WallForceCult + posData: !type:TargetInFront + - type: BaseCultSpell + +- type: entity + id: ActionPhaseShift + name: Phase Shift + description: This spell allows you to pass through walls. + categories: [ HideSpawnMenu ] + components: + - type: Sprite + sprite: WhiteDream/BloodCult/actions.rsi + state: phase_shift + - type: InstantAction + itemIconStyle: BigAction + useDelay: 30 + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: phase_shift + event: !type:PhaseShiftEvent + - type: BaseCultSpell + +- type: entity + id: ActionGauntletEcho + name: Gauntlet Echo + description: Channels energy into your gauntlet - firing its essence forward in a slow moving, yet devastating, attack + categories: [ HideSpawnMenu ] + components: + - type: WorldTargetAction + useDelay: 30 + itemIconStyle: BigAction + checkCanAccess: false + raiseOnUser: true + range: 15 + sound: !type:SoundPathSpecifier + path: /Audio/WhiteDream/BloodCult/resonator_blast.ogg + icon: + sprite: WhiteDream/BloodCult/actions.rsi + state: gauntlet_echo + event: !type:ProjectileSpellEvent + prototype: ProjectileGauntlet + projectileSpeed: 5 + - type: BaseCultSpell diff --git a/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/constructs.yml b/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/constructs.yml index d16f12d5c8..b6bc17a223 100644 --- a/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/constructs.yml +++ b/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/constructs.yml @@ -81,13 +81,8 @@ - type: Speech - type: TypingIndicator proto: guardian - - type: Pullable - type: Puller needsHands: false - - type: ActionsContainer - - type: ContainerContainer - containers: - actions: !type:Container - type: Visibility - type: ContentEye - type: Actions @@ -130,6 +125,9 @@ 0: Alive 100: Dead - type: Construct + actions: + - ActionForceWallCult + - ActionGauntletEcho - type: MeleeWeapon hidden: true angle: 30 @@ -164,6 +162,11 @@ - state: glow_artificer_cult map: [ "enum.ConstructVisualsState.Glow" ] - type: Construct + actions: + - ActionSummonCultFloor + - ActionLesserConstruction + - ActionSummonCultDoor + - ActionSummonSoulStone - type: MovementIgnoreGravity - type: MeleeWeapon hidden: true @@ -183,6 +186,7 @@ enum.ConstructVisualsState.Glow: True: { visible: false } False: { visible: true } + - type: Pullable - type: entity parent: ConstructBase @@ -201,6 +205,9 @@ 0: Alive 65: Dead - type: Construct + actions: + - ActionPhaseShift + - type: MovementIgnoreGravity - type: MovementSpeedModifier baseWalkSpeed: 4 baseSprintSpeed: 4 @@ -222,6 +229,10 @@ enum.ConstructVisualsState.Glow: True: { visible: false } False: { visible: true } + - type: StatusEffects + allowed: + - PhaseShifted + - type: Pullable - type: entity id: ConstructHarvester @@ -310,6 +321,9 @@ map: [ "enum.ConstructVisualsState.Sprite" ] - state: glow_artificer_holy map: [ "enum.ConstructVisualsState.Glow" ] + - type: Construct + actions: + - ActionSummonSoulStoneHoly - type: GenericVisualizer visuals: enum.ConstructVisualsState.Transforming: diff --git a/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/souls_shards.yml b/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/souls_shards.yml index e410a81c75..ad3b2a8472 100644 --- a/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/souls_shards.yml +++ b/Resources/Prototypes/WhiteDream/Entities/Objects/Cult/souls_shards.yml @@ -54,3 +54,21 @@ description: ghost-role-information-soul-shard-description rules: ghost-role-information-soul-shard-rules - type: GhostTakeoverAvailable + +- type: entity + parent: SoulShard + id: SoulShardHoly + components: + - type: SoulShard + isBlessed: true + +- type: entity + parent: SoulShardHoly + id: SoulShardHolyGhost + components: + - type: GhostRole + allowMovement: true + name: ghost-role-information-soul-shard-holy-name + description: ghost-role-information-soul-shard-holy-description + rules: ghost-role-information-soul-shard-holy-rules + - type: GhostTakeoverAvailable diff --git a/Resources/Prototypes/WhiteDream/Entities/Objects/Runes/cult.yml b/Resources/Prototypes/WhiteDream/Entities/Objects/Runes/cult.yml index 8195f4773f..9580d2b224 100644 --- a/Resources/Prototypes/WhiteDream/Entities/Objects/Runes/cult.yml +++ b/Resources/Prototypes/WhiteDream/Entities/Objects/Runes/cult.yml @@ -28,6 +28,7 @@ parent: CultRuneBase id: CultRuneOffering name: rune of offering + description: Offers a noncultist above it to Nar'Sie, either converting them or sacrificing them. One cultists required for dead sacrifice, two for conversion and three for living sacrifices and sacrifice targets. components: - type: Sprite state: "offering" @@ -39,6 +40,7 @@ parent: CultRuneBase id: CultRuneEmpower name: rune of empower + description: Allows cultists to prepare greater amounts of blood magic at far less of a cost. components: - type: Sprite state: strength @@ -50,6 +52,7 @@ parent: CultRuneBase id: CultRuneTeleport name: rune of teleportation + description: Warps everything above it to another chosen teleport rune components: - type: Sprite state: teleport @@ -67,6 +70,7 @@ parent: CultRuneBase id: CultRuneRevive name: rune of rejuvenation + description: Requires a dead, mindless, or inactive cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be given a new life. components: - type: Sprite state: revive @@ -78,6 +82,7 @@ parent: CultRuneBase id: CultRuneBarrier name: rune of barrier + description: When invoked, makes a temporary invisible wall to block passage. components: - type: Sprite state: barrier @@ -93,6 +98,7 @@ parent: CultRuneBase id: CultRuneSummoning name: rune of summoning + description: Summons a single cultist to the rune. Requires 2 invokers. components: - type: Sprite state: summon @@ -109,6 +115,7 @@ parent: CultRuneBase id: CultRuneBloodBoil name: rune of boiling blood + description: Boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers. components: - type: Sprite state: blood_boil @@ -124,6 +131,7 @@ parent: CultRuneBase id: CultRuneApocalypse name: rune of apocalypse + description: Harbinger of the end times. Grows in strength with the cult's desperation - but at the risk of... side effects. Requires 3 invokers. components: - type: Sprite sprite: WhiteDream/BloodCult/Entities/Runes/apocalypse.rsi @@ -133,6 +141,8 @@ - type: CultRuneBase requiredInvokers: 3 invokePhrase: "Ta'gh fara'qha fel d'amar det!" + triggerRendingMarkers: true + canBeErased: false activationDamage: types: Slash: 35 @@ -147,6 +157,7 @@ parent: CultRuneBase id: CultRuneDimensionalRending name: rune of dimensional rending + description: Tears apart dimensional barriers, calling forth the Geometer. Requires 10 invokers components: - type: Sprite sprite: WhiteDream/BloodCult/Entities/Runes/dimensional_rending.rsi @@ -157,6 +168,8 @@ requiredInvokers: 10 invokeChatType: Speak invokePhrase: "TOK-LYR RQA-NAP G'OLT-ULOFT!!!" + triggerRendingMarkers: true + canBeErased: false - type: CultRuneRending - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/WhiteDream/Entities/Objects/Structures/Cult/barrier.yml b/Resources/Prototypes/WhiteDream/Entities/Objects/Structures/Cult/barrier.yml index c8ae0d6b3a..0fb137a40d 100644 --- a/Resources/Prototypes/WhiteDream/Entities/Objects/Structures/Cult/barrier.yml +++ b/Resources/Prototypes/WhiteDream/Entities/Objects/Structures/Cult/barrier.yml @@ -31,24 +31,10 @@ thresholds: - trigger: !type:DamageTrigger - damage: 600 + damage: 200 behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] - - trigger: - !type:DamageTrigger - damage: 300 - behaviors: - - !type:SpawnEntitiesBehavior - spawn: - RunedMetal: - min: 5 - max: 5 - - !type:PlaySoundBehavior - sound: - collection: MetalBreak - - !type:DoActsBehavior - acts: [ "Destruction" ] - type: PointLight enabled: false radius: 3 @@ -69,3 +55,4 @@ - type: Icon sprite: WhiteDream/BloodCult/Entities/Structures/cult_shield.rsi state: icon + - type: Dispellable diff --git a/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Melee/cult.yml index c21c383e8e..b27e345421 100644 --- a/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Melee/cult.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity name: ritual dagger parent: BaseKnife id: RitualDagger @@ -15,6 +15,12 @@ damage: types: Piercing: 15 + - type: DamageOtherOnHit + staminaCost: 5 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Clothing sprite: Objects/Weapons/Melee/cult_dagger.rsi slots: @@ -45,7 +51,7 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.75 + attackRate: 1.3333 range: 1.65 damage: types: @@ -56,6 +62,12 @@ angle: 90 soundHit: path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + staminaCost: 8 + - type: EmbeddableProjectile + - type: EmbedPassiveDamage + - type: ThrowingAngle + angle: 225 - type: Item size: Normal - type: Clothing @@ -79,6 +91,7 @@ state: icon - type: EmbeddableProjectile offset: 0.15,0.15 + - type: EmbedPassiveDamage - type: ThrowingAngle angle: 225 - type: Fixtures @@ -100,17 +113,18 @@ wideAnimationRotation: -135 damage: types: - Piercing: 36 + Piercing: 26 angle: 0 animation: WeaponArcThrust soundHit: path: /Audio/Weapons/bladeslice.ogg range: 2 - attackRate: 0.7 + attackRate: 1.42 - type: DamageOtherOnHit damage: types: Piercing: 40 + staminaCost: 18 - type: Item sprite: WhiteDream/BloodCult/Entities/Items/Weapons/cult_spear.rsi storedRotation: 44 @@ -125,7 +139,7 @@ - type: IncreaseDamageOnWield damage: types: - Piercing: 8 + Piercing: 10 - type: UseDelay - type: DisarmMalus - type: CultItem @@ -146,7 +160,6 @@ Blunt: 0 heavyStaminaCost: 0 maxTargets: 1 - - type: Unremoveable - type: BloodRitesAura - type: UserInterface interfaces: diff --git a/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Projectiles/cult.yml b/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Projectiles/cult.yml new file mode 100644 index 0000000000..69a007b90e --- /dev/null +++ b/Resources/Prototypes/WhiteDream/Entities/Objects/Weapons/Projectiles/cult.yml @@ -0,0 +1,20 @@ +- type: entity + id: ProjectileGauntlet + name: gauntlet + description: Oh no. + parent: BaseBulletTrigger + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: Red + radius: 2.0 + energy: 5.0 + - type: Projectile + ignoreResistances: true + damage: + types: + Blunt: 50 + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi + layers: + - state: gauntlet_echo diff --git a/Resources/Prototypes/WhiteDream/Entities/markers.yml b/Resources/Prototypes/WhiteDream/Entities/markers.yml new file mode 100644 index 0000000000..fce2225bc7 --- /dev/null +++ b/Resources/Prototypes/WhiteDream/Entities/markers.yml @@ -0,0 +1,13 @@ +- type: entity + id: RendingRunePlacementMarker + name: rending rune placement marker + description: Marker for rending rune placement. 5 should be enough for each map. + parent: MarkerBase + components: + - type: RendingRunePlacementMarker + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: WhiteDream/BloodCult/Entities/Runes/regular.rsi + state: revive diff --git a/Resources/Prototypes/WhiteDream/runeSelectors.yml b/Resources/Prototypes/WhiteDream/rune_selectors.yml similarity index 88% rename from Resources/Prototypes/WhiteDream/runeSelectors.yml rename to Resources/Prototypes/WhiteDream/rune_selectors.yml index d63c81aa8d..5eb0dfc16a 100644 --- a/Resources/Prototypes/WhiteDream/runeSelectors.yml +++ b/Resources/Prototypes/WhiteDream/rune_selectors.yml @@ -29,6 +29,8 @@ - type: runeSelector id: CultRuneApocalypse prototype: CultRuneApocalypse + requireTargetDead: true + requiredTotalCultists: 10 drawTime: 40 drawDamage: types: @@ -37,6 +39,8 @@ - type: runeSelector id: CultRuneDimensionalRending prototype: CultRuneDimensionalRending + requireTargetDead: true + requiredTotalCultists: 10 drawTime: 40 drawDamage: types: diff --git a/Resources/Prototypes/status_effects.yml b/Resources/Prototypes/status_effects.yml index a991bf4035..bed635c702 100644 --- a/Resources/Prototypes/status_effects.yml +++ b/Resources/Prototypes/status_effects.yml @@ -59,3 +59,6 @@ - type: statusEffect id: StaminaModifier + +- type: statusEffect + id: PhaseShifted diff --git a/Resources/ServerInfo/Guidebook/Antagonist/BloodCult.xml b/Resources/ServerInfo/Guidebook/Antagonist/BloodCult.xml new file mode 100644 index 0000000000..a0e8dcb5d8 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Antagonist/BloodCult.xml @@ -0,0 +1,184 @@ + + Be ware - this document is just almost a full copy of /tg/ station blood cult guide. + + # Blood Cult + + Even in the far future, some things are never quite understood. There are things that lurk in the darkness of space, + unspeakable horrors of ancient power that wish to bring ruin to the universe and to shape it into their image. They + reach out from the void, and turn the minds of mortal men and women in their favor in hopes that one day they shall be + brought once more into this plane of existence. + + The Geometer of Blood, Nar-Sie, has sent a number of her followers to Space Station 14. As a cultist, you have an + abundance of cult magics at your disposal, something for all situations. You must work with your brethren to summon an + avatar of your eldritch goddess! + + ## Objectives + + Your objective requires you to sacrifice a certain crewmember and summon Nar-Sie. + + The general path of action of the cult and those in it: + + - 1. From a discrete location, contact your allies. You can do it by speaking Eldritch language - everyone in the cult + can hear you when you speak it. + - 2. Find an area to convert into a base, usually accessible by one or more members of the cult, but well-hidden + enough that security or crew won't find it easily. + - 3. Setup a teleport rune, so all cultists can access it. + - 4. Setup an empowering rune and then prepare up to 4 blood spells. Stun spells are your bread and butter - but + diversifying with spells like EMP, Teleport, Blood Rites, etc. will ensure you're ready for anything. + - 5. Convert new members, or sacrifice implanted crew, on the offering rune. Combine the filled soul shard from + sacrificed humans to create powerful cult constructs! + - 6. Use teamwork to find your sacrifice target. + - 7. Kill the sacrifice target and place them on an offer rune with 3 cultists nearby. + - 8. Prepare to summon Nar-Sie. She can only be summoned in a few locations and the crew will fight desperately to + stop you! Make sure you have enough cultists and equipment to withstand their assault. + - 9. Gather 10 cultists on the final rune to summon Nar-Sie! + + ## Ritual Dagger + + + + + + Your dagger is your most important tool and has several functions: + + - You can draw runes with it. + - Hitting a non-cultist with it will result in you stabbing them (huh), dealing 15 piercing damage. + - Using it on the rune with erase it. + - Using it on the cult barrier will remove it. + + ## Minor Runes + + These are minor runes cultists can draw anywhere on the station. + + + + + + Can be used to convert or sacrifice targets on it. It takes two cultists to convert someone. + + [bold]REMINDER: One cultist is required to sacrifice a dead body and three for a live one, + standing adjacent to the rune. Each sacrifice will add to the Cult's total number of sacrifices, which are used + to revive deceased bretheren instantly over a Revival Rune.[/bold] + + + + + Grants a buff allowing cultists to prepare greater amounts of blood magic at far less of a cost. While you have + it, the spell count is capped at 4 instead of 1. Additionally, drawing runes takes far less time and you don't + lose as much blood while doing it. + + + + + This rune warps everything above it to another teleport rune when used. Creating a teleport rune will allow you to + set a tag for it. + + + + + Placing a cultist corpse on the rune and activating it will bring them back to life. Consumes one charge on use + and starts with three freebie revivals, so use it sparingly. . + + + + + When invoked, makes a temporary barrier to block passage. + + + + + This rune allows you to instantly summon any living cultist to the rune, consuming it afterward. Does not work on + restrained cultists who are buckled or being pulled. + + + + + When invoked, it saps some health from the invokers to send three damaging pulses to anyone who can see the + rune and ignites them. + + + ## Major runes + + These are the major runes cultists can draw once they meet certain conditions. They need a free 3x3 space, and can only + be summoned in 3 areas around the station (or have 3 global charges). Depleting all of them makes you unable to draw + them anymore. So be careful not to consume all of them with apocalypse runes or you'll never be able to summon + Nar'Sie! + + + + + + A harbinger of the end times. It scales depending on the crew's strength relative to the cult. Effect includes a + massive EMP, total blackout, solar flare and if the cult is doing poorly, certain events. If the cult makes up to + less than 15% of current players, and an apocalypse rune is activated, a random event will + occur: + - Immovable Rod x3 + - Mouse Migration x2 + - Meteor Swarm x2 + - Vent Crickets x3 + - Four Random Anomalies + - Kudzu Growth x2 + - Vendor Mimics x2 + + + + + This rune tears apart dimensional barriers, calling forth the Geometer. To start drawing it the requested target + must have already been sacrificed. Starting to draw this rune alarms the entire station of its location. The caster + must be defended for 45 seconds before it's complete. + After it's drawn, 10 cultists, constructs, or summoned ghosts must stand on the rune, which can then be invoked to + manifest Nar'Sie itself. + + ## Blood Spells + + Blood Spells are limited-use blood magic spells that dissipate after they're spent, and they're your bread and butter + when fighting the crew. Blood Spells can be created at any time via a menu when right clicking your character. + However, blood spells created without an Empowering Rune will take longer, cause significant blood loss, and + will cap your spell count at a measly one + + A good tip is to make sure to try and have a stun spell and a teleport spell with you to escape risky situations. This + will leave only two other options for spells though, so carefully choose what you think might help best for a + particular situation. + + + ## Constructs + + Shades and constructs are slaved to their masters will. They must follow the orders of their master at any cost. They + are capable of grasping intent, unlike synthetic beings. Constructs created by cultists automatically become cultists + themselves, allowing them to identify their team mates, and even count for the escape objective. + + + + + Shades are fragile, but being recaptured into their soul shard heals them. Useful if you quickly need someone to help + you activate a rune. + + + + + The artificer is the "drone" of the cult. It can construct cult-floors, walls and reinforced walls, as well as take + apart the station, but its main purpose is to provide the materials to construct additional constructs. It can create + new soul stones or shells after a certain time. + + + + + The wraith is a tiny bit more fragile than a human but has a strong melee attack. It can become invisible and travel + through closed doors and even walls by using it's phase shift ability. + + + + + Juggernauts are strong, slow and have lots of health. They can destroy any wall by simply punching it and do more + damage than Wraiths. They cannot be pushed or grabbed and even have a force-wall ability similar to the wizard spell. + + ## Tips + - Only cultists can know a rune's name and effects by examining it. + - Always be ready to summon a cultist in trouble. You can't summon them if they're already cuffed. + - Keeping a shade in a Soulstone Shard with you will allow you to use two-person runes by yourself, by releasing and + then recapturing the shade. + - Cultists often find a use for medibots. Having a single bot with a low threshold, backed up by brutepacks or pylons, + can keep your cult in fighting shape. + - The EMP spell and Apocalypse Rune are both incredibly useful. They can give you access almost anywhere, just don't + forget your crowbar! + diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/gauntlet_echo.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/gauntlet_echo.png new file mode 100644 index 0000000000..3b09dd4520 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/gauntlet_echo.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json index 87ce717f44..904b746895 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111", + "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111, gauntlet_echo taken from BeeStation at https://github.com/BeeStation/BeeStation-Hornet/commit/6c4ff2d3c7e74daa8e874abbb01bddc02fbb67a8", "size": { "x": 32, "y": 32 @@ -13,7 +13,7 @@ { "name": "buckshot-flare" }, - { + { "name": "depleted-uranium" }, { @@ -91,11 +91,21 @@ ] ] }, - { + { "name": "grapeshot" }, - { + { "name": "shard" + }, + { + "name": "gauntlet_echo", + "delays": [ + [ + 0.5, + 0.05, + 0.2 + ] + ] } ] } diff --git a/Resources/Textures/Shaders/flashed_effect.swsl b/Resources/Textures/Shaders/flashed_effect.swsl index ec486ab531..67dc67b185 100644 --- a/Resources/Textures/Shaders/flashed_effect.swsl +++ b/Resources/Textures/Shaders/flashed_effect.swsl @@ -12,7 +12,7 @@ void fragment() { highp vec4 textureMix = mix(tex1, tex2, 0.5); // Gradually mixes between the texture mix and a full-white texture, causing the "blinding" effect - highp vec4 mixed = mix(vec4(0.0, 0.0, 0.0, 1.0), textureMix, percentComplete); + highp vec4 mixed = mix(vec4(1.0, 1.0, 1.0, 1.0), textureMix, percentComplete); COLOR = vec4(mixed.rgb, remaining); } diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/.png b/Resources/Textures/Structures/Decoration/barrels.rsi/.png new file mode 100644 index 0000000000..d035f71134 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_grey_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_grey_1.png new file mode 100644 index 0000000000..9ef80fe719 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_grey_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_grey_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_grey_2.png new file mode 100644 index 0000000000..dbeaea2709 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_grey_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_red_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_red_1.png new file mode 100644 index 0000000000..b9a9973b95 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_red_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_red_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_red_2.png new file mode 100644 index 0000000000..3271703d5c Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_red_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_toxic_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_toxic_1.png new file mode 100644 index 0000000000..b8c450f4e7 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_toxic_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_waste_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_waste_1.png new file mode 100644 index 0000000000..ac2f37c558 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_waste_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_waste_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_waste_2.png new file mode 100644 index 0000000000..5feb377a9b Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_waste_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_yellow_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_yellow_1.png new file mode 100644 index 0000000000..541ea0fe2f Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_yellow_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/double_yellow_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/double_yellow_2.png new file mode 100644 index 0000000000..7c4cbc32af Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/double_yellow_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_1.png new file mode 100644 index 0000000000..611825a8ea Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_2.png new file mode 100644 index 0000000000..91a37aa9e3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_3.png new file mode 100644 index 0000000000..fb6c2378a4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/flammable_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/grey_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/grey_1.png new file mode 100644 index 0000000000..9b31672d30 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/grey_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/grey_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/grey_2.png new file mode 100644 index 0000000000..d361fe16d9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/grey_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/grey_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/grey_3.png new file mode 100644 index 0000000000..3fcbd11653 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/grey_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_1.png new file mode 100644 index 0000000000..31ff5dfa90 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_2.png new file mode 100644 index 0000000000..292232c6ee Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_3.png new file mode 100644 index 0000000000..b93a353892 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/hazard_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/label_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/label_1.png new file mode 100644 index 0000000000..33a1a76025 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/label_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/label_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/label_2.png new file mode 100644 index 0000000000..c81974e8f1 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/label_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/label_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/label_3.png new file mode 100644 index 0000000000..23559f1928 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/label_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/meta.json b/Resources/Textures/Structures/Decoration/barrels.rsi/meta.json new file mode 100644 index 0000000000..91a7049c53 --- /dev/null +++ b/Resources/Textures/Structures/Decoration/barrels.rsi/meta.json @@ -0,0 +1,191 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Created by INFRARED_BARON for MS13", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "" + }, + { + "name": "grey_1" + }, + { + "name": "grey_2" + }, + { + "name": "grey_3" + }, + { + "name": "red_1" + }, + { + "name": "red_2" + }, + { + "name": "red_3" + }, + { + "name": "yellow_1" + }, + { + "name": "yellow_2" + }, + { + "name": "yellow_3" + }, + { + "name": "label_1" + }, + { + "name": "label_2" + }, + { + "name": "label_3" + }, + { + "name": "hazard_1" + }, + { + "name": "hazard_2" + }, + { + "name": "hazard_3" + }, + { + "name": "red_alt_1" + }, + { + "name": "red_alt_2" + }, + { + "name": "red_alt_3" + }, + { + "name": "toxic_1" + }, + { + "name": "toxic_2" + }, + { + "name": "toxic_3" + }, + { + "name": "toxic_4" + }, + { + "name": "waste_1" + }, + { + "name": "waste_2" + }, + { + "name": "waste_3" + }, + { + "name": "flammable_1" + }, + { + "name": "flammable_2" + }, + { + "name": "flammable_3" + }, + { + "name": "warning_1" + }, + { + "name": "warning_2" + }, + { + "name": "warning_3" + }, + { + "name": "double_grey_1" + }, + { + "name": "double_grey_2" + }, + { + "name": "triple_grey_1" + }, + { + "name": "triple_grey_2" + }, + { + "name": "triple_grey_3" + }, + { + "name": "quad_grey_1" + }, + { + "name": "double_red_1" + }, + { + "name": "double_red_2" + }, + { + "name": "triple_red_1" + }, + { + "name": "triple_red_2" + }, + { + "name": "quad_red_1" + }, + { + "name": "quad_red_2" + }, + { + "name": "double_yellow_1" + }, + { + "name": "double_yellow_2" + }, + { + "name": "triple_yellow_1" + }, + { + "name": "triple_yellow_2" + }, + { + "name": "triple_yellow_3" + }, + { + "name": "quad_yellow_1" + }, + { + "name": "double_toxic_1" + }, + { + "name": "triple_toxic_1" + }, + { + "name": "triple_toxic_2" + }, + { + "name": "quad_toxic_1" + }, + { + "name": "double_waste_1" + }, + { + "name": "double_waste_2" + }, + { + "name": "triple_waste_1" + }, + { + "name": "triple_waste_2" + }, + { + "name": "triple_waste_3" + }, + { + "name": "quad_waste_1" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/quad_grey_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_grey_1.png new file mode 100644 index 0000000000..c7c2a39042 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_grey_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/quad_red_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_red_1.png new file mode 100644 index 0000000000..c3719d30b1 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_red_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/quad_red_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_red_2.png new file mode 100644 index 0000000000..d7af6fdd68 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_red_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/quad_toxic_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_toxic_1.png new file mode 100644 index 0000000000..c9efa16cfc Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_toxic_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/quad_waste_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_waste_1.png new file mode 100644 index 0000000000..90e3185ba3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_waste_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/quad_yellow_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_yellow_1.png new file mode 100644 index 0000000000..56806f2f2b Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/quad_yellow_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/red_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/red_1.png new file mode 100644 index 0000000000..a04fa07857 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/red_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/red_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/red_2.png new file mode 100644 index 0000000000..472c50553d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/red_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/red_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/red_3.png new file mode 100644 index 0000000000..dd414145a0 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/red_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_1.png new file mode 100644 index 0000000000..b4c5d20b98 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_2.png new file mode 100644 index 0000000000..d3d145a9c1 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_3.png new file mode 100644 index 0000000000..f46f38a3f9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/red_alt_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_1.png new file mode 100644 index 0000000000..05f1f433c8 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_2.png new file mode 100644 index 0000000000..d1fb0c25f6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_3.png new file mode 100644 index 0000000000..4ec1d18223 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_4.png b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_4.png new file mode 100644 index 0000000000..b8a915a817 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/toxic_4.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_1.png new file mode 100644 index 0000000000..9b562466a7 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_2.png new file mode 100644 index 0000000000..37ea181edc Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_3.png new file mode 100644 index 0000000000..12d10fc533 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_grey_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_red_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_red_1.png new file mode 100644 index 0000000000..b2cc0cbaaf Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_red_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_red_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_red_2.png new file mode 100644 index 0000000000..4eb8bd45a6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_red_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_toxic_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_toxic_1.png new file mode 100644 index 0000000000..a3f603bfee Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_toxic_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_toxic_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_toxic_2.png new file mode 100644 index 0000000000..3afd5eacc3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_toxic_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_1.png new file mode 100644 index 0000000000..50c40b137b Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_2.png new file mode 100644 index 0000000000..a8d79361c6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_3.png new file mode 100644 index 0000000000..9e255067d2 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_waste_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_1.png new file mode 100644 index 0000000000..8b6e6efd85 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_2.png new file mode 100644 index 0000000000..1c3ffcdb6e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_3.png new file mode 100644 index 0000000000..80b4b915fe Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/triple_yellow_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/warning_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/warning_1.png new file mode 100644 index 0000000000..2b6b4bc60a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/warning_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/warning_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/warning_2.png new file mode 100644 index 0000000000..2e4814a838 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/warning_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/warning_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/warning_3.png new file mode 100644 index 0000000000..1d78849931 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/warning_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/waste_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/waste_1.png new file mode 100644 index 0000000000..88f24bf8f6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/waste_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/waste_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/waste_2.png new file mode 100644 index 0000000000..0b59a07ca9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/waste_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/waste_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/waste_3.png new file mode 100644 index 0000000000..08da97f26d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/waste_3.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_1.png b/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_1.png new file mode 100644 index 0000000000..c14dd3aaf0 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_1.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_2.png b/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_2.png new file mode 100644 index 0000000000..09240c27c2 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_2.png differ diff --git a/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_3.png b/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_3.png new file mode 100644 index 0000000000..395922b8cb Binary files /dev/null and b/Resources/Textures/Structures/Decoration/barrels.rsi/yellow_3.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-1.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-1.png new file mode 100644 index 0000000000..2115cd9654 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-1.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-2.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-2.png new file mode 100644 index 0000000000..947f783128 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-2.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-3.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-3.png new file mode 100644 index 0000000000..1d06908207 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-3.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-4.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-4.png new file mode 100644 index 0000000000..04460cdeed Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-4.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-5.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-5.png new file mode 100644 index 0000000000..70effbf9c9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-5.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-6.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-6.png new file mode 100644 index 0000000000..8eded936f9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_ns-6.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-1.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-1.png new file mode 100644 index 0000000000..1b937ad638 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-1.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-2.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-2.png new file mode 100644 index 0000000000..8eade32e2b Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-2.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-3.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-3.png new file mode 100644 index 0000000000..6d6d9277e9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-3.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-4.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-4.png new file mode 100644 index 0000000000..096bd81728 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-4.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-5.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-5.png new file mode 100644 index 0000000000..8df1d05350 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-5.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-6.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-6.png new file mode 100644 index 0000000000..6926dfc3a3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_drought_we-6.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-1.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-1.png new file mode 100644 index 0000000000..3f627352d5 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-1.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-2.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-2.png new file mode 100644 index 0000000000..319f826627 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-2.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-3.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-3.png new file mode 100644 index 0000000000..08f725999f Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-3.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-4.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-4.png new file mode 100644 index 0000000000..d13ab2e078 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-4.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-5.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-5.png new file mode 100644 index 0000000000..8a10f9ebd9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-5.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-6.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-6.png new file mode 100644 index 0000000000..b42dd106c6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_ns-6.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-1.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-1.png new file mode 100644 index 0000000000..5ae42e48fc Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-1.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-2.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-2.png new file mode 100644 index 0000000000..9408c3f76b Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-2.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-3.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-3.png new file mode 100644 index 0000000000..d0363b6141 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-3.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-4.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-4.png new file mode 100644 index 0000000000..ad6847efdf Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-4.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-5.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-5.png new file mode 100644 index 0000000000..ae4b6c6bec Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-5.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-6.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-6.png new file mode 100644 index 0000000000..5d25c6018e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/boards_mammoth_we-6.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/meta.json b/Resources/Textures/Structures/Decoration/cave_decor.rsi/meta.json new file mode 100644 index 0000000000..3993442633 --- /dev/null +++ b/Resources/Textures/Structures/Decoration/cave_decor.rsi/meta.json @@ -0,0 +1,122 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/0cbeda29e69293cd3a637fe67576b30b7693d5f6/mojave/icons/structure/cave_decor.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "stalagmite" + }, + { + "name": "stalagmite1" + }, + { + "name": "stalagmite2" + }, + { + "name": "stalagmite3" + }, + { + "name": "stalagmite4" + }, + { + "name": "stalagmite5" + }, + { + "name": "minecart_fallen" + }, + { + "name": "sign_left" + }, + { + "name": "sign_right" + }, + { + "name": "boards_drought_ns-1" + }, + { + "name": "boards_drought_ns-2" + }, + { + "name": "boards_drought_ns-3" + }, + { + "name": "boards_drought_ns-4" + }, + { + "name": "boards_drought_ns-5" + }, + { + "name": "boards_drought_ns-6" + }, + { + "name": "boards_drought_we-1" + }, + { + "name": "boards_drought_we-2" + }, + { + "name": "boards_drought_we-3" + }, + { + "name": "boards_drought_we-4" + }, + { + "name": "boards_drought_we-5" + }, + { + "name": "boards_drought_we-6" + }, + { + "name": "boards_mammoth_ns-1" + }, + { + "name": "boards_mammoth_ns-2" + }, + { + "name": "boards_mammoth_ns-3" + }, + { + "name": "boards_mammoth_ns-4" + }, + { + "name": "boards_mammoth_ns-5" + }, + { + "name": "boards_mammoth_ns-6" + }, + { + "name": "boards_mammoth_we-1" + }, + { + "name": "boards_mammoth_we-2" + }, + { + "name": "boards_mammoth_we-3" + }, + { + "name": "boards_mammoth_we-4" + }, + { + "name": "boards_mammoth_we-5" + }, + { + "name": "boards_mammoth_we-6" + }, + { + "name": "support" + }, + { + "name": "support_beams" + }, + { + "name": "support_wall" + }, + { + "name": "support_wall_broken" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/minecart_fallen.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/minecart_fallen.png new file mode 100644 index 0000000000..b452f212f5 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/minecart_fallen.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/sign_left.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/sign_left.png new file mode 100644 index 0000000000..6b188d9450 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/sign_left.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/sign_right.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/sign_right.png new file mode 100644 index 0000000000..61929ae878 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/sign_right.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite.png new file mode 100644 index 0000000000..c0a0fd2a25 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite1.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite1.png new file mode 100644 index 0000000000..ffcf3155c8 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite1.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite2.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite2.png new file mode 100644 index 0000000000..07591aefa4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite2.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite3.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite3.png new file mode 100644 index 0000000000..c54eb93cbf Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite3.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite4.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite4.png new file mode 100644 index 0000000000..7a0b84050f Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite4.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite5.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite5.png new file mode 100644 index 0000000000..1b76654190 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/stalagmite5.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/support.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support.png new file mode 100644 index 0000000000..7670149e57 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_beams.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_beams.png new file mode 100644 index 0000000000..a3d6e3b2d2 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_beams.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_wall.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_wall.png new file mode 100644 index 0000000000..001c3604db Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_wall.png differ diff --git a/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_wall_broken.png b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_wall_broken.png new file mode 100644 index 0000000000..0ab5916b2d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/cave_decor.rsi/support_wall_broken.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/junction-left-bottom.png b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-left-bottom.png new file mode 100644 index 0000000000..7238770a79 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-left-bottom.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/junction-left-top.png b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-left-top.png new file mode 100644 index 0000000000..ec6e93b627 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-left-top.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/junction-right-bottom.png b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-right-bottom.png new file mode 100644 index 0000000000..7dd8f8fcbb Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-right-bottom.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/junction-right-top.png b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-right-top.png new file mode 100644 index 0000000000..793db233c3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/junction-right-top.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/meta.json b/Resources/Textures/Structures/Decoration/rails64.rsi/meta.json new file mode 100644 index 0000000000..813b89a53c --- /dev/null +++ b/Resources/Textures/Structures/Decoration/rails64.rsi/meta.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Created by INFRARED_BARON for MS13", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "junction-right-top" + }, + { + "name": "turn-WS" + }, + { + "name": "junction-right-bottom" + }, + { + "name": "turn-NW" + }, + { + "name": "junction-left-bottom" + }, + { + "name": "turn-NE" + }, + { + "name": "junction-left-top" + }, + { + "name": "turn-SE" + }, + { + "name": "rails", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/rails.png b/Resources/Textures/Structures/Decoration/rails64.rsi/rails.png new file mode 100644 index 0000000000..96028b3149 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/rails.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/turn-NE.png b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-NE.png new file mode 100644 index 0000000000..c90bd0e181 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-NE.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/turn-NW.png b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-NW.png new file mode 100644 index 0000000000..67197f64e4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-NW.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/turn-SE.png b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-SE.png new file mode 100644 index 0000000000..c9ae45f263 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-SE.png differ diff --git a/Resources/Textures/Structures/Decoration/rails64.rsi/turn-WS.png b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-WS.png new file mode 100644 index 0000000000..1099423275 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/rails64.rsi/turn-WS.png differ diff --git a/Resources/Textures/Structures/Decoration/signs_64x64.rsi/bazaar.png b/Resources/Textures/Structures/Decoration/signs_64x64.rsi/bazaar.png new file mode 100644 index 0000000000..9a0c08957a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/signs_64x64.rsi/bazaar.png differ diff --git a/Resources/Textures/Structures/Decoration/signs_64x64.rsi/meta.json b/Resources/Textures/Structures/Decoration/signs_64x64.rsi/meta.json new file mode 100644 index 0000000000..7ab03e564e --- /dev/null +++ b/Resources/Textures/Structures/Decoration/signs_64x64.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from MS13 at commit https://github.com/Mojave-Sun/mojave-sun-13/commit/6fde5cf64e584727ce66d92d81352801670e172f", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "we_open" + }, + { + "name": "bazaar" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Decoration/signs_64x64.rsi/we_open.png b/Resources/Textures/Structures/Decoration/signs_64x64.rsi/we_open.png new file mode 100644 index 0000000000..141a97768a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/signs_64x64.rsi/we_open.png differ diff --git a/Resources/Textures/Structures/Decoration/tires.rsi/junktire1.png b/Resources/Textures/Structures/Decoration/tires.rsi/junktire1.png new file mode 100644 index 0000000000..5ff478ac17 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/tires.rsi/junktire1.png differ diff --git a/Resources/Textures/Structures/Decoration/tires.rsi/junktire2.png b/Resources/Textures/Structures/Decoration/tires.rsi/junktire2.png new file mode 100644 index 0000000000..a8b346516b Binary files /dev/null and b/Resources/Textures/Structures/Decoration/tires.rsi/junktire2.png differ diff --git a/Resources/Textures/Structures/Decoration/tires.rsi/junktire3.png b/Resources/Textures/Structures/Decoration/tires.rsi/junktire3.png new file mode 100644 index 0000000000..cb9e52edf3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/tires.rsi/junktire3.png differ diff --git a/Resources/Textures/Structures/Decoration/tires.rsi/junktire4.png b/Resources/Textures/Structures/Decoration/tires.rsi/junktire4.png new file mode 100644 index 0000000000..09ad4bbcd4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/tires.rsi/junktire4.png differ diff --git a/Resources/Textures/Structures/Decoration/tires.rsi/junktire5.png b/Resources/Textures/Structures/Decoration/tires.rsi/junktire5.png new file mode 100644 index 0000000000..1c9fd3e332 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/tires.rsi/junktire5.png differ diff --git a/Resources/Textures/Structures/Decoration/tires.rsi/meta.json b/Resources/Textures/Structures/Decoration/tires.rsi/meta.json new file mode 100644 index 0000000000..6790019421 --- /dev/null +++ b/Resources/Textures/Structures/Decoration/tires.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Created by ladyayla and MaxxOrion for ", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "junktire1", + "directions": 4 + }, + { + "name": "junktire2", + "directions": 4 + }, + { + "name": "junktire3", + "directions": 4 + }, + { + "name": "junktire4", + "directions": 4 + }, + { + "name": "junktire5", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Structures/Decoration/torches.rsi/meta.json b/Resources/Textures/Structures/Decoration/torches.rsi/meta.json new file mode 100644 index 0000000000..caa105acab --- /dev/null +++ b/Resources/Textures/Structures/Decoration/torches.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Ported from Nukapop-13", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "torch_unlit" + }, + { + "name": "torch_lit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "wall_torch_unlit", + "directions": 4 + }, + { + "name": "wall_torch_lit", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Decoration/torches.rsi/torch_lit.png b/Resources/Textures/Structures/Decoration/torches.rsi/torch_lit.png new file mode 100644 index 0000000000..4fdd6e0323 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/torches.rsi/torch_lit.png differ diff --git a/Resources/Textures/Structures/Decoration/torches.rsi/torch_unlit.png b/Resources/Textures/Structures/Decoration/torches.rsi/torch_unlit.png new file mode 100644 index 0000000000..f946d28224 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/torches.rsi/torch_unlit.png differ diff --git a/Resources/Textures/Structures/Decoration/torches.rsi/wall_torch_lit.png b/Resources/Textures/Structures/Decoration/torches.rsi/wall_torch_lit.png new file mode 100644 index 0000000000..d629bc00eb Binary files /dev/null and b/Resources/Textures/Structures/Decoration/torches.rsi/wall_torch_lit.png differ diff --git a/Resources/Textures/Structures/Decoration/torches.rsi/wall_torch_unlit.png b/Resources/Textures/Structures/Decoration/torches.rsi/wall_torch_unlit.png new file mode 100644 index 0000000000..c508a54ebd Binary files /dev/null and b/Resources/Textures/Structures/Decoration/torches.rsi/wall_torch_unlit.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/barrels1.png b/Resources/Textures/Structures/Decoration/world.rsi/barrels1.png new file mode 100644 index 0000000000..323811e137 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/barrels1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/barrels2.png b/Resources/Textures/Structures/Decoration/world.rsi/barrels2.png new file mode 100644 index 0000000000..1bff24bd4a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/barrels2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/barrels3.png b/Resources/Textures/Structures/Decoration/world.rsi/barrels3.png new file mode 100644 index 0000000000..20d914ac18 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/barrels3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/barrels4.png b/Resources/Textures/Structures/Decoration/world.rsi/barrels4.png new file mode 100644 index 0000000000..8d8bea4b03 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/barrels4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/barrels5.png b/Resources/Textures/Structures/Decoration/world.rsi/barrels5.png new file mode 100644 index 0000000000..da1078bd14 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/barrels5.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/barrels6.png b/Resources/Textures/Structures/Decoration/world.rsi/barrels6.png new file mode 100644 index 0000000000..513795e896 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/barrels6.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookpile_1.png b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_1.png new file mode 100644 index 0000000000..a2cd2612a9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookpile_2.png b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_2.png new file mode 100644 index 0000000000..3afcd2e1e2 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookpile_3.png b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_3.png new file mode 100644 index 0000000000..33ec1b6d49 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookpile_4.png b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_4.png new file mode 100644 index 0000000000..33c0400bc2 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookpile_5.png b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_5.png new file mode 100644 index 0000000000..fe6dd9648c Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_5.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookpile_6.png b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_6.png new file mode 100644 index 0000000000..29a07811b9 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookpile_6.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookstack_1.png b/Resources/Textures/Structures/Decoration/world.rsi/bookstack_1.png new file mode 100644 index 0000000000..1ba11dea14 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookstack_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookstack_2.png b/Resources/Textures/Structures/Decoration/world.rsi/bookstack_2.png new file mode 100644 index 0000000000..c2e8d73163 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookstack_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/bookstack_3.png b/Resources/Textures/Structures/Decoration/world.rsi/bookstack_3.png new file mode 100644 index 0000000000..762f4164a3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/bookstack_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/brickpile.png b/Resources/Textures/Structures/Decoration/world.rsi/brickpile.png new file mode 100644 index 0000000000..5f9bff64e6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/brickpile.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/brickrubble.png b/Resources/Textures/Structures/Decoration/world.rsi/brickrubble.png new file mode 100644 index 0000000000..e6608f1928 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/brickrubble.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/cardboard.png b/Resources/Textures/Structures/Decoration/world.rsi/cardboard.png new file mode 100644 index 0000000000..502c9091c8 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/cardboard.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier.png new file mode 100644 index 0000000000..adc809dd33 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_1.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_1.png new file mode 100644 index 0000000000..172a253e72 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_2.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_2.png new file mode 100644 index 0000000000..166a4d8e8d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_3.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_3.png new file mode 100644 index 0000000000..3dacbc7b50 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_4.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_4.png new file mode 100644 index 0000000000..152a731a34 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_5.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_5.png new file mode 100644 index 0000000000..5c9b516dce Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_5.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_alt.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_alt.png new file mode 100644 index 0000000000..d14490858a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_alt.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_alt_2.png b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_alt_2.png new file mode 100644 index 0000000000..6f4073d1e5 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/concrete_barrier_alt_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_1.png b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_1.png new file mode 100644 index 0000000000..35e169511a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_2.png b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_2.png new file mode 100644 index 0000000000..5dd4111cf3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_3.png b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_3.png new file mode 100644 index 0000000000..07a18d4b49 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_4.png b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_4.png new file mode 100644 index 0000000000..ea9f0dc039 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_5.png b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_5.png new file mode 100644 index 0000000000..410d800f79 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_5.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_6.png b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_6.png new file mode 100644 index 0000000000..5e5c41c707 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/foodstuff_6.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/glass_1.png b/Resources/Textures/Structures/Decoration/world.rsi/glass_1.png new file mode 100644 index 0000000000..17ac65cf26 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/glass_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/glass_2.png b/Resources/Textures/Structures/Decoration/world.rsi/glass_2.png new file mode 100644 index 0000000000..eb3ab8acaa Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/glass_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/glass_3.png b/Resources/Textures/Structures/Decoration/world.rsi/glass_3.png new file mode 100644 index 0000000000..897e09bd7e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/glass_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/glass_4.png b/Resources/Textures/Structures/Decoration/world.rsi/glass_4.png new file mode 100644 index 0000000000..be2b99641c Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/glass_4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/glass_5.png b/Resources/Textures/Structures/Decoration/world.rsi/glass_5.png new file mode 100644 index 0000000000..ade2587a9a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/glass_5.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/glass_6.png b/Resources/Textures/Structures/Decoration/world.rsi/glass_6.png new file mode 100644 index 0000000000..79c5e850d7 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/glass_6.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/mailbox-open.png b/Resources/Textures/Structures/Decoration/world.rsi/mailbox-open.png new file mode 100644 index 0000000000..c5126efbf8 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/mailbox-open.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/mailbox.png b/Resources/Textures/Structures/Decoration/world.rsi/mailbox.png new file mode 100644 index 0000000000..52b69f7db4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/mailbox.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/mailbox_old-open.png b/Resources/Textures/Structures/Decoration/world.rsi/mailbox_old-open.png new file mode 100644 index 0000000000..3c712d2c3d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/mailbox_old-open.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/mailbox_old.png b/Resources/Textures/Structures/Decoration/world.rsi/mailbox_old.png new file mode 100644 index 0000000000..d80d352f7d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/mailbox_old.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/meta.json b/Resources/Textures/Structures/Decoration/world.rsi/meta.json new file mode 100644 index 0000000000..1920ab8b62 --- /dev/null +++ b/Resources/Textures/Structures/Decoration/world.rsi/meta.json @@ -0,0 +1,249 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/ffcecc82f28c796f8eff92ac46ff0f5e0d9b1ab6/mojave/icons/structure/miscellaneous.dmi", + "size": { + "x": 32, + "y": 48 + }, + "states": [ + { + "name": "mailbox_old" + }, + { + "name": "mailbox_old-open" + }, + { + "name": "mailbox" + }, + { + "name": "mailbox-open" + }, + { + "name": "barrels1" + }, + { + "name": "barrels2" + }, + { + "name": "barrels3" + }, + { + "name": "barrels4" + }, + { + "name": "barrels5" + }, + { + "name": "barrels6" + }, + { + "name": "payphone", + "directions": 4 + }, + { + "name": "payphone_alt", + "directions": 4 + }, + { + "name": "trashbin" + }, + { + "name": "trashbin-1" + }, + { + "name": "trashbin-2" + }, + { + "name": "trashbin-3" + }, + { + "name": "phone_black" + }, + { + "name": "phone_red" + }, + { + "name": "pot_1" + }, + { + "name": "pot_2" + }, + { + "name": "pot_3" + }, + { + "name": "pot_4" + }, + { + "name": "concrete_barrier", + "directions": 4 + }, + { + "name": "concrete_barrier_1", + "directions": 4 + }, + { + "name": "concrete_barrier_2", + "directions": 4 + }, + { + "name": "concrete_barrier_3", + "directions": 4 + }, + { + "name": "concrete_barrier_4", + "directions": 4 + }, + { + "name": "concrete_barrier_5", + "directions": 4 + }, + { + "name": "concrete_barrier_alt", + "directions": 4 + }, + { + "name": "concrete_barrier_alt_2", + "directions": 4 + }, + { + "name": "skeleton" + }, + { + "name": "shower", + "directions": 4 + }, + { + "name": "toilet", + "directions": 4 + }, + { + "name": "sink", + "directions": 4 + }, + { + "name": "scattered_papers", + "directions": 8 + }, + { + "name": "papers_1", + "directions": 4 + }, + { + "name": "papers_2", + "directions": 4 + }, + { + "name": "papers_3", + "directions": 4 + }, + { + "name": "woodscrap", + "directions": 8 + }, + { + "name": "brickrubble", + "directions": 8 + }, + { + "name": "cardboard", + "directions": 8 + }, + { + "name": "pallet", + "directions": 4 + }, + { + "name": "pallet_stack", + "directions": 4 + }, + { + "name": "brickpile" + }, + { + "name": "bookstack_1" + }, + { + "name": "bookstack_2" + }, + { + "name": "bookstack_3" + }, + { + "name": "bookpile_1" + }, + { + "name": "bookpile_2" + }, + { + "name": "bookpile_3" + }, + { + "name": "bookpile_4" + }, + { + "name": "bookpile_5" + }, + { + "name": "bookpile_6" + }, + { + "name": "foodstuff_1" + }, + { + "name": "foodstuff_2" + }, + { + "name": "foodstuff_3" + }, + { + "name": "foodstuff_4" + }, + { + "name": "foodstuff_5" + }, + { + "name": "foodstuff_6" + }, + { + "name": "trashbags_1" + }, + { + "name": "trashbags_2" + }, + { + "name": "trashbags_3" + }, + { + "name": "trashbags_4" + }, + { + "name": "trashbags_5" + }, + { + "name": "trashbags_6" + }, + { + "name": "glass_1" + }, + { + "name": "glass_2" + }, + { + "name": "glass_3" + }, + { + "name": "glass_4" + }, + { + "name": "glass_5" + }, + { + "name": "glass_6" + }, + { + "name": "mine_sign" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Decoration/world.rsi/mine_sign.png b/Resources/Textures/Structures/Decoration/world.rsi/mine_sign.png new file mode 100644 index 0000000000..e67ecc5e37 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/mine_sign.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/pallet.png b/Resources/Textures/Structures/Decoration/world.rsi/pallet.png new file mode 100644 index 0000000000..f1ef027d27 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/pallet.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/pallet_stack.png b/Resources/Textures/Structures/Decoration/world.rsi/pallet_stack.png new file mode 100644 index 0000000000..73d59a10f3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/pallet_stack.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/papers_1.png b/Resources/Textures/Structures/Decoration/world.rsi/papers_1.png new file mode 100644 index 0000000000..f250f41ecb Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/papers_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/papers_2.png b/Resources/Textures/Structures/Decoration/world.rsi/papers_2.png new file mode 100644 index 0000000000..f9aa74fe50 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/papers_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/papers_3.png b/Resources/Textures/Structures/Decoration/world.rsi/papers_3.png new file mode 100644 index 0000000000..277a55e12c Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/papers_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/payphone.png b/Resources/Textures/Structures/Decoration/world.rsi/payphone.png new file mode 100644 index 0000000000..928291b65e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/payphone.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/payphone_alt.png b/Resources/Textures/Structures/Decoration/world.rsi/payphone_alt.png new file mode 100644 index 0000000000..aa05c3fd31 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/payphone_alt.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/phone_black.png b/Resources/Textures/Structures/Decoration/world.rsi/phone_black.png new file mode 100644 index 0000000000..87403a190f Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/phone_black.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/phone_red.png b/Resources/Textures/Structures/Decoration/world.rsi/phone_red.png new file mode 100644 index 0000000000..e925a7f1f4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/phone_red.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/pot_1.png b/Resources/Textures/Structures/Decoration/world.rsi/pot_1.png new file mode 100644 index 0000000000..b9ae782f09 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/pot_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/pot_2.png b/Resources/Textures/Structures/Decoration/world.rsi/pot_2.png new file mode 100644 index 0000000000..a2e594848a Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/pot_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/pot_3.png b/Resources/Textures/Structures/Decoration/world.rsi/pot_3.png new file mode 100644 index 0000000000..f665ca9125 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/pot_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/pot_4.png b/Resources/Textures/Structures/Decoration/world.rsi/pot_4.png new file mode 100644 index 0000000000..3ae15c9ee5 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/pot_4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/scattered_papers.png b/Resources/Textures/Structures/Decoration/world.rsi/scattered_papers.png new file mode 100644 index 0000000000..59447400c3 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/scattered_papers.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/shower.png b/Resources/Textures/Structures/Decoration/world.rsi/shower.png new file mode 100644 index 0000000000..ca3f561f9d Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/shower.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/sink.png b/Resources/Textures/Structures/Decoration/world.rsi/sink.png new file mode 100644 index 0000000000..ab89eea0ad Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/sink.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/skeleton.png b/Resources/Textures/Structures/Decoration/world.rsi/skeleton.png new file mode 100644 index 0000000000..9742b98dfd Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/skeleton.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/toilet.png b/Resources/Textures/Structures/Decoration/world.rsi/toilet.png new file mode 100644 index 0000000000..912bd547b0 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/toilet.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbags_1.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_1.png new file mode 100644 index 0000000000..32c78882f4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbags_2.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_2.png new file mode 100644 index 0000000000..a6ebeb9933 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbags_3.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_3.png new file mode 100644 index 0000000000..828a44184e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbags_4.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_4.png new file mode 100644 index 0000000000..368852fc23 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_4.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbags_5.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_5.png new file mode 100644 index 0000000000..b878b22d52 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_5.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbags_6.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_6.png new file mode 100644 index 0000000000..236a3b0f1e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbags_6.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbin-1.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbin-1.png new file mode 100644 index 0000000000..ab01db6716 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbin-1.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbin-2.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbin-2.png new file mode 100644 index 0000000000..01ebf1808e Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbin-2.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbin-3.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbin-3.png new file mode 100644 index 0000000000..0ded7ef6a4 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbin-3.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/trashbin.png b/Resources/Textures/Structures/Decoration/world.rsi/trashbin.png new file mode 100644 index 0000000000..cc6bfcbaf6 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/trashbin.png differ diff --git a/Resources/Textures/Structures/Decoration/world.rsi/woodscrap.png b/Resources/Textures/Structures/Decoration/world.rsi/woodscrap.png new file mode 100644 index 0000000000..5cdb4e8248 Binary files /dev/null and b/Resources/Textures/Structures/Decoration/world.rsi/woodscrap.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet.png new file mode 100644 index 0000000000..72f5a15231 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet_door.png new file mode 100644 index 0000000000..2aea809d94 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet_open.png new file mode 100644 index 0000000000..04bfdc1aef Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/meta.json new file mode 100644 index 0000000000..b4d08e7649 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/cabinet.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet.png new file mode 100644 index 0000000000..afd232916b Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet_door.png new file mode 100644 index 0000000000..f35c07161b Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet_open.png new file mode 100644 index 0000000000..a7551aff59 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closet.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/closet.rsi/meta.json new file mode 100644 index 0000000000..3f29b07f08 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/closet.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "original sprites by Mithrandalf for ", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + }, + { + "name": "welded" + } + ] +} diff --git a/Resources/Textures/Structures/Storage/Closets/closet.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/closet.rsi/welded.png new file mode 100644 index 0000000000..5ba5dcc896 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closet.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet.png new file mode 100644 index 0000000000..f172eb6e1a Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet_door.png new file mode 100644 index 0000000000..cee2ab5786 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet_open.png new file mode 100644 index 0000000000..994cabb271 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/meta.json new file mode 100644 index 0000000000..a8b78d972b --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/734c2aba4549814549d0fa7a9aa2e2d03ec1a2da/mojave/icons/structure/storage.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + }, + { + "name": "welded" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/welded.png new file mode 100644 index 0000000000..5ba5dcc896 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgeneric.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet.png new file mode 100644 index 0000000000..af64f96c3e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet_door.png new file mode 100644 index 0000000000..95c3f82c11 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet_open.png new file mode 100644 index 0000000000..3d9b907af6 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/meta.json new file mode 100644 index 0000000000..6c96f799da --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/welded.png new file mode 100644 index 0000000000..3b3c1afb16 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet.png new file mode 100644 index 0000000000..42c8042f27 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet_door.png new file mode 100644 index 0000000000..d358d38b07 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet_open.png new file mode 100644 index 0000000000..03fcc057c1 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/meta.json new file mode 100644 index 0000000000..6c96f799da --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/welded.png new file mode 100644 index 0000000000..3b3c1afb16 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetgrey2.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet.png new file mode 100644 index 0000000000..65432daad8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet_door.png new file mode 100644 index 0000000000..6359b0bf95 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet_open.png new file mode 100644 index 0000000000..f9ae6430bb Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/closetold.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/meta.json new file mode 100644 index 0000000000..6c96f799da --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/closetold.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/welded.png new file mode 100644 index 0000000000..3b3c1afb16 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/closetold.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet.png new file mode 100644 index 0000000000..4384fc083d Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet_door.png new file mode 100644 index 0000000000..14e73e6aca Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet_open.png new file mode 100644 index 0000000000..3002352395 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/meta.json new file mode 100644 index 0000000000..42ebb30c44 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 36, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet_open" + }, + { + "name": "closet" + }, + { + "name": "closet_door" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/welded.png new file mode 100644 index 0000000000..2626c910f3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/doublecloset.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet.png new file mode 100644 index 0000000000..0d0446556a Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet_door.png new file mode 100644 index 0000000000..81d17e6434 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet_open.png new file mode 100644 index 0000000000..68d500a1b9 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/meta.json new file mode 100644 index 0000000000..4573bdcf0e --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet_door" + }, + { + "name": "closet" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/welded.png new file mode 100644 index 0000000000..3b3c1afb16 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgedirty.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet.png new file mode 100644 index 0000000000..7f97f96245 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet_door.png new file mode 100644 index 0000000000..3b405c3888 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet_open.png new file mode 100644 index 0000000000..24eae0e588 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/meta.json new file mode 100644 index 0000000000..4573bdcf0e --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet_door" + }, + { + "name": "closet" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/welded.png new file mode 100644 index 0000000000..9854ad9b7c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/fridgewidedirty.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet.png new file mode 100644 index 0000000000..51f6568bb8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet_door.png new file mode 100644 index 0000000000..4fb2a2fe68 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet_open.png new file mode 100644 index 0000000000..b5fdb260ff Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/meta.json new file mode 100644 index 0000000000..df09196536 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + }, + { + "name": "shotgun" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/shotgun.png b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/shotgun.png new file mode 100644 index 0000000000..2118cdf5f5 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/shotgun.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/welded.png new file mode 100644 index 0000000000..ae50afa781 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/guncabinet.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet.png b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet.png new file mode 100644 index 0000000000..973d3220df Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet_door.png new file mode 100644 index 0000000000..43e0e5b04f Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet_open.png new file mode 100644 index 0000000000..ee7343e283 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/meta.json b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/meta.json new file mode 100644 index 0000000000..6c96f799da --- /dev/null +++ b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/JustLoveBeingAnOwl/Interstate-80-owlTaken at /commit/a6f9e0a6649e89f0aa731f363e07f541654ecb3d", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/welded.png b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/welded.png new file mode 100644 index 0000000000..b0b016fa33 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Closets/medicabinet.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/base.png new file mode 100644 index 0000000000..fd318d112d Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/closed.png new file mode 100644 index 0000000000..2c0ff15bc0 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/icon.png new file mode 100644 index 0000000000..6af597137d Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/lock.png b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/lock.png new file mode 100644 index 0000000000..cb3c8e710c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/lock.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/meta.json new file mode 100644 index 0000000000..4a70ffccd8 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "icon" + }, + { + "name": "closed" + }, + { + "name": "open" + }, + { + "name": "welded" + }, + { + "name": "lock" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/open.png new file mode 100644 index 0000000000..b6a45eab7a Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/welded.png b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/welded.png new file mode 100644 index 0000000000..2af808afb3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/aluminiumcrate.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/base.png new file mode 100644 index 0000000000..b7d43e1ee1 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/closed.png new file mode 100644 index 0000000000..280feef20e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/icon.png new file mode 100644 index 0000000000..b4d1e83255 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/lock.png b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/lock.png new file mode 100644 index 0000000000..cb3c8e710c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/lock.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/meta.json new file mode 100644 index 0000000000..4a70ffccd8 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "icon" + }, + { + "name": "closed" + }, + { + "name": "open" + }, + { + "name": "welded" + }, + { + "name": "lock" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/open.png new file mode 100644 index 0000000000..d7f5122c4e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/welded.png b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/welded.png new file mode 100644 index 0000000000..2af808afb3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/armycrate.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/meta.json new file mode 100644 index 0000000000..2f6f3effc3 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "register_cleanopen", + "directions": 4 + }, + { + "name": "register_clean", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/register_clean.png b/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/register_clean.png new file mode 100644 index 0000000000..7e03d84874 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/register_clean.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/register_cleanopen.png b/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/register_cleanopen.png new file mode 100644 index 0000000000..684ce62f9f Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cashregister.rsi/register_cleanopen.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/meta.json new file mode 100644 index 0000000000..7b97a7e7b0 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "register", + "directions": 4 + }, + { + "name": "registeropen", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/register.png b/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/register.png new file mode 100644 index 0000000000..ae713d3dba Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/register.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/registeropen.png b/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/registeropen.png new file mode 100644 index 0000000000..b1f58e204a Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cashregisterbloody.rsi/registeropen.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/base.png new file mode 100644 index 0000000000..dbe959cdde Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/closed.png new file mode 100644 index 0000000000..cde0879b2f Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/icon.png new file mode 100644 index 0000000000..f3a5facaf8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/meta.json new file mode 100644 index 0000000000..30ddccec79 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "By patogrone for nuclear14.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "closed" + }, + { + "name": "icon" + }, + { + "name": "open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/open.png new file mode 100644 index 0000000000..79e4ca0fc6 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratemilitary.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/base.png new file mode 100644 index 0000000000..5391f84ca7 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/closed.png new file mode 100644 index 0000000000..c4598c5506 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/icon.png new file mode 100644 index 0000000000..e5611ffbc7 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/meta.json new file mode 100644 index 0000000000..30ddccec79 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "By patogrone for nuclear14.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "closed" + }, + { + "name": "icon" + }, + { + "name": "open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/open.png new file mode 100644 index 0000000000..588072ac79 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/cratewooden.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/base.png new file mode 100644 index 0000000000..24a824f658 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/closed.png new file mode 100644 index 0000000000..d81f521455 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/icon.png new file mode 100644 index 0000000000..6d3c39fa35 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/meta.json new file mode 100644 index 0000000000..ba4bf0a813 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Base and icon by patogrone. Others modified by Peptide.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "welded" + }, + { + "name": "base" + }, + { + "name": "closed" + }, + { + "name": "icon" + }, + { + "name": "open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/open.png new file mode 100644 index 0000000000..73a2329c8e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/welded.png b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/welded.png new file mode 100644 index 0000000000..a2bc24c528 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/footlocker.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/base.png index 386dd0845d..c0538c846b 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/base.png and b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/closed.png index e7d29a3479..a94bb6a968 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/closed.png and b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/icon.png index 039099b337..6e5483209e 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/icon.png and b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/open.png index 10129791a7..e189e1addb 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/freezer.rsi/open.png and b/Resources/Textures/Structures/Storage/Crates/freezer.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/base.png new file mode 100644 index 0000000000..9917e659f2 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/closed.png new file mode 100644 index 0000000000..67e54227dd Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/icon.png new file mode 100644 index 0000000000..9a9555b7b1 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/lock.png b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/lock.png new file mode 100644 index 0000000000..cb3c8e710c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/lock.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/meta.json new file mode 100644 index 0000000000..4a70ffccd8 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "icon" + }, + { + "name": "closed" + }, + { + "name": "open" + }, + { + "name": "welded" + }, + { + "name": "lock" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/open.png new file mode 100644 index 0000000000..5eaada8394 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/welded.png b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/welded.png new file mode 100644 index 0000000000..2af808afb3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/medicalcrate.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/base.png new file mode 100644 index 0000000000..1ede687689 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/closed.png new file mode 100644 index 0000000000..226128bed7 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/icon.png new file mode 100644 index 0000000000..c59bb7ae20 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/lock.png b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/lock.png new file mode 100644 index 0000000000..cb3c8e710c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/lock.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/meta.json new file mode 100644 index 0000000000..4a70ffccd8 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "icon" + }, + { + "name": "closed" + }, + { + "name": "open" + }, + { + "name": "welded" + }, + { + "name": "lock" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/open.png new file mode 100644 index 0000000000..5c44ebd1f3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/welded.png b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/welded.png new file mode 100644 index 0000000000..2af808afb3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/redcrate.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/base.png new file mode 100644 index 0000000000..ade5f8427e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/closed.png new file mode 100644 index 0000000000..f23806fbd0 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/icon.png new file mode 100644 index 0000000000..c197616dee Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/meta.json new file mode 100644 index 0000000000..3e766f497f --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from Nukapop13, states created / modified by Peptide90 for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "open" + }, + { + "name": "base" + }, + { + "name": "closed" + }, + { + "name": "icon" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/open.png new file mode 100644 index 0000000000..a99a2cc6b0 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/trashbin.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/base.png b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/base.png index 85d7c29992..e993cd2c57 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/base.png and b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/base.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/closed.png b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/closed.png index 1c11bc8942..4e3de205d8 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/closed.png and b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/icon.png b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/icon.png index 6c212de328..e3af2c40f5 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/icon.png and b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/open.png b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/open.png index 58f97286f2..ef403abeb8 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/open.png and b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/open.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/welded.png b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/welded.png index cad0a0f18a..06b25dfb7e 100644 Binary files a/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/welded.png and b/Resources/Textures/Structures/Storage/Crates/trashcart.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate-1.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate-1.png new file mode 100644 index 0000000000..4165207822 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate-1.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate-2.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate-2.png new file mode 100644 index 0000000000..c2fd123bcf Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate-2.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate.png new file mode 100644 index 0000000000..a4d20f4992 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/army_crate.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/meta.json new file mode 100644 index 0000000000..cecaa5ed22 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "wood_crate" + }, + { + "name": "plain_crate" + }, + { + "name": "plain_crate-1" + }, + { + "name": "plain_crate-2" + }, + { + "name": "plain_crate-3" + }, + { + "name": "army_crate" + }, + { + "name": "army_crate-1" + }, + { + "name": "army_crate-2" + } + ] +} diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-1.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-1.png new file mode 100644 index 0000000000..19aeff684c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-1.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-2.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-2.png new file mode 100644 index 0000000000..f394aa4f41 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-2.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-3.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-3.png new file mode 100644 index 0000000000..40e261ef69 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate-3.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate.png new file mode 100644 index 0000000000..5f45c1ec8b Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/plain_crate.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/wood_crate.png b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/wood_crate.png new file mode 100644 index 0000000000..01ddb55466 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodencrates.rsi/wood_crate.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/footlocker_wood.png b/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/footlocker_wood.png new file mode 100644 index 0000000000..2128d861de Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/footlocker_wood.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/footlocker_woodopen.png b/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/footlocker_woodopen.png new file mode 100644 index 0000000000..d074186536 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/footlocker_woodopen.png differ diff --git a/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/meta.json b/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/meta.json new file mode 100644 index 0000000000..7084feb0b6 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Crates/woodenfootlocker.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/b35ff6e7f1b94108e0b934a1caf84d60066840be/mojave/icons/structure/crates.dmi, converted & additional states modified by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "footlocker_wood", + "directions": 4 + }, + { + "name": "footlocker_woodopen", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet.png b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet.png new file mode 100644 index 0000000000..918d419622 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet_door.png new file mode 100644 index 0000000000..5fe03e1df3 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet_open.png new file mode 100644 index 0000000000..a141d00a72 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safe.rsi/meta.json b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/meta.json new file mode 100644 index 0000000000..a8b78d972b --- /dev/null +++ b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/734c2aba4549814549d0fa7a9aa2e2d03ec1a2da/mojave/icons/structure/storage.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + }, + { + "name": "welded" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Furniture/safe.rsi/welded.png b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/welded.png new file mode 100644 index 0000000000..be8c796467 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safe.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet.png b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet.png new file mode 100644 index 0000000000..dc80405ac9 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet_door.png b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet_door.png new file mode 100644 index 0000000000..3d7d3e0a26 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet_door.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet_open.png b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet_open.png new file mode 100644 index 0000000000..a5e6a362cb Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/closet_open.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/meta.json b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/meta.json new file mode 100644 index 0000000000..a8b78d972b --- /dev/null +++ b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/meta.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/734c2aba4549814549d0fa7a9aa2e2d03ec1a2da/mojave/icons/structure/storage.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closet" + }, + { + "name": "closet_door" + }, + { + "name": "closet_open" + }, + { + "name": "welded" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/welded.png b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/welded.png new file mode 100644 index 0000000000..be8c796467 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/safespinner.rsi/welded.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic.png new file mode 100644 index 0000000000..92ab8b725a Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_door.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_door.png new file mode 100644 index 0000000000..c293a5e76e Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_door.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_on.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_on.png new file mode 100644 index 0000000000..07cd92ff69 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_on.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_open.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_open.png new file mode 100644 index 0000000000..b2aacd3c56 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/generic_open.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/meta.json b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/meta.json new file mode 100644 index 0000000000..f3e5239440 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Furniture/washingmachine.rsi/meta.json @@ -0,0 +1,43 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/734c2aba4549814549d0fa7a9aa2e2d03ec1a2da/mojave/icons/structure/storage.dmi, additional states modified by Peptide", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "generic", + "directions": 4 + }, + { + "name": "generic_door", + "directions": 4 + }, + { + "name": "generic_open", + "directions": 4 + }, + { + "name": "generic_on", + "delays": [ + [ + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic.png new file mode 100644 index 0000000000..c53f7e21a5 Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_door.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_door.png new file mode 100644 index 0000000000..f8b9e0c20d Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_door.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_on.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_on.png new file mode 100644 index 0000000000..6ae719968c Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_on.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_open.png b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_open.png new file mode 100644 index 0000000000..4f33cbf1eb Binary files /dev/null and b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/generic_open.png differ diff --git a/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/meta.json b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/meta.json new file mode 100644 index 0000000000..f3e5239440 --- /dev/null +++ b/Resources/Textures/Structures/Storage/Furniture/washingmachine_industrial.rsi/meta.json @@ -0,0 +1,43 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/734c2aba4549814549d0fa7a9aa2e2d03ec1a2da/mojave/icons/structure/storage.dmi, additional states modified by Peptide", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "generic", + "directions": 4 + }, + { + "name": "generic_door", + "directions": 4 + }, + { + "name": "generic_open", + "directions": 4 + }, + { + "name": "generic_on", + "delays": [ + [ + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08, + 0.08 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/black-closed.png b/Resources/Textures/Structures/Storage/barrels.rsi/black-closed.png new file mode 100644 index 0000000000..f5588e0a17 Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/black-closed.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/black-full.png b/Resources/Textures/Structures/Storage/barrels.rsi/black-full.png new file mode 100644 index 0000000000..23f843bf15 Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/black-full.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/black-open.png b/Resources/Textures/Structures/Storage/barrels.rsi/black-open.png new file mode 100644 index 0000000000..375e98aacb Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/black-open.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/blue-closed.png b/Resources/Textures/Structures/Storage/barrels.rsi/blue-closed.png new file mode 100644 index 0000000000..f3d79b683f Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/blue-closed.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/blue-open.png b/Resources/Textures/Structures/Storage/barrels.rsi/blue-open.png new file mode 100644 index 0000000000..e1398fe96b Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/blue-open.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/meta.json b/Resources/Textures/Structures/Storage/barrels.rsi/meta.json new file mode 100644 index 0000000000..595e2ed350 --- /dev/null +++ b/Resources/Textures/Structures/Storage/barrels.rsi/meta.json @@ -0,0 +1,44 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Mithrandalf Discord 93652604520767488", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "black-closed" + }, + { + "name": "black-full" + }, + { + "name": "black-open" + }, + { + "name": "blue-closed" + }, + { + "name": "blue-open" + }, + { + "name": "red-closed" + }, + { + "name": "red-full" + }, + { + "name": "red-open" + }, + { + "name": "yellow-closed" + }, + { + "name": "yellow-full" + }, + { + "name": "yellow-open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/red-closed.png b/Resources/Textures/Structures/Storage/barrels.rsi/red-closed.png new file mode 100644 index 0000000000..d2e93a9076 Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/red-closed.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/red-full.png b/Resources/Textures/Structures/Storage/barrels.rsi/red-full.png new file mode 100644 index 0000000000..d464a1094c Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/red-full.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/red-open.png b/Resources/Textures/Structures/Storage/barrels.rsi/red-open.png new file mode 100644 index 0000000000..fe6acfebac Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/red-open.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/yellow-closed.png b/Resources/Textures/Structures/Storage/barrels.rsi/yellow-closed.png new file mode 100644 index 0000000000..3f8f967c9d Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/yellow-closed.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/yellow-full.png b/Resources/Textures/Structures/Storage/barrels.rsi/yellow-full.png new file mode 100644 index 0000000000..430139d338 Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/yellow-full.png differ diff --git a/Resources/Textures/Structures/Storage/barrels.rsi/yellow-open.png b/Resources/Textures/Structures/Storage/barrels.rsi/yellow-open.png new file mode 100644 index 0000000000..34f2c4373f Binary files /dev/null and b/Resources/Textures/Structures/Storage/barrels.rsi/yellow-open.png differ diff --git a/Resources/Textures/Structures/Storage/burningbarrel.rsi/burnbarrel.png b/Resources/Textures/Structures/Storage/burningbarrel.rsi/burnbarrel.png new file mode 100644 index 0000000000..769a962390 Binary files /dev/null and b/Resources/Textures/Structures/Storage/burningbarrel.rsi/burnbarrel.png differ diff --git a/Resources/Textures/Structures/Storage/burningbarrel.rsi/burnbarrel_lit.png b/Resources/Textures/Structures/Storage/burningbarrel.rsi/burnbarrel_lit.png new file mode 100644 index 0000000000..f9f7c42808 Binary files /dev/null and b/Resources/Textures/Structures/Storage/burningbarrel.rsi/burnbarrel_lit.png differ diff --git a/Resources/Textures/Structures/Storage/burningbarrel.rsi/meta.json b/Resources/Textures/Structures/Storage/burningbarrel.rsi/meta.json new file mode 100644 index 0000000000..e9ea220d55 --- /dev/null +++ b/Resources/Textures/Structures/Storage/burningbarrel.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "https://github.com/BadDeathclaw/Drymouth-Gulch/commit/63d5cc6913885fd4b481b5ffcc980726c2dedca9", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "burnbarrel" + }, + { + "name": "burnbarrel_lit", + "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, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 1, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/storage.rsi/firstaid.png b/Resources/Textures/Structures/Storage/storage.rsi/firstaid.png new file mode 100644 index 0000000000..ddb1dd3887 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/firstaid.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/firstaid_door.png b/Resources/Textures/Structures/Storage/storage.rsi/firstaid_door.png new file mode 100644 index 0000000000..7abcc07275 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/firstaid_door.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/firstaid_open.png b/Resources/Textures/Structures/Storage/storage.rsi/firstaid_open.png new file mode 100644 index 0000000000..e1df54b152 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/firstaid_open.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/fridge.png b/Resources/Textures/Structures/Storage/storage.rsi/fridge.png new file mode 100644 index 0000000000..56b742cb6d Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/fridge.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/fridge_door.png b/Resources/Textures/Structures/Storage/storage.rsi/fridge_door.png new file mode 100644 index 0000000000..1df343df51 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/fridge_door.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/fridge_open.png b/Resources/Textures/Structures/Storage/storage.rsi/fridge_open.png new file mode 100644 index 0000000000..6e9d2d3cc8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/fridge_open.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/locker.png b/Resources/Textures/Structures/Storage/storage.rsi/locker.png new file mode 100644 index 0000000000..7459220d3c Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/locker.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/locker_door.png b/Resources/Textures/Structures/Storage/storage.rsi/locker_door.png new file mode 100644 index 0000000000..d4dbc54117 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/locker_door.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/locker_loot.png b/Resources/Textures/Structures/Storage/storage.rsi/locker_loot.png new file mode 100644 index 0000000000..4715931aa1 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/locker_loot.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/locker_open.png b/Resources/Textures/Structures/Storage/storage.rsi/locker_open.png new file mode 100644 index 0000000000..8298cea36e Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/locker_open.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/meta.json b/Resources/Textures/Structures/Storage/storage.rsi/meta.json new file mode 100644 index 0000000000..0c633b526f --- /dev/null +++ b/Resources/Textures/Structures/Storage/storage.rsi/meta.json @@ -0,0 +1,65 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/734c2aba4549814549d0fa7a9aa2e2d03ec1a2da/mojave/icons/structure/storage.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "fridge" + }, + { + "name": "fridge_door" + }, + { + "name": "fridge_open" + }, + { + "name": "safe_wall" + }, + { + "name": "safe_wall-open" + }, + { + "name": "firstaid" + }, + { + "name": "firstaid_door" + }, + { + "name": "firstaid_open" + }, + { + "name": "vent" + }, + { + "name": "vent-damaged" + }, + { + "name": "vent-open" + }, + { + "name": "locker" + }, + { + "name": "locker_door" + }, + { + "name": "locker_open" + }, + { + "name": "toolbox" + }, + { + "name": "toolbox_open" + }, + { + "name": "locker_loot" + }, + { + "name": "toolbox_loot" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Storage/storage.rsi/safe_wall-open.png b/Resources/Textures/Structures/Storage/storage.rsi/safe_wall-open.png new file mode 100644 index 0000000000..78af50ad81 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/safe_wall-open.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/safe_wall.png b/Resources/Textures/Structures/Storage/storage.rsi/safe_wall.png new file mode 100644 index 0000000000..aa13aedfb8 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/safe_wall.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/toolbox.png b/Resources/Textures/Structures/Storage/storage.rsi/toolbox.png new file mode 100644 index 0000000000..ad66f69275 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/toolbox.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/toolbox_loot.png b/Resources/Textures/Structures/Storage/storage.rsi/toolbox_loot.png new file mode 100644 index 0000000000..a6c8df90bc Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/toolbox_loot.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/toolbox_open.png b/Resources/Textures/Structures/Storage/storage.rsi/toolbox_open.png new file mode 100644 index 0000000000..fcec1e456a Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/toolbox_open.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/vent-damaged.png b/Resources/Textures/Structures/Storage/storage.rsi/vent-damaged.png new file mode 100644 index 0000000000..72a77a24a4 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/vent-damaged.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/vent-open.png b/Resources/Textures/Structures/Storage/storage.rsi/vent-open.png new file mode 100644 index 0000000000..285ef2a2b0 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/vent-open.png differ diff --git a/Resources/Textures/Structures/Storage/storage.rsi/vent.png b/Resources/Textures/Structures/Storage/storage.rsi/vent.png new file mode 100644 index 0000000000..9d0f46b812 Binary files /dev/null and b/Resources/Textures/Structures/Storage/storage.rsi/vent.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/chemical_container.png b/Resources/Textures/Structures/Storage/tanksx64.rsi/chemical_container.png new file mode 100644 index 0000000000..c736502197 Binary files /dev/null and b/Resources/Textures/Structures/Storage/tanksx64.rsi/chemical_container.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/chemical_container_broken.png b/Resources/Textures/Structures/Storage/tanksx64.rsi/chemical_container_broken.png new file mode 100644 index 0000000000..41b8d120b7 Binary files /dev/null and b/Resources/Textures/Structures/Storage/tanksx64.rsi/chemical_container_broken.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank.png b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank.png new file mode 100644 index 0000000000..93813f6014 Binary files /dev/null and b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_chemical.png b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_chemical.png new file mode 100644 index 0000000000..58329e5538 Binary files /dev/null and b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_chemical.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_chemical_huge.png b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_chemical_huge.png new file mode 100644 index 0000000000..91b49aff42 Binary files /dev/null and b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_chemical_huge.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_pipe.png b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_pipe.png new file mode 100644 index 0000000000..22bb887022 Binary files /dev/null and b/Resources/Textures/Structures/Storage/tanksx64.rsi/largetank_pipe.png differ diff --git a/Resources/Textures/Structures/Storage/tanksx64.rsi/meta.json b/Resources/Textures/Structures/Storage/tanksx64.rsi/meta.json new file mode 100644 index 0000000000..77176b7243 --- /dev/null +++ b/Resources/Textures/Structures/Storage/tanksx64.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/aa171b6d7dda4a58168013a60e44f10165f2678d/mojave/icons/structure/tank.dmi", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "largetank" + }, + { + "name": "largetank_chemical" + }, + { + "name": "largetank_pipe" + }, + { + "name": "largetank_chemical_huge" + }, + { + "name": "chemical_container" + }, + { + "name": "chemical_container_broken" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/hydrant.rsi/closed.png b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/closed.png new file mode 100644 index 0000000000..149353076d Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Wallmounts/hydrant.rsi/frame.png b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/frame.png new file mode 100644 index 0000000000..504c12ecac Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/frame.png differ diff --git a/Resources/Textures/Structures/Wallmounts/hydrant.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/meta.json new file mode 100644 index 0000000000..b03441e364 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "By Peptide90 for Nuclear14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closed" + }, + { + "name": "frame" + }, + { + "name": "open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/hydrant.rsi/open.png b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/open.png new file mode 100644 index 0000000000..dcb8f484ab Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/hydrant.rsi/open.png differ diff --git a/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/closed.png b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/closed.png new file mode 100644 index 0000000000..8e44b2457a Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/closed.png differ diff --git a/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/frame.png b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/frame.png new file mode 100644 index 0000000000..c345cb331c Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/frame.png differ diff --git a/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/meta.json new file mode 100644 index 0000000000..b03441e364 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "By Peptide90 for Nuclear14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "closed" + }, + { + "name": "frame" + }, + { + "name": "open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/open.png b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/open.png new file mode 100644 index 0000000000..eef4e7e090 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/hydrantold.rsi/open.png differ diff --git a/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/base.png b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/base.png new file mode 100644 index 0000000000..d4424fe40d Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/base.png differ diff --git a/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/broken.png b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/broken.png new file mode 100644 index 0000000000..cd93962023 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/broken.png differ diff --git a/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/burned.png b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/burned.png new file mode 100644 index 0000000000..7bf5ea4555 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/burned.png differ diff --git a/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/empty.png b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/empty.png new file mode 100644 index 0000000000..91070999ae Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/empty.png differ diff --git a/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/glow.png b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/glow.png new file mode 100644 index 0000000000..da0b0a35ae Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/glow.png differ diff --git a/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/meta.json new file mode 100644 index 0000000000..c0849a2dc3 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/lightbulbcaged.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from Nukapop13, glow by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base", + "directions": 4 + }, + { + "name": "glow", + "directions": 4 + }, + { + "name": "broken", + "directions": 4 + }, + { + "name": "empty", + "directions": 4 + }, + { + "name": "burned", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/meta.json index f5d234d91b..0e9dc64e4b 100644 --- a/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/meta.json +++ b/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/meta.json @@ -1,32 +1,32 @@ { - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "copyright": "Taken from Paradise Station from commit https://github.com/ParadiseSS13/Paradise/commit/137338f4dd3cb33124ab3fbd55a4865dd2bdab81", - "license": "CC-BY-SA-3.0", - "states": [ - { - "name": "noticeboard" + "version": 1, + "size": { + "x": 32, + "y": 32 }, - { - "name": "notice-0" - }, - { - "name": "notice-1" - }, - { - "name": "notice-2" - }, - { - "name": "notice-3" - }, - { - "name": "notice-4" - }, - { - "name": "notice-5" - } - ] -} + "copyright": "created by maxxorion", + "license": "CC-BY-SA-3.0", + "states": [ + { + "name": "noticeboard" + }, + { + "name": "notice-0" + }, + { + "name": "notice-1" + }, + { + "name": "notice-2" + }, + { + "name": "notice-3" + }, + { + "name": "notice-4" + }, + { + "name": "notice-5" + } + ] + } \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/noticeboard.png b/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/noticeboard.png index 378577afdc..72e885c223 100644 Binary files a/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/noticeboard.png and b/Resources/Textures/Structures/Wallmounts/noticeboard.rsi/noticeboard.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/bar.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/bar.png new file mode 100644 index 0000000000..dd58e64005 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/bar.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/clinic.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/clinic.png new file mode 100644 index 0000000000..02b39be4e5 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/clinic.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/meta.json new file mode 100644 index 0000000000..0fea77ce0a --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/meta.json @@ -0,0 +1,48 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from MS13 at commit https://github.com/Mojave-Sun/mojave-sun-13/commit/6fde5cf64e584727ce66d92d81352801670e172f", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "open_on", + "delays": [ + [ + 1, + 1, + 1, + 1 + ] + ] + }, + { + "name": "rent" + }, + { + "name": "bar" + }, + { + "name": "clinic" + }, + { + "name": "open" + }, + { + "name": "open_bar" + }, + { + "name": "open_bar_on", + "delays": [ + [ + 1, + 1, + 1, + 1 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open.png new file mode 100644 index 0000000000..c0253e5400 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_bar.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_bar.png new file mode 100644 index 0000000000..a3db90816f Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_bar.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_bar_on.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_bar_on.png new file mode 100644 index 0000000000..56beba50d3 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_bar_on.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_on.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_on.png new file mode 100644 index 0000000000..47ca73a0f6 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/open_on.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/rent.png b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/rent.png new file mode 100644 index 0000000000..640ed4326d Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_32x32.rsi/rent.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/bazaar_on.png b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/bazaar_on.png new file mode 100644 index 0000000000..d7907e3a41 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/bazaar_on.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/hotel.png b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/hotel.png new file mode 100644 index 0000000000..a1a6d5a518 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/hotel.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/meta.json new file mode 100644 index 0000000000..bedad01856 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from MS13 at commit https://github.com/Mojave-Sun/mojave-sun-13/commit/6fde5cf64e584727ce66d92d81352801670e172f", + "size": { + "x": 64, + "y": 32 + }, + "states": [ + { + "name": "workers" + }, + { + "name": "bazaar_on" + }, + { + "name": "hotel" + }, + { + "name": "private" + }, + { + "name": "we_open_open" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/private.png b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/private.png new file mode 100644 index 0000000000..2e18cb2612 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/private.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/we_open_open.png b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/we_open_open.png new file mode 100644 index 0000000000..adf35156db Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/we_open_open.png differ diff --git a/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/workers.png b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/workers.png new file mode 100644 index 0000000000..d55d828b60 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/signs_64x32.rsi/workers.png differ diff --git a/Resources/Textures/Structures/Wallmounts/vdu.rsi/VDU.png b/Resources/Textures/Structures/Wallmounts/vdu.rsi/VDU.png new file mode 100644 index 0000000000..8cbddf529a Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/vdu.rsi/VDU.png differ diff --git a/Resources/Textures/Structures/Wallmounts/vdu.rsi/keyboard.png b/Resources/Textures/Structures/Wallmounts/vdu.rsi/keyboard.png new file mode 100644 index 0000000000..8f27951d9c Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/vdu.rsi/keyboard.png differ diff --git a/Resources/Textures/Structures/Wallmounts/vdu.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/vdu.rsi/meta.json new file mode 100644 index 0000000000..5dc376d26e --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/vdu.rsi/meta.json @@ -0,0 +1,57 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "By PatoGrone for . Screen by Peptide90", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "keyboard", + "directions": 4 + }, + { + "name": "screen", + "directions": 4, + "delays": [ + [ + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1 + ], + [ + 1, + 1, + 1, + 1, + 1, + 1 + ] + ] + }, + { + "name": "VDU", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Structures/Wallmounts/vdu.rsi/screen.png b/Resources/Textures/Structures/Wallmounts/vdu.rsi/screen.png new file mode 100644 index 0000000000..889dc80bab Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/vdu.rsi/screen.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/calendar.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/calendar.png new file mode 100644 index 0000000000..a95bb7036f Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/calendar.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/calendar_blank.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/calendar_blank.png new file mode 100644 index 0000000000..107156f287 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/calendar_blank.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/clock.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/clock.png new file mode 100644 index 0000000000..70928a39f0 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/clock.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/cross.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/cross.png new file mode 100644 index 0000000000..3ad7875071 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/cross.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/danger_sign.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/danger_sign.png new file mode 100644 index 0000000000..f9d715025f Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/danger_sign.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/exit.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/exit.png new file mode 100644 index 0000000000..75f3b5a5d0 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/exit.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/meta.json new file mode 100644 index 0000000000..64c4a8da70 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/meta.json @@ -0,0 +1,44 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from mojave-sun-13 at https://github.com/Mojave-Sun/mojave-sun-13/blob/be7a9f24f2bca68f07e4b0b086dc03a3eb9f971f/mojave/icons/structure/wall_decor.dmi. Wanted goose poster by maxxorion", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "clock", + "directions": 4 + }, + { + "name": "calendar" + }, + { + "name": "calendar_blank" + }, + { + "name": "notice_sign" + }, + { + "name": "danger_sign" + }, + { + "name": "wanted_poster" + }, + { + "name": "cross" + }, + { + "name": "exit", + "directions": 4 + }, + { + "name": "wallscreen", + "directions": 4 + }, + { + "name": "wanted_poster_goose" + } + ] +} diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/notice_sign.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/notice_sign.png new file mode 100644 index 0000000000..2fca121f94 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/notice_sign.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wallscreen.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wallscreen.png new file mode 100644 index 0000000000..e18cc520dc Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wallscreen.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wanted_poster.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wanted_poster.png new file mode 100644 index 0000000000..9a5d3cb848 Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wanted_poster.png differ diff --git a/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wanted_poster_goose.png b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wanted_poster_goose.png new file mode 100644 index 0000000000..afde4b545f Binary files /dev/null and b/Resources/Textures/Structures/Wallmounts/walldecor.rsi/wanted_poster_goose.png differ diff --git a/Resources/Textures/WhiteDream/BloodCult/actions.rsi/gauntlet_echo.png b/Resources/Textures/WhiteDream/BloodCult/actions.rsi/gauntlet_echo.png new file mode 100644 index 0000000000..4987c8a2ad Binary files /dev/null and b/Resources/Textures/WhiteDream/BloodCult/actions.rsi/gauntlet_echo.png differ diff --git a/Resources/Textures/WhiteDream/BloodCult/actions.rsi/meta.json b/Resources/Textures/WhiteDream/BloodCult/actions.rsi/meta.json index 57c5432a24..5c9211cca3 100644 --- a/Resources/Textures/WhiteDream/BloodCult/actions.rsi/meta.json +++ b/Resources/Textures/WhiteDream/BloodCult/actions.rsi/meta.json @@ -40,6 +40,9 @@ { "name": "final_reckoning" }, + { + "name": "gauntlet_echo" + }, { "name": "gone" }, diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 87df8c1eec..68b84c7fe2 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -468,9 +468,6 @@ binds: - function: OpenDecalSpawnWindow type: State key: F8 -- function: OpenScoreboardWindow - type: State - key: F9 - function: OpenSandboxWindow type: State key: B diff --git a/flake.lock b/flake.lock index 40a98aa9f9..c4c230f008 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -20,16 +20,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1723382296, - "narHash": "sha256-55jPcSyBPG77QysozW12H0VA0E56PJYS+duYndDUNLg=", + "lastModified": 1733808091, + "narHash": "sha256-KWwINTQelKOoQgrXftxoqxmKFZb9pLVfnRvK270nkVk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a5d81094146e6b042c4e5f4c5e179c5c35c3ae28", + "rev": "a0f3e10d94359665dba45b71b4227b0aeb851f8e", "type": "github" }, "original": { "owner": "NixOS", - "ref": "release-24.05", + "ref": "release-24.11", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 095e6b017c..9f481746ca 100644 --- a/flake.nix +++ b/flake.nix @@ -1,13 +1,22 @@ { description = "Development environment for Space Station 14"; - inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-24.05"; + inputs.nixpkgs.url = "github:NixOS/nixpkgs/release-24.11"; inputs.flake-utils.url = "github:numtide/flake-utils"; - outputs = { self, nixpkgs, flake-utils }: - flake-utils.lib.eachDefaultSystem (system: let - pkgs = nixpkgs.legacyPackages.${system}; - in { - devShells.default = import ./shell.nix { inherit pkgs; }; - }); + outputs = + { + self, + nixpkgs, + flake-utils, + }: + flake-utils.lib.eachDefaultSystem ( + system: + let + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.default = import ./shell.nix { inherit pkgs; }; + } + ); } diff --git a/shell.nix b/shell.nix index ce17c6acea..40f08e784d 100644 --- a/shell.nix +++ b/shell.nix @@ -1,9 +1,14 @@ -{ pkgs ? (let lock = builtins.fromJSON (builtins.readFile ./flake.lock); -in import (builtins.fetchTarball { - url = - "https://github.com/NixOS/nixpkgs/archive/${lock.nodes.nixpkgs.locked.rev}.tar.gz"; - sha256 = lock.nodes.nixpkgs.locked.narHash; -}) { }) }: +{ + pkgs ? ( + let + lock = builtins.fromJSON (builtins.readFile ./flake.lock); + in + import (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/${lock.nodes.nixpkgs.locked.rev}.tar.gz"; + sha256 = lock.nodes.nixpkgs.locked.narHash; + }) { } + ), +}: let dependencies = with pkgs; [ @@ -40,9 +45,9 @@ let alsa-lib dbus at-spi2-core - cups ]; -in pkgs.mkShell { +in +pkgs.mkShell { name = "space-station-14-devshell"; buildInputs = [ pkgs.gtk3 ]; packages = dependencies;