diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.BasicEntity.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.BasicEntity.cs new file mode 100644 index 0000000000..4fa50999bd --- /dev/null +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.BasicEntity.cs @@ -0,0 +1,20 @@ +using Content.Shared.Weapons.Ranged.Components; + +namespace Content.Client.Weapons.Ranged.Systems; + +public partial class GunSystem +{ + protected override void InitializeBasicEntity() + { + base.InitializeBasicEntity(); + SubscribeLocalEvent(OnBasicEntityAmmoCount); + } + + private void OnBasicEntityAmmoCount(EntityUid uid, BasicEntityAmmoProviderComponent component, UpdateAmmoCounterEvent args) + { + if (args.Control is DefaultStatusControl control && component.Count != null && component.Capacity != null) + { + control.Update(component.Count.Value, component.Capacity.Value); + } + } +} diff --git a/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs b/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs new file mode 100644 index 0000000000..6a137f3e3a --- /dev/null +++ b/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Polymorph; +using Content.Shared.Sound; +using Content.Shared.Whitelist; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.Polymorph.Components; + +[RegisterComponent] +public sealed class PolymorphOnCollideComponent : Component +{ + [DataField("polymorph", required: true, customTypeSerializer:typeof(PrototypeIdSerializer))] + public string Polymorph = default!; + + [DataField("whitelist", required: true)] + public EntityWhitelist Whitelist = default!; + + [DataField("blacklist")] + public EntityWhitelist? Blacklist; + + public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/Magic/forcewall.ogg"); +} diff --git a/Content.Server/Polymorph/Systems/PolymorphableSystem.Collide.cs b/Content.Server/Polymorph/Systems/PolymorphableSystem.Collide.cs new file mode 100644 index 0000000000..25a6ede9b1 --- /dev/null +++ b/Content.Server/Polymorph/Systems/PolymorphableSystem.Collide.cs @@ -0,0 +1,65 @@ +using Content.Server.Polymorph.Components; +using Content.Shared.Projectiles; +using Content.Shared.Sound; +using Robust.Shared.Audio; +using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Player; + +namespace Content.Server.Polymorph.Systems; + +public partial class PolymorphableSystem +{ + // Need to do this so we don't get a collection enumeration error in physics by polymorphing + // an entity we're colliding with + private Queue _queuedPolymorphUpdates = new(); + + public override void Update(float frameTime) + { + base.Update(frameTime); + + while (_queuedPolymorphUpdates.TryDequeue(out var data)) + { + if (Deleted(data.Ent)) + continue; + + var ent = PolymorphEntity(data.Ent, data.Polymorph); + if (ent != null) + { + SoundSystem.Play(data.Sound.GetSound(), Filter.Pvs(ent.Value, entityManager: EntityManager), + ent.Value, data.Sound.Params); + } + } + } + + private void InitializeCollide() + { + SubscribeLocalEvent(OnPolymorphCollide); + } + + private void OnPolymorphCollide(EntityUid uid, PolymorphOnCollideComponent component, StartCollideEvent args) + { + if (args.OurFixture.ID != SharedProjectileSystem.ProjectileFixture) + return; + + var other = args.OtherFixture.Body.Owner; + if (!component.Whitelist.IsValid(other) + || component.Blacklist != null && component.Blacklist.IsValid(other)) + return; + + _queuedPolymorphUpdates.Enqueue(new (other, component.Sound, component.Polymorph)); + } +} + +struct PolymorphQueuedData +{ + public EntityUid Ent; + public SoundSpecifier Sound; + public string Polymorph; + + public PolymorphQueuedData(EntityUid ent, SoundSpecifier sound, string polymorph) + { + Ent = ent; + Sound = sound; + Polymorph = polymorph; + } +} diff --git a/Content.Server/Polymorph/Systems/PolymorphableSystem.cs b/Content.Server/Polymorph/Systems/PolymorphableSystem.cs index e45c03ee34..5a4553cbff 100644 --- a/Content.Server/Polymorph/Systems/PolymorphableSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphableSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Actions; +using Content.Server.Body.Components; using Content.Server.Buckle.Components; using Content.Server.Inventory; using Content.Server.Mind.Commands; @@ -12,8 +13,11 @@ using Content.Shared.Damage; using Content.Shared.Hands.EntitySystems; using Content.Shared.Polymorph; using Robust.Server.Containers; +using Robust.Shared.Audio; using Robust.Shared.Containers; using Robust.Shared.Map; +using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -39,6 +43,7 @@ namespace Content.Server.Polymorph.Systems SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnPolymorphActionEvent); + InitializeCollide(); InitializeMap(); } diff --git a/Content.Server/Projectiles/Components/ProjectileComponent.cs b/Content.Server/Projectiles/Components/ProjectileComponent.cs index 59e9a20800..c54c7a2777 100644 --- a/Content.Server/Projectiles/Components/ProjectileComponent.cs +++ b/Content.Server/Projectiles/Components/ProjectileComponent.cs @@ -15,6 +15,9 @@ namespace Content.Server.Projectiles.Components [DataField("deleteOnCollide")] public bool DeleteOnCollide { get; } = true; + [DataField("ignoreResistances")] + public bool IgnoreResistances { get; } = false; + // Get that juicy FPS hit sound [DataField("soundHit")] public SoundSpecifier? SoundHit; diff --git a/Content.Server/Projectiles/SharedProjectileSystem.cs b/Content.Server/Projectiles/SharedProjectileSystem.cs index 9d477c05f9..ede8964f17 100644 --- a/Content.Server/Projectiles/SharedProjectileSystem.cs +++ b/Content.Server/Projectiles/SharedProjectileSystem.cs @@ -40,7 +40,7 @@ namespace Content.Server.Projectiles var otherEntity = args.OtherFixture.Body.Owner; - var modifiedDamage = _damageableSystem.TryChangeDamage(otherEntity, component.Damage); + var modifiedDamage = _damageableSystem.TryChangeDamage(otherEntity, component.Damage, component.IgnoreResistances); component.DamagedEntity = true; if (modifiedDamage is not null && EntityManager.EntityExists(component.Shooter)) diff --git a/Content.Server/Weapon/Ranged/Components/RechargeBasicEntityAmmoComponent.cs b/Content.Server/Weapon/Ranged/Components/RechargeBasicEntityAmmoComponent.cs new file mode 100644 index 0000000000..01fb30b24d --- /dev/null +++ b/Content.Server/Weapon/Ranged/Components/RechargeBasicEntityAmmoComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.Sound; +using Robust.Shared.Audio; + +namespace Content.Server.Weapon.Ranged.Components; + +/// +/// Responsible for handling recharging a basic entity ammo provider over time. +/// +[RegisterComponent] +public sealed class RechargeBasicEntityAmmoComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + [DataField("minRechargeCooldown")] + public float MinRechargeCooldown = 30f; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("maxRechargeCooldown")] + public float MaxRechargeCooldown = 45f; + + [DataField("rechargeSound")] + public SoundSpecifier RechargeSound = new SoundPathSpecifier("/Audio/Magic/forcewall.ogg") + { + Params = AudioParams.Default.WithVolume(-5f) + }; + + [DataField("accumulatedFrametime")] + public float AccumulatedFrameTime; + /// + /// Number of seconds until the next recharge. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float NextRechargeTime = 0f; +} diff --git a/Content.Server/Weapon/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs b/Content.Server/Weapon/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs new file mode 100644 index 0000000000..bc62d3a4fa --- /dev/null +++ b/Content.Server/Weapon/Ranged/Systems/RechargeBasicEntityAmmoSystem.cs @@ -0,0 +1,75 @@ +using Content.Server.Weapon.Ranged.Components; +using Content.Shared.Examine; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Audio; +using Robust.Shared.Player; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Weapon.Ranged.Systems; + +public sealed class RechargeBasicEntityAmmoSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedGunSystem _gun = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnExamined); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var (recharge, ammo) in + EntityQuery()) + { + if (ammo.Count is null || ammo.Count == ammo.Capacity) + continue; + + recharge.AccumulatedFrameTime += frameTime; + + if (recharge.AccumulatedFrameTime < recharge.NextRechargeTime) + return; + + recharge.AccumulatedFrameTime -= recharge.NextRechargeTime; + UpdateCooldown(recharge); + + + if (_gun.UpdateBasicEntityAmmoCount(ammo.Owner, ammo.Count.Value + 1, ammo)) + { + SoundSystem.Play(recharge.RechargeSound.GetSound(), Filter.Pvs(recharge.Owner), recharge.Owner, + recharge.RechargeSound.Params); + } + } + } + + private void OnInit(EntityUid uid, RechargeBasicEntityAmmoComponent component, ComponentInit args) + { + UpdateCooldown(component); + } + + private void OnExamined(EntityUid uid, RechargeBasicEntityAmmoComponent component, ExaminedEvent args) + { + if (!TryComp(uid, out var ammo) + || ammo.Count == ammo.Capacity) + { + args.PushMarkup(Loc.GetString("recharge-basic-entity-ammo-full")); + return; + } + + var timeLeft = component.NextRechargeTime - component.AccumulatedFrameTime; + args.PushMarkup(Loc.GetString("recharge-basic-entity-ammo-can-recharge", ("seconds", Math.Round(timeLeft, 1)))); + } + + private void UpdateCooldown(RechargeBasicEntityAmmoComponent component) + { + component.NextRechargeTime = _random.NextFloat(component.MinRechargeCooldown, component.MaxRechargeCooldown); + } +} diff --git a/Content.Shared/Weapons/Ranged/Components/BasicEntityAmmoProviderComponent.cs b/Content.Shared/Weapons/Ranged/Components/BasicEntityAmmoProviderComponent.cs new file mode 100644 index 0000000000..d032b07555 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Components/BasicEntityAmmoProviderComponent.cs @@ -0,0 +1,44 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Weapons.Ranged.Components; + +/// +/// Simply provides a certain capacity of entities that cannot be reloaded through normal means and have +/// no special behavior like cycling, magazine +/// +[RegisterComponent] +public sealed class BasicEntityAmmoProviderComponent : AmmoProviderComponent +{ + [ViewVariables(VVAccess.ReadWrite)] + [DataField("proto", required: true, customTypeSerializer:typeof(PrototypeIdSerializer))] + public string Proto = default!; + + /// + /// Max capacity. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("capacity")] + public int? Capacity = null; + + /// + /// Actual ammo left. Initialized to capacity unless they are non-null and differ. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("count")] + public int? Count = null; +} + +[Serializable, NetSerializable] +public sealed class BasicEntityAmmoProviderComponentState : ComponentState +{ + public int? Capacity; + public int? Count; + + public BasicEntityAmmoProviderComponentState(int? capacity, int? count) + { + Capacity = capacity; + Count = count; + } +} diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.BasicEntity.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.BasicEntity.cs new file mode 100644 index 0000000000..ff2acfd225 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.BasicEntity.cs @@ -0,0 +1,96 @@ +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; +using Robust.Shared.GameStates; + +namespace Content.Shared.Weapons.Ranged.Systems; + +public abstract partial class SharedGunSystem +{ + protected virtual void InitializeBasicEntity() + { + SubscribeLocalEvent(OnBasicEntityInit); + SubscribeLocalEvent(OnBasicEntityTakeAmmo); + SubscribeLocalEvent(OnBasicEntityAmmoCount); + + SubscribeLocalEvent(OnBasicEntityGetState); + SubscribeLocalEvent(OnBasicEntityHandleState); + } + + private void OnBasicEntityGetState(EntityUid uid, BasicEntityAmmoProviderComponent component, ref ComponentGetState args) + { + args.State = new BasicEntityAmmoProviderComponentState(component.Capacity, component.Count); + } + + private void OnBasicEntityHandleState(EntityUid uid, BasicEntityAmmoProviderComponent component, ref ComponentHandleState args) + { + if (args.Current is BasicEntityAmmoProviderComponentState state) + { + component.Capacity = state.Capacity; + component.Count = state.Count; + } + } + + private void OnBasicEntityInit(EntityUid uid, BasicEntityAmmoProviderComponent component, ComponentInit args) + { + if (component.Count is null) + { + component.Count = component.Capacity; + Dirty(component); + } + + UpdateBasicEntityAppearance(component); + } + + private void OnBasicEntityTakeAmmo(EntityUid uid, BasicEntityAmmoProviderComponent component, TakeAmmoEvent args) + { + for (int i = 0; i < args.Shots; i++) + { + if (component.Count <= 0) + return; + + if (component.Count != null) + { + component.Count--; + } + + var ent = Spawn(component.Proto, args.Coordinates); + args.Ammo.Add(EnsureComp(ent)); + } + + UpdateBasicEntityAppearance(component); + Dirty(component); + } + + private void OnBasicEntityAmmoCount(EntityUid uid, BasicEntityAmmoProviderComponent component, ref GetAmmoCountEvent args) + { + args.Capacity = component.Capacity ?? int.MaxValue; + args.Count = component.Count ?? int.MaxValue; + } + + private void UpdateBasicEntityAppearance(BasicEntityAmmoProviderComponent component) + { + if (!Timing.IsFirstTimePredicted || !TryComp(component.Owner, out var appearance)) return; + appearance.SetData(AmmoVisuals.HasAmmo, component.Count != 0); + appearance.SetData(AmmoVisuals.AmmoCount, component.Count ?? int.MaxValue); + appearance.SetData(AmmoVisuals.AmmoMax, component.Capacity ?? int.MaxValue); + } + + #region Public API + + public bool UpdateBasicEntityAmmoCount(EntityUid uid, int count, BasicEntityAmmoProviderComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + if (count > component.Capacity) + return false; + + component.Count = count; + Dirty(component); + UpdateBasicEntityAppearance(component); + + return true; + } + + #endregion +} diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs index 10c23ebcb9..ccbe01732d 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs @@ -83,6 +83,7 @@ public abstract partial class SharedGunSystem protected void UpdateBatteryAppearance(EntityUid uid, BatteryAmmoProviderComponent component) { if (!TryComp(uid, out var appearance)) return; + appearance.SetData(AmmoVisuals.HasAmmo, component.Shots != 0); appearance.SetData(AmmoVisuals.AmmoCount, component.Shots); appearance.SetData(AmmoVisuals.AmmoMax, component.Capacity); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs index 12279cc7b2..3a277bb2dd 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs @@ -142,6 +142,7 @@ public abstract partial class SharedGunSystem { // Copy the magazine's appearance data appearance?.SetData(AmmoVisuals.MagLoaded, magLoaded); + appearance?.SetData(AmmoVisuals.HasAmmo, count != 0); appearance?.SetData(AmmoVisuals.AmmoCount, count); appearance?.SetData(AmmoVisuals.AmmoMax, capacity); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs index fb9a4c56bb..7b3b4aceea 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Revolver.cs @@ -220,7 +220,9 @@ public partial class SharedGunSystem private void UpdateRevolverAppearance(RevolverAmmoProviderComponent component) { if (!TryComp(component.Owner, out var appearance)) return; - appearance.SetData(AmmoVisuals.AmmoCount, GetRevolverCount(component)); + var count = GetRevolverCount(component); + appearance.SetData(AmmoVisuals.HasAmmo, count != 0); + appearance.SetData(AmmoVisuals.AmmoCount, count); appearance.SetData(AmmoVisuals.AmmoMax, component.Capacity); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 86aef929fa..4c9f25935d 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -73,6 +73,7 @@ public abstract partial class SharedGunSystem : EntitySystem InitializeChamberMagazine(); InitializeMagazine(); InitializeRevolver(); + InitializeBasicEntity(); // Interactions SubscribeLocalEvent>(OnAltVerb); @@ -389,5 +390,6 @@ public enum AmmoVisuals : byte Spent, AmmoCount, AmmoMax, + HasAmmo, // used for generic visualizers. c# stuff can just check ammocount != 0 MagLoaded, } diff --git a/Resources/Audio/Magic/staff_animation.ogg b/Resources/Audio/Magic/staff_animation.ogg new file mode 100644 index 0000000000..8d9e9e8a25 Binary files /dev/null and b/Resources/Audio/Magic/staff_animation.ogg differ diff --git a/Resources/Audio/Magic/staff_change.ogg b/Resources/Audio/Magic/staff_change.ogg new file mode 100644 index 0000000000..60020364da Binary files /dev/null and b/Resources/Audio/Magic/staff_change.ogg differ diff --git a/Resources/Audio/Magic/staff_chaos.ogg b/Resources/Audio/Magic/staff_chaos.ogg new file mode 100644 index 0000000000..03a2ee3cf5 Binary files /dev/null and b/Resources/Audio/Magic/staff_chaos.ogg differ diff --git a/Resources/Audio/Magic/staff_door.ogg b/Resources/Audio/Magic/staff_door.ogg new file mode 100644 index 0000000000..1aa29545c3 Binary files /dev/null and b/Resources/Audio/Magic/staff_door.ogg differ diff --git a/Resources/Audio/Magic/staff_healing.ogg b/Resources/Audio/Magic/staff_healing.ogg new file mode 100644 index 0000000000..1e1657aea1 Binary files /dev/null and b/Resources/Audio/Magic/staff_healing.ogg differ diff --git a/Resources/Audio/Weapons/Guns/Gunshots/Magic/attributions.yml b/Resources/Audio/Weapons/Guns/Gunshots/Magic/attributions.yml new file mode 100644 index 0000000000..aa1641dc7a --- /dev/null +++ b/Resources/Audio/Weapons/Guns/Gunshots/Magic/attributions.yml @@ -0,0 +1,6 @@ +# BEHOLD: +# FIRST EVER USAGE OF ROBUST GENERIC ATTRIBUTION STANDARD IN SPACE STATION 14 + +- files: [ "staff_animation.ogg", "staff_change.ogg", "staff_chaos.ogg", "staff_door.ogg", "staff_healing.ogg" ] + license: "CC-BY-SA-3.0" + copyright: "https://github.com/tgstation/tgstation/commit/906fb0682bab6a0975b45036001c54f021f58ae7" \ No newline at end of file diff --git a/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_animation.ogg b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_animation.ogg new file mode 100644 index 0000000000..8d9e9e8a25 Binary files /dev/null and b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_animation.ogg differ diff --git a/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_change.ogg b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_change.ogg new file mode 100644 index 0000000000..60020364da Binary files /dev/null and b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_change.ogg differ diff --git a/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_chaos.ogg b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_chaos.ogg new file mode 100644 index 0000000000..03a2ee3cf5 Binary files /dev/null and b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_chaos.ogg differ diff --git a/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_door.ogg b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_door.ogg new file mode 100644 index 0000000000..1aa29545c3 Binary files /dev/null and b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_door.ogg differ diff --git a/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_healing.ogg b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_healing.ogg new file mode 100644 index 0000000000..1e1657aea1 Binary files /dev/null and b/Resources/Audio/Weapons/Guns/Gunshots/Magic/staff_healing.ogg differ diff --git a/Resources/Locale/en-US/weapons/ranged/recharge-basic-entity-ammo.ftl b/Resources/Locale/en-US/weapons/ranged/recharge-basic-entity-ammo.ftl new file mode 100644 index 0000000000..49ebe25dc3 --- /dev/null +++ b/Resources/Locale/en-US/weapons/ranged/recharge-basic-entity-ammo.ftl @@ -0,0 +1,2 @@ +recharge-basic-entity-ammo-can-recharge = It will recharge its ammo in [color=yellow]{$seconds}[/color] seconds. +recharge-basic-entity-ammo-full = It doesn't need to recharge its ammo yet. diff --git a/Resources/Prototypes/Catalog/Fills/Items/belt.yml b/Resources/Prototypes/Catalog/Fills/Items/belt.yml index 899c0e9fda..1310e4155c 100644 --- a/Resources/Prototypes/Catalog/Fills/Items/belt.yml +++ b/Resources/Prototypes/Catalog/Fills/Items/belt.yml @@ -98,5 +98,16 @@ amount: 2 - id: OmnizineChemistryBottle amount: 1 - - id: MedkitCombatFilled - + - id: MedkitCombatFilled + +- type: entity + parent: ClothingBeltWand + id: ClothingBeltWandFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: WeaponWandPolymorphCarp + - id: WeaponWandFireball + - id: WeaponWandDeath + - id: WeaponWandPolymorphDoor diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index d89c258742..4596fa505c 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -503,3 +503,19 @@ - type: Clothing sprite: Clothing/Belt/suspenders.rsi quickEquip: true + +- type: entity + parent: ClothingBeltStorageBase + id: ClothingBeltWand + name: wand belt + description: A belt designed to hold various rods of power. A veritable fanny pack of exotic magic. + components: + - type: Sprite + sprite: Clothing/Belt/wand.rsi + - type: Clothing + sprite: Clothing/Belt/wand.rsi + - type: Storage + capacity: 120 + whitelist: + tags: + - WizardWand diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index cf7dd778e7..4702a49cdf 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -69,6 +69,9 @@ - type: TypingIndicator proto: alien - type: NoSlip + - type: Tag + tags: + - Carp - type: entity name: magicarp diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/base_staff.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/base_staff.yml new file mode 100644 index 0000000000..b11a763c74 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/base_staff.yml @@ -0,0 +1,23 @@ +- type: entity + id: WeaponStaffBase + abstract: true + parent: BaseItem + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Magic/staves.rsi + - type: Item + sprite: Objects/Weapons/Guns/Magic/staves.rsi + HeldPrefix: staff + size: 60 + - type: Gun + fireRate: 1 + selectedMode: SemiAuto + availableModes: + - SemiAuto + - type: AmmoCounter + # All staves recharge. Wands are not. + - type: RechargeBasicEntityAmmo + - type: Tag + tags: + - WizardStaff + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/base_wand.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/base_wand.yml new file mode 100644 index 0000000000..2c3e73ba66 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/base_wand.yml @@ -0,0 +1,28 @@ +- type: entity + id: WeaponWandBase + abstract: true + parent: BaseItem + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Magic/wands.rsi + - type: Item + sprite: Objects/Weapons/Guns/Magic/wands.rsi + HeldPrefix: wand + size: 30 + - type: Gun + fireRate: 0.5 + selectedMode: SemiAuto + availableModes: + - SemiAuto + - type: AmmoCounter + # These will only do anything if the effect layer is actually set. + - type: Appearance + - type: GenericVisualizer + visuals: + enum.AmmoVisuals.HasAmmo: + effect: + True: { visible: True } + False: { visible: False } + - type: Tag + tags: + - WizardWand diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/staves.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/staves.yml new file mode 100644 index 0000000000..81903f6ba0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/staves.yml @@ -0,0 +1,37 @@ +# To be implemented: see #9072 + +- type: entity + name: staff of healing + parent: WeaponStaffBase + id: WeaponStaffHealing + description: You don't foresee having to use this in your quest for carnage too often. + components: + - type: Sprite + layers: + - state: healing + - type: Item + HeldPrefix: healing + - type: Gun + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/Magic/staff_healing.ogg + - type: BasicEntityAmmoProvider + proto: ProjectileHealingBolt + capacity: 10 + +- type: entity + name: staff of entrance + parent: WeaponStaffBase + id: WeaponStaffPolymorphDoor + description: For when you need a get-away route. + components: + - type: Sprite + layers: + - state: door + - type: Item + HeldPrefix: door + - type: Gun + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/Magic/staff_door.ogg + - type: BasicEntityAmmoProvider + proto: ProjectilePolyboltDoor + capacity: 10 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/wands.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/wands.yml new file mode 100644 index 0000000000..f2ba66be9a --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Magic/wands.yml @@ -0,0 +1,72 @@ +- type: entity + name: wand of carp polymorph + parent: WeaponWandBase + id: WeaponWandPolymorphCarp + description: For when you need a carp filet quick and the clown is looking juicy. + components: + - type: Sprite + layers: + - state: poly + - state: poly-effect + map: ["effect"] + - type: Gun + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/Magic/staff_animation.ogg + - type: BasicEntityAmmoProvider + proto: ProjectilePolyboltCarp + capacity: 5 + +- type: entity + name: wand of fireball + parent: WeaponWandBase + id: WeaponWandFireball + description: Great big balls of fire! + components: + - type: Sprite + layers: + - state: fire + - state: fire-effect + map: ["effect"] + - type: Gun + fireRate: 0.25 + soundGunshot: + path: /Audio/Magic/fireball.ogg + - type: BasicEntityAmmoProvider + proto: ProjectileFireball + capacity: 5 + +- type: entity + name: magical wand of instant death + parent: WeaponWandBase + id: WeaponWandDeath + description: Only the best and brightest of the Space Wizards R&D team worked together to create this beauty. + components: + - type: Sprite + layers: + - state: death + - state: death-effect + map: ["effect"] + - type: Gun + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/mateba.ogg # PUNCH + - type: BasicEntityAmmoProvider + proto: BulletInstakillMagic + capacity: 3 + +- type: entity + name: wand of entrance + parent: WeaponWandBase + id: WeaponWandPolymorphDoor + description: For when you need a get-away route. + components: + - type: Sprite + layers: + - state: door + - state: door-effect + map: ["effect"] + - type: Gun + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/Magic/staff_door.ogg + - type: BasicEntityAmmoProvider + proto: ProjectilePolyboltDoor + capacity: 10 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml index a76af85183..531bba60c3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml @@ -15,3 +15,87 @@ intensitySlope: 6 totalIntensity: 200 maxTileBreak: 0 + +- type: entity + id: ProjectilePolyboltCarp + name: carp polybolt + description: Nooo, I don't wanna be fish! + parent: BaseBullet + noSpawn: true + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/magic.rsi + layers: + - state: spell + color: '#00FF00' + - type: PolymorphOnCollide + polymorph: WizardForcedCarp + whitelist: + components: + - Body + blacklist: + tags: + - Carp # can't re-polymorph + - type: Projectile + damage: + types: + Poison: 5 + +- type: entity + id: ProjectilePolyboltDoor + name: door polybolt + description: Nooo, I don't wanna be door! + parent: BaseBullet + noSpawn: true + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/magic.rsi + layers: + - state: spell + color: brown + - type: PolymorphOnCollide + polymorph: WizardWallDoor + whitelist: + components: + - Airlock + - Firelock + tags: + - Wall + - type: Projectile + damage: + types: + Poison: 5 + +- type: entity + id: ProjectileHealingBolt + name: healing bolt + description: I COMMAND YOU TO LIVE! + parent: BaseBullet + noSpawn: true + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/magic.rsi + layers: + - state: spell + color: white + - type: Projectile + damage: + groups: # good enough. Maybe make it call the rejuvenate command later. + Brute: -900 + Burn: -900 + Airloss: -600 + Toxin: -600 + ignoreResistances: true + +- type: entity + id: BulletInstakillMagic + name: magical lead cylinder + parent: BaseBulletHighVelocity + noSpawn: true + description: This looks familiar. + components: + - type: Projectile + damage: + types: + Piercing: 300 + ignoreResistances: true diff --git a/Resources/Prototypes/Polymorphs/polymorph.yml b/Resources/Prototypes/Polymorphs/polymorph.yml index 88a9a1b624..e0000c6f22 100644 --- a/Resources/Prototypes/Polymorphs/polymorph.yml +++ b/Resources/Prototypes/Polymorphs/polymorph.yml @@ -18,6 +18,26 @@ revertOnCrit: true revertOnDeath: true +- type: polymorph + id: WizardForcedCarp + entity: MobCarpMagic + forced: true + inventory: None + transferName: true + transferDamage: true + revertOnCrit: false + revertOnDeath: true + +- type: polymorph + id: WizardWallDoor + entity: WoodDoor + forced: true + inventory: None + transferName: false + transferDamage: false + revertOnCrit: false + revertOnDeath: false + # this is a test for transferring some visual appearance stuff - type: polymorph id: TestHumanMorph diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index bd1067747c..7f566aeef3 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -51,6 +51,9 @@ - type: Tag id: CaptainSabre +- type: Tag + id: Carp + - type: Tag id: Cartridge @@ -426,6 +429,12 @@ - type: Tag id: Window +- type: Tag + id: WizardWand # that evil vvizard vvand + +- type: Tag + id: WizardStaff + - type: Tag id: Wirecutter diff --git a/Resources/Textures/Clothing/Belt/wand.rsi/equipped-BELT.png b/Resources/Textures/Clothing/Belt/wand.rsi/equipped-BELT.png new file mode 100644 index 0000000000..e1b3cdc622 Binary files /dev/null and b/Resources/Textures/Clothing/Belt/wand.rsi/equipped-BELT.png differ diff --git a/Resources/Textures/Clothing/Belt/wand.rsi/icon.png b/Resources/Textures/Clothing/Belt/wand.rsi/icon.png new file mode 100644 index 0000000000..94f6318948 Binary files /dev/null and b/Resources/Textures/Clothing/Belt/wand.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Belt/wand.rsi/inhand-left.png b/Resources/Textures/Clothing/Belt/wand.rsi/inhand-left.png new file mode 100644 index 0000000000..30106a6a5a Binary files /dev/null and b/Resources/Textures/Clothing/Belt/wand.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Belt/wand.rsi/inhand-right.png b/Resources/Textures/Clothing/Belt/wand.rsi/inhand-right.png new file mode 100644 index 0000000000..3643ec790c Binary files /dev/null and b/Resources/Textures/Clothing/Belt/wand.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Belt/wand.rsi/meta.json b/Resources/Textures/Clothing/Belt/wand.rsi/meta.json new file mode 100644 index 0000000000..f08d693379 --- /dev/null +++ b/Resources/Textures/Clothing/Belt/wand.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "tgstation at https://github.com/tgstation/tgstation/commit/270acce4f551253d8ac75de19236b8b4be598f7f", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-BELT", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation-inhand-left.png new file mode 100644 index 0000000000..e6da06ecb8 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation-inhand-right.png new file mode 100644 index 0000000000..4211690ec5 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation.png new file mode 100644 index 0000000000..aa740792a6 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/animation.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change-inhand-left.png new file mode 100644 index 0000000000..7cfdc6551f Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change-inhand-right.png new file mode 100644 index 0000000000..25fa98bbee Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change.png new file mode 100644 index 0000000000..8ed74183da Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/change.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos-inhand-left.png new file mode 100644 index 0000000000..3bec609779 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos-inhand-right.png new file mode 100644 index 0000000000..b02b49f41b Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos.png new file mode 100644 index 0000000000..234a268263 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/chaos.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door-inhand-left.png new file mode 100644 index 0000000000..b236cda2cb Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door-inhand-right.png new file mode 100644 index 0000000000..1b92651649 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door.png new file mode 100644 index 0000000000..ff4029aafc Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/door.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing-inhand-left.png new file mode 100644 index 0000000000..45ccd0dae2 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing-inhand-right.png new file mode 100644 index 0000000000..22dfa899f0 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing.png new file mode 100644 index 0000000000..4ae5cedd19 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/healing.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/meta.json new file mode 100644 index 0000000000..336829591b --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/meta.json @@ -0,0 +1,522 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "/tg/station at https://github.com/tgstation/tgstation/commit/270acce4f551253d8ac75de19236b8b4be598f7f. edited by mirrorcult to allow layering", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "animation", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "healing", + "delays": [ + [ + 0.1, + 0.1, + 0.2, + 0.1, + 0.1, + 0.1, + 0.2, + 0.1, + 0.1, + 0.1, + 0.2, + 0.1, + 0.1, + 0.1, + 0.2, + 0.1 + ] + ] + }, + { + "name": "door", + "delays": [ + [ + 2, + 2, + 2, + 2 + ] + ] + }, + { + "name": "staff-inhand-left", + "directions": 4, + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "animation-inhand-left", + "directions": 4, + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "healing-inhand-left", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ] + ] + }, + { + "name": "door-inhand-left", + "directions": 4, + "delays": [ + [ + 2, + 2, + 2, + 2 + ], + [ + 2, + 2, + 2, + 2 + ], + [ + 2, + 2, + 2, + 2 + ], + [ + 2, + 2, + 2, + 2 + ] + ] + }, + { + "name": "staff-inhand-right", + "directions": 4, + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "animation-inhand-right", + "directions": 4, + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "healing-inhand-right", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ], + [ + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1, + 0.2, + 0.2, + 0.1 + ] + ] + }, + { + "name": "door-inhand-right", + "directions": 4, + "delays": [ + [ + 2, + 2, + 2, + 2 + ], + [ + 2, + 2, + 2, + 2 + ], + [ + 2, + 2, + 2, + 2 + ], + [ + 2, + 2, + 2, + 2 + ] + ] + }, + { + "name": "change", + "delays": [ + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ] + ] + }, + { + "name": "nothing", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "chaos", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "change-inhand-left", + "directions": 4, + "delays": [ + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ] + ] + }, + { + "name": "chaos-inhand-left", + "directions": 4, + "delays": [ + [ + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4 + ] + ] + }, + { + "name": "change-inhand-right", + "directions": 4, + "delays": [ + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ], + [ + 0.4, + 0.4, + 0.4, + 0.4, + 0.4 + ] + ] + }, + { + "name": "chaos-inhand-right", + "directions": 4, + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/nothing.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/nothing.png new file mode 100644 index 0000000000..206d014190 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/nothing.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staff-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staff-inhand-left.png new file mode 100644 index 0000000000..e33e186dbc Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staff-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staff-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staff-inhand-right.png new file mode 100644 index 0000000000..b9b4e887e7 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staff-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staffofchange.png b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staffofchange.png new file mode 100644 index 0000000000..7cfdc6551f Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/staves.rsi/staffofchange.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/death-effect.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/death-effect.png new file mode 100644 index 0000000000..3fcfdce248 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/death-effect.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/death.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/death.png new file mode 100644 index 0000000000..7b333f6c02 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/death.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/door-effect.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/door-effect.png new file mode 100644 index 0000000000..7d454368f9 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/door-effect.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/door.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/door.png new file mode 100644 index 0000000000..5b5931e75e Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/door.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/fire-effect.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/fire-effect.png new file mode 100644 index 0000000000..3ae5faab61 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/fire-effect.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/fire.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/fire.png new file mode 100644 index 0000000000..2b7a4e971f Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/fire.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/meta.json new file mode 100644 index 0000000000..87b6f38677 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/meta.json @@ -0,0 +1,68 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "/tg/station at https://github.com/tgstation/tgstation/commit/270acce4f551253d8ac75de19236b8b4be598f7f. edited by mirrorcult to allow layering", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "death-effect", + "delays": [ + [ + 0.3, + 0.3 + ] + ] + }, + { + "name": "poly-effect", + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5 + ] + ] + }, + { + "name": "fire-effect", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "death" + }, + { + "name": "poly" + }, + { + "name": "fire" + }, + { + "name": "door-effect" + }, + { + "name": "door" + }, + { + "name": "nothing" + }, + { + "name": "wand-inhand-left", + "directions": 4 + }, + { + "name": "wand-inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/nothing.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/nothing.png new file mode 100644 index 0000000000..a328f74518 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/nothing.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/poly-effect.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/poly-effect.png new file mode 100644 index 0000000000..b51869909b Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/poly-effect.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/poly.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/poly.png new file mode 100644 index 0000000000..1c874a108d Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/poly.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/wand-inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/wand-inhand-left.png new file mode 100644 index 0000000000..ec6d94fd48 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/wand-inhand-left.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/wand-inhand-right.png b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/wand-inhand-right.png new file mode 100644 index 0000000000..fa6ab91aa4 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Magic/wands.rsi/wand-inhand-right.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/arcane_barrage.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/arcane_barrage.png index 01c0e4defd..4e3f535c84 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/arcane_barrage.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/arcane_barrage.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/blastwave.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/blastwave.png index 1c5a61977d..f8f7403a23 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/blastwave.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/blastwave.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/chronobolt.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/chronobolt.png index d01c2f4252..b19ada913d 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/chronobolt.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/chronobolt.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/cryoshot.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/cryoshot.png index fa0e71fca1..58d699a41b 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/cryoshot.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/cryoshot.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/declone.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/declone.png index a58e39c967..b4a24cce29 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/declone.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/declone.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy.png deleted file mode 100644 index 6e342dc484..0000000000 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy.png and /dev/null differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy2.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy2.png deleted file mode 100644 index 7977e0fd11..0000000000 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy2.png and /dev/null differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy3.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy3.png deleted file mode 100644 index e9a739990f..0000000000 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/energy3.png and /dev/null differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/fireball.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/fireball.png index 4bc539cb0e..cacff024ba 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/fireball.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/fireball.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/infernoshot.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/infernoshot.png index f98259a142..7975492ce5 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/infernoshot.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/infernoshot.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/meta.json index e0f5e8813b..4158535ddc 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/meta.json @@ -7,16 +7,6 @@ "y": 32 }, "states": [ - { - "name": "energy", - "delays": [ - [ - 0.1, - 0.1, - 0.1 - ] - ] - }, { "name": "magicm", "delays": [ @@ -59,26 +49,6 @@ ] ] }, - { - "name": "energy2", - "delays": [ - [ - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "energy3", - "delays": [ - [ - 0.1, - 0.1, - 0.1 - ] - ] - }, { "name": "chronobolt" }, diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/spell.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/spell.png index aff863515c..982ff66a74 100644 Binary files a/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/spell.png and b/Resources/Textures/Objects/Weapons/Guns/Projectiles/magic.rsi/spell.png differ