diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index 0f7266f700..0b42c6d266 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -39,6 +39,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Replays; using Robust.Shared.Timing; using Content.Client._NF.Emp.Overlays; // Frontier +using Content.Client._RMC14.Xenonids.Screech; // RMC14 namespace Content.Client.Entry { @@ -173,6 +174,7 @@ namespace Content.Client.Entry _overlayManager.AddOverlay(new SingularityOverlay()); _overlayManager.AddOverlay(new RadiationPulseOverlay()); + _overlayManager.AddOverlay(new RMCXenoScreechShockWaveOverlay()); // RMC14 _overlayManager.AddOverlay(new EmpBlastOverlay()); // Frontier _chatManager.Initialize(); _clientPreferencesManager.Initialize(); diff --git a/Content.Client/_Goobstation/Overlays/ThermalVisionOverlay.cs b/Content.Client/_Goobstation/Overlays/ThermalVisionOverlay.cs index d99741bd55..239ec3dc2c 100644 --- a/Content.Client/_Goobstation/Overlays/ThermalVisionOverlay.cs +++ b/Content.Client/_Goobstation/Overlays/ThermalVisionOverlay.cs @@ -80,6 +80,7 @@ public sealed class ThermalVisionOverlay : Overlay _lightEntity ??= _entity.SpawnAttachedTo(null, playerXform.Coordinates); _transform.SetParent(_lightEntity.Value, player.Value); var light = _entity.EnsureComponent(_lightEntity.Value); + light.NetSyncEnabled = false; // DeltaV - Desync this component _light.SetRadius(_lightEntity.Value, LightRadius, light); _light.SetEnergy(_lightEntity.Value, alpha, light); _light.SetColor(_lightEntity.Value, Comp.Color, light); diff --git a/Content.Client/_RMC14/Effect/RMCEffectSystem.cs b/Content.Client/_RMC14/Effect/RMCEffectSystem.cs new file mode 100644 index 0000000000..8e3de8dd63 --- /dev/null +++ b/Content.Client/_RMC14/Effect/RMCEffectSystem.cs @@ -0,0 +1,43 @@ +using Content.Shared._RMC14.Effect; +using Robust.Client.GameObjects; +using Robust.Shared.Timing; + +namespace Content.Client._RMC14.Effect; + +public sealed class RMCEffectSystem : SharedRMCEffectSystem +{ + // Most effects are pretty large and flashy so we're dividing the opacity of the parent by 3 before applying it to the effect. + private const int OpacityDivider = 3; + + [Dependency] private readonly IGameTiming _timing = default!; + + public override void FrameUpdate(float frameTime) + { + var time = _timing.CurTime; + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var effect, out var sprite)) + { + if (effect.SpawnedAt is not { } spawned) + continue; + + var alpha = MathHelper.Lerp((spawned + effect.Delay).TotalSeconds, spawned.TotalSeconds, time.TotalSeconds); + sprite.Color = sprite.Color.WithAlpha((float) alpha); + } + + var query2 = EntityQueryEnumerator(); + while (query2.MoveNext(out var uid, out var effect)) + { + var parent = Transform(uid).ParentUid; + + if (!TryComp(parent, out SpriteComponent? parentSprite)) + return; + + if (!TryComp(uid, out SpriteComponent? sprite)) + return; + + // Only apply the reduced opacity to the effect if the parent's opacity is < 1. + if (sprite.Color.A < 1) + sprite.Color = sprite.Color.WithAlpha(parentSprite.Color.A / OpacityDivider); + } + } +} diff --git a/Content.Client/_RMC14/Xenonids/Screech/RMCXenoScreechShockWaveOverlay.cs b/Content.Client/_RMC14/Xenonids/Screech/RMCXenoScreechShockWaveOverlay.cs new file mode 100644 index 0000000000..daaa8fe312 --- /dev/null +++ b/Content.Client/_RMC14/Xenonids/Screech/RMCXenoScreechShockWaveOverlay.cs @@ -0,0 +1,77 @@ +using System.Numerics; +using Content.Shared._RMC14.Xenonids.Screech; +using Robust.Client.Graphics; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; + +namespace Content.Client._RMC14.Xenonids.Screech; + +public sealed class RMCXenoScreechShockWaveOverlay : Overlay, IEntityEventSubscriber +{ + [Dependency] private readonly IEntityManager _entMan = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + private SharedTransformSystem? _xformSystem; + + public override OverlaySpace Space => OverlaySpace.WorldSpace; + public override bool RequestScreenTexture => true; + + private readonly ShaderInstance _shader; + + public RMCXenoScreechShockWaveOverlay() + { + IoCManager.InjectDependencies(this); + _shader = _prototypeManager.Index("RMCXenoScreechShockWave").Instance().Duplicate(); + } + + private Vector2 _position; + private float _waveStrength; + private float _waveSpeed; + private float _downScale; + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (args.Viewport.Eye == null || _xformSystem is null && !_entMan.TrySystem(out _xformSystem)) + return false; + + var query = _entMan.EntityQueryEnumerator(); + + if (query.MoveNext(out var uid, out var distortion, out var xform)) + { + if (xform.MapID != args.MapId) + return false; + + var mapPos = _xformSystem.GetWorldPosition(uid); + var tempCoords = args.Viewport.WorldToLocal(mapPos); + + // normalized coords, 0 - 1 plane. This is pure hell, we subtract 1 because fragment calculates from the bottom and local goes from the top of the viewport + tempCoords.Y = 1 - (tempCoords.Y / args.Viewport.Size.Y); + tempCoords.X /= args.Viewport.Size.X; + + _position = tempCoords; + _waveStrength = distortion.WaveStrength; + _waveSpeed = distortion.WaveSpeed; + _downScale = distortion.DownScale; + + return true; + } + + return false; + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture == null || args.Viewport.Eye == null) + return; + + _shader?.SetParameter("position", _position); + _shader?.SetParameter("waveSpeed", _waveSpeed); + _shader?.SetParameter("downScale", _downScale); + _shader?.SetParameter("waveStrength", _waveStrength); + _shader?.SetParameter("SCREEN_TEXTURE", ScreenTexture); + + var worldHandle = args.WorldHandle; + worldHandle.UseShader(_shader); + worldHandle.DrawRect(args.WorldBounds, Color.White); + worldHandle.UseShader(null); + } +} diff --git a/Content.Server/_DV/Abilities/Psionics/PsychokineticScreamPowerSystem.cs b/Content.Server/_DV/Abilities/Psionics/PsychokineticScreamPowerSystem.cs index 134aa1fb26..aae1c70381 100644 --- a/Content.Server/_DV/Abilities/Psionics/PsychokineticScreamPowerSystem.cs +++ b/Content.Server/_DV/Abilities/Psionics/PsychokineticScreamPowerSystem.cs @@ -1,6 +1,7 @@ using Content.Shared._DV.Abilities; using Content.Shared.Abilities.Psionics; using Content.Shared.Actions; +using Content.Shared.Coordinates; using Robust.Server.Audio; namespace Content.Server._DV.Abilities; @@ -50,6 +51,9 @@ public sealed partial class PsychokineticScreamPowerSystem : EntitySystem _audio.PlayPvs(entity.Comp.AbilitySound, entity); _shatterLights.ShatterLightsAround(entity.Owner, entity.Comp.Radius, entity.Comp.LineOfSight); + + SpawnAttachedTo(entity.Comp.Effect, entity.Owner.ToCoordinates()); + args.Handled = true; } diff --git a/Content.Server/_DV/Abilities/ShatterLightsAbilitySystem.cs b/Content.Server/_DV/Abilities/ShatterLightsAbilitySystem.cs index 1e3b310af1..0bd53072d1 100644 --- a/Content.Server/_DV/Abilities/ShatterLightsAbilitySystem.cs +++ b/Content.Server/_DV/Abilities/ShatterLightsAbilitySystem.cs @@ -2,6 +2,7 @@ using Content.Server.Light.Components; using Content.Server.Light.EntitySystems; using Content.Shared._DV.Abilities; using Content.Shared.Actions; +using Content.Shared.Coordinates; using Content.Shared.Physics; using Robust.Server.Audio; using Robust.Shared.Map; @@ -52,6 +53,8 @@ public sealed partial class ShatterLightsAbilitySystem : EntitySystem _audio.PlayPvs(entity.Comp.AbilitySound, entity); ShatterLightsAround(entity.Owner, entity.Comp.Radius, entity.Comp.LineOfSight); + + SpawnAttachedTo(entity.Comp.Effect, entity.Owner.ToCoordinates()); args.Handled = true; } diff --git a/Content.Server/_RMC14/Effect/RMCEffectSystem.cs b/Content.Server/_RMC14/Effect/RMCEffectSystem.cs new file mode 100644 index 0000000000..eef80c4143 --- /dev/null +++ b/Content.Server/_RMC14/Effect/RMCEffectSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared._RMC14.Effect; + +namespace Content.Server._RMC14.Effect; + +public sealed class RMCEffectSystem : SharedRMCEffectSystem; diff --git a/Content.Shared/_DV/Abilities/Psionics/PsychokineticScreamPowerComponent.cs b/Content.Shared/_DV/Abilities/Psionics/PsychokineticScreamPowerComponent.cs index 48f7ebc07c..6def2b2a86 100644 --- a/Content.Shared/_DV/Abilities/Psionics/PsychokineticScreamPowerComponent.cs +++ b/Content.Shared/_DV/Abilities/Psionics/PsychokineticScreamPowerComponent.cs @@ -37,6 +37,12 @@ public sealed partial class PsychokineticScreamPowerComponent : Component /// [DataField] public SoundSpecifier AbilitySound = new SoundPathSpecifier("/Audio/_DV/Effects/creepyshriek.ogg"); + + /// + /// The effect to spawn when the ability is used. + /// + [DataField] + public EntProtoId Effect = "CMEffectScreech"; } public sealed partial class ShatterLightsActionEvent : InstantActionEvent; diff --git a/Content.Shared/_DV/Abilities/ShatterLightsAbilityComponent.cs b/Content.Shared/_DV/Abilities/ShatterLightsAbilityComponent.cs index fb5412ef52..2ad28cf382 100644 --- a/Content.Shared/_DV/Abilities/ShatterLightsAbilityComponent.cs +++ b/Content.Shared/_DV/Abilities/ShatterLightsAbilityComponent.cs @@ -37,6 +37,12 @@ public sealed partial class ShatterLightsAbilityComponent : Component /// [DataField] public SoundSpecifier AbilitySound = new SoundPathSpecifier("/Audio/_DV/Effects/creepyshriek.ogg"); + + /// + /// The effect to spawn when the ability is used. + /// + [DataField] + public EntProtoId Effect = "CMEffectScreech"; } public sealed partial class ShatterLightsActionEvent : InstantActionEvent; diff --git a/Content.Shared/_RMC14/Effect/EffectAlphaAnimationComponent.cs b/Content.Shared/_RMC14/Effect/EffectAlphaAnimationComponent.cs new file mode 100644 index 0000000000..f21982806b --- /dev/null +++ b/Content.Shared/_RMC14/Effect/EffectAlphaAnimationComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._RMC14.Effect; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedRMCEffectSystem))] +public sealed partial class EffectAlphaAnimationComponent : Component +{ + [DataField, AutoNetworkedField] + public TimeSpan? SpawnedAt; + + [DataField, AutoNetworkedField] + public TimeSpan Delay = TimeSpan.FromSeconds(1); +} diff --git a/Content.Shared/_RMC14/Effect/RMCEffectComponent.cs b/Content.Shared/_RMC14/Effect/RMCEffectComponent.cs new file mode 100644 index 0000000000..935abc71af --- /dev/null +++ b/Content.Shared/_RMC14/Effect/RMCEffectComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._RMC14.Effect; + +[RegisterComponent, NetworkedComponent] +public sealed partial class RMCEffectComponent : Component +{ + +} diff --git a/Content.Shared/_RMC14/Effect/SharedRMCEffectSystem.cs b/Content.Shared/_RMC14/Effect/SharedRMCEffectSystem.cs new file mode 100644 index 0000000000..e547426b0b --- /dev/null +++ b/Content.Shared/_RMC14/Effect/SharedRMCEffectSystem.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Timing; + +namespace Content.Shared._RMC14.Effect; + +public abstract class SharedRMCEffectSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnAlphaAnimationMapInit); + } + + private void OnAlphaAnimationMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.SpawnedAt = _timing.CurTime; + Dirty(ent); + } +} diff --git a/Content.Shared/_RMC14/Xenonids/Screech/RMCXenoScreechShockWaveComponent.cs b/Content.Shared/_RMC14/Xenonids/Screech/RMCXenoScreechShockWaveComponent.cs new file mode 100644 index 0000000000..0ea4e199b5 --- /dev/null +++ b/Content.Shared/_RMC14/Xenonids/Screech/RMCXenoScreechShockWaveComponent.cs @@ -0,0 +1,27 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._RMC14.Xenonids.Screech; + +[RegisterComponent, NetworkedComponent] +[AutoGenerateComponentState] +public sealed partial class RMCXenoScreechShockWaveComponent : Component +{ + /// + /// The speed of each individual wave from the center axis. + /// + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float WaveSpeed = 15.3f; + + /// + /// The size of each wave in its width and distortion effect + /// + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float WaveStrength = 1.0f; + + /// + /// The scale of the effect, lower number means a larger total area while smaller numbers downscale it and reduce the effected area. + /// + [DataField, AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float DownScale = 1.5f; +} + diff --git a/Resources/Locale/en-US/_DV/store/uplink/wearables.ftl b/Resources/Locale/en-US/_DV/store/uplink/wearables.ftl index 00a75b5334..352753e3ef 100644 --- a/Resources/Locale/en-US/_DV/store/uplink/wearables.ftl +++ b/Resources/Locale/en-US/_DV/store/uplink/wearables.ftl @@ -12,3 +12,9 @@ uplink-hardsuit-syndieelite-desc-deltav = An alternate version of the blood-red uplink-cwpgorlex-name = Gorlex Cold Weather Poncho uplink-cwpgorlex-desc = A warm poncho for extreme weather. Made of cut-proof fabric, and protects against freezing weapons as well. + +uplink-night-vision-goggles-name = Night Vision Goggles +uplink-night-vision-goggles-desc = High-tech goggles that allow you to see in the dark. + +uplink-thermal-goggles-name = Thermal Goggles +uplink-thermal-goggles-desc = High-tech goggles that allow you to see heat signatures. These ones look like Night Vision Goggles to avoid detection. diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 0b6cb2199f..02d1968bce 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -228,7 +228,6 @@ - Equipment - FauxTiles - Botany # DeltaV - - SpecOpsGoogles # DeltaV - Surgery # Shitmed change - type: EmagLatheRecipes emagDynamicPacks: @@ -443,7 +442,6 @@ - SecurityRubberAmmoStatic - PrisonerSoftsuits - EVASuit - - SpecOpsGoogles # End DeltaV Additions dynamicPacks: - SalvageSecurityBoards @@ -453,6 +451,7 @@ - SecurityExplosives - SecurityAmmo - SecurityWeapons + - SpecOpsGoogles # DeltaV #- SecurityDisablers # DeltaV - made roundstart - type: MaterialStorage whitelist: diff --git a/Resources/Prototypes/Roles/Antags/nukeops.yml b/Resources/Prototypes/Roles/Antags/nukeops.yml index 61cf08f141..7a3f8c1958 100644 --- a/Resources/Prototypes/Roles/Antags/nukeops.yml +++ b/Resources/Prototypes/Roles/Antags/nukeops.yml @@ -57,7 +57,7 @@ jumpsuit: ClothingUniformJumpsuitOperative back: ClothingBackpackDuffelSyndicate mask: ClothingMaskGasSyndicate - eyes: ClothingEyesNightVisionGogglesNukie # Goobstation + eyes: ClothingEyesHudSyndicate ears: ClothingHeadsetAltSyndicate gloves: ClothingHandsGlovesCombat outerClothing: ClothingOuterHardsuitSyndie @@ -115,7 +115,7 @@ parent: SyndicateOperativeGearFull equipment: pocket2: AgentUplinkRadio45TC # DeltaV - allows them to buy Agent armor - eyes: ClothingEyesNightVisionGogglesNukie # Goobstation + eyes: ClothingEyesHudSyndicateAgent outerClothing: ClothingOuterCoatCybersunWindbreaker # DeltaV - removal of armor # shoes: ClothingShoesBootsMagSyndie # DeltaV - removal of armor id: SyndiAgentPDA diff --git a/Resources/Prototypes/_DV/Catalog/Uplink/wearables.yml b/Resources/Prototypes/_DV/Catalog/Uplink/wearables.yml index 36071dba85..43596ade1e 100644 --- a/Resources/Prototypes/_DV/Catalog/Uplink/wearables.yml +++ b/Resources/Prototypes/_DV/Catalog/Uplink/wearables.yml @@ -63,3 +63,25 @@ Telecrystal: 2 categories: - UplinkWearables + +- type: listing + id: UplinkNightVisionGoggles + name: uplink-night-vision-goggles-name + description: uplink-night-vision-goggles-desc + icon: { sprite: _White/Clothing/Eyes/Goggles/nightvision.rsi, state: icon } + productEntity: ClothingEyesNightVisionGoggles + cost: + Telecrystal: 3 + categories: + - UplinkWearables + +- type: listing + id: UplinkThermalGoggles + name: uplink-thermal-goggles-name + description: uplink-thermal-goggles-desc + icon: { sprite: _White/Clothing/Eyes/Goggles/thermal.rsi, state: icon } + productEntity: ClothingEyesThermalVisionGogglesSyndie + cost: + Telecrystal: 5 + categories: + - UplinkWearables diff --git a/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml b/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml index cbae1bb38c..0b29fec94f 100644 --- a/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml +++ b/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml @@ -20,6 +20,8 @@ cost: 400 - id: ClothingEyesGlassesGarMeson cost: 500 + - id: ClothingEyesNightVisionGoggles + cost: 2000 - id: ClothingBeltSalvageWebbing cost: 500 - id: PlasteelArmingSword diff --git a/Resources/Prototypes/_DV/Entities/Mobs/NPCs/skia.yml b/Resources/Prototypes/_DV/Entities/Mobs/NPCs/skia.yml index b5e35b1054..f1989010d0 100644 --- a/Resources/Prototypes/_DV/Entities/Mobs/NPCs/skia.yml +++ b/Resources/Prototypes/_DV/Entities/Mobs/NPCs/skia.yml @@ -16,6 +16,9 @@ Base: skia Dead: Base: dead + - type: SlowOnDamage + speedModifierThresholds: + 100: 0.9 - type: MobState allowedStates: - Alive @@ -27,15 +30,17 @@ - type: Damageable damageModifierSet: ManifestedSpirit damageContainer: BiologicalMetaphysical - - type: Armor - modifiers: - coefficients: - Blunt: 0.4 - Slash: 0.4 - Piercing: 0.4 - Heat: 0.8 - Radiation: 0.2 - Caustic: 0.2 + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 160 + mask: + - SmallMobMask + layer: + - SmallMobLayer - type: MovementSpeedModifier baseWalkSpeed: 2.25 baseSprintSpeed: 3.75 diff --git a/Resources/Prototypes/_DV/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/_DV/Entities/Structures/Machines/lathe.yml index 721aa65fe6..93bcc9b58f 100644 --- a/Resources/Prototypes/_DV/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/_DV/Entities/Structures/Machines/lathe.yml @@ -89,7 +89,6 @@ - EngineeringWeapons - FauxTiles - Equipment - - SpecOpsGoogles - UpgradeKits - UpgradeKits_Goob - EngineeringHardsuits @@ -131,7 +130,6 @@ dynamicPacks: - Equipment - Mining - - SpecOpsGoogles - SalvageWeapons - SalvageHardsuits - type: Machine @@ -218,7 +216,6 @@ - ScienceEquipment - ScienceClothing - ScienceWeapons - - SpecOpsGoogles - Chemistry - PowerCells - type: Machine diff --git a/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml index 5e308ff40e..1c79bd0be8 100644 --- a/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml +++ b/Resources/Prototypes/_Goobstation/Recipes/Lathes/Packs/misc.yml @@ -12,4 +12,3 @@ id: SpecOpsGoogles recipes: - ClothingEyesNightVisionGoggles - - ClothingEyesGlassesThermal \ No newline at end of file diff --git a/Resources/Prototypes/_RMC14/Effects/base.yml b/Resources/Prototypes/_RMC14/Effects/base.yml new file mode 100644 index 0000000000..53b6294b9f --- /dev/null +++ b/Resources/Prototypes/_RMC14/Effects/base.yml @@ -0,0 +1,5 @@ +- type: entity + id: RMCBaseEffect + abstract: true + components: + - type: RMCEffect diff --git a/Resources/Prototypes/_RMC14/Effects/screech.yml b/Resources/Prototypes/_RMC14/Effects/screech.yml new file mode 100644 index 0000000000..4b65cd8edb --- /dev/null +++ b/Resources/Prototypes/_RMC14/Effects/screech.yml @@ -0,0 +1,18 @@ +- type: entity + # Just fades out with no movement animation + parent: RMCBaseEffect + id: CMEffectScreech + categories: [ HideSpawnMenu ] + components: + - type: TimedDespawn + lifetime: 3.2 + - type: RMCXenoScreechShockWave + - type: Sprite + sprite: _RMC14/Effects/xeno_screech.rsi + noRot: true + state: screech + drawdepth: Effects + - type: EffectVisuals + - type: Tag + tags: + - HideContextMenu \ No newline at end of file diff --git a/Resources/Prototypes/_RMC14/Shaders/shaders.yml b/Resources/Prototypes/_RMC14/Shaders/shaders.yml new file mode 100644 index 0000000000..9ff98d6ef2 --- /dev/null +++ b/Resources/Prototypes/_RMC14/Shaders/shaders.yml @@ -0,0 +1,4 @@ +- type: shader + id: RMCXenoScreechShockWave + kind: source + path: "/Textures/_RMC14/Shaders/screech_shock_wave.swsl" diff --git a/Resources/Prototypes/_White/Entities/Clothing/Eyes/goggles.yml b/Resources/Prototypes/_White/Entities/Clothing/Eyes/goggles.yml index 964cf293d0..038790f08e 100644 --- a/Resources/Prototypes/_White/Entities/Clothing/Eyes/goggles.yml +++ b/Resources/Prototypes/_White/Entities/Clothing/Eyes/goggles.yml @@ -74,9 +74,9 @@ description: A high-tech pair of thermal goggles. components: - type: Sprite - sprite: _White/Clothing/Eyes/Goggles/sthermals.rsi + sprite: _White/Clothing/Eyes/Goggles/nightvision.rsi # Look like standard NVs to avoid gank. - type: Clothing - sprite: _White/Clothing/Eyes/Goggles/sthermals.rsi + sprite: _White/Clothing/Eyes/Goggles/nightvision.rsi - type: ThermalVision flashDurationMultiplier: 2 isEquipment: true diff --git a/Resources/Prototypes/_White/Research/experimental.yml b/Resources/Prototypes/_White/Research/experimental.yml index 34b80578da..bc4a8cf78f 100644 --- a/Resources/Prototypes/_White/Research/experimental.yml +++ b/Resources/Prototypes/_White/Research/experimental.yml @@ -23,17 +23,3 @@ - ClothingEyesNightVisionGoggles technologyPrerequisites: - MagnetsTech - -- type: technology - id: ThermalVisionTech - name: research-technology-thermal-vision - icon: - sprite: _White/Clothing/Eyes/Goggles/thermal.rsi - state: icon - discipline: Experimental - tier: 2 - cost: 10000 - recipeUnlocks: - - ClothingEyesGlassesThermal - technologyPrerequisites: - - MagnetsTech diff --git a/Resources/Textures/_RMC14/Effects/xeno_screech.rsi/meta.json b/Resources/Textures/_RMC14/Effects/xeno_screech.rsi/meta.json new file mode 100644 index 0000000000..0d9e8d5bad --- /dev/null +++ b/Resources/Textures/_RMC14/Effects/xeno_screech.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from cmss13 at https://github.com/cmss13-devs/cmss13/blob/d5b119380250ea512db2a5319e36592c7f604250/icons/effects/xeno_screech.dmi", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "screech", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_RMC14/Effects/xeno_screech.rsi/screech.png b/Resources/Textures/_RMC14/Effects/xeno_screech.rsi/screech.png new file mode 100644 index 0000000000..e93bed0eab Binary files /dev/null and b/Resources/Textures/_RMC14/Effects/xeno_screech.rsi/screech.png differ diff --git a/Resources/Textures/_RMC14/Shaders/screech_shock_wave.swsl b/Resources/Textures/_RMC14/Shaders/screech_shock_wave.swsl new file mode 100644 index 0000000000..0978f694f0 --- /dev/null +++ b/Resources/Textures/_RMC14/Shaders/screech_shock_wave.swsl @@ -0,0 +1,28 @@ +uniform sampler2D SCREEN_TEXTURE; +uniform highp float waveStrength; +uniform highp vec2 position; +uniform highp float waveSpeed; +uniform highp float downScale; + +void fragment() +{ + highp vec2 st = UV; + highp vec2 WaveCentre = position; + highp float ratio = SCREEN_PIXEL_SIZE.y / SCREEN_PIXEL_SIZE.x * 0.5; + WaveCentre.y *= ratio; + highp float dist = distance(vec2(st.x, st.y * ratio), WaveCentre) * downScale; + highp float val = dist; + highp float a = 3.0; + highp float cosFuns = cos(val * 20.0 - TIME * waveSpeed); + highp float powFuns = pow(val * 2.5, a); + highp float limtedPowFuns = 0.5 * pow(a / (a + powFuns), 2.0); + highp float finalRes = smoothstep(0.0, 1.0, limtedPowFuns * cosFuns) * waveStrength; + highp vec3 col = finalRes * vec3(1.0); + st = st * 2.0 - 1.0; + st *= 1.0 + finalRes * 0.1; + st = st * 0.5 + 0.5; + highp vec4 texCol = zTextureSpec(SCREEN_TEXTURE, st); + texCol += (texCol * finalRes) / (dist * 10.0); + + COLOR = texCol; +}