merge master

This commit is contained in:
deltanedas 2024-11-20 05:15:21 +00:00
commit 3b6c3b56ec
83 changed files with 1345 additions and 216 deletions

View File

@ -0,0 +1,52 @@
using System.Numerics;
using Content.Shared.DeltaV.Pain;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
namespace Content.Client.DeltaV.Overlays;
public sealed partial class PainOverlay : Overlay
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IEntityManager _entity = default!;
public override bool RequestScreenTexture => true;
public override OverlaySpace Space => OverlaySpace.WorldSpace;
private readonly ShaderInstance _painShader;
private readonly ProtoId<ShaderPrototype> _shaderProto = "ChromaticAberration";
public PainOverlay()
{
IoCManager.InjectDependencies(this);
_painShader = _prototype.Index(_shaderProto).Instance().Duplicate();
}
protected override bool BeforeDraw(in OverlayDrawArgs args)
{
if (_player.LocalEntity is not { Valid: true } player
|| !_entity.HasComponent<PainComponent>(player))
{
return false;
}
return base.BeforeDraw(in args);
}
protected override void Draw(in OverlayDrawArgs args)
{
if (ScreenTexture is null)
return;
_painShader.SetParameter("SCREEN_TEXTURE", ScreenTexture);
var worldHandle = args.WorldHandle;
var viewport = args.WorldBounds;
worldHandle.SetTransform(Matrix3x2.Identity);
worldHandle.UseShader(_painShader);
worldHandle.DrawRect(viewport, Color.White);
worldHandle.UseShader(null);
}
}

View File

@ -0,0 +1,65 @@
using Content.Shared.DeltaV.Pain;
using Robust.Client.Graphics;
using Robust.Shared.Player;
namespace Content.Client.DeltaV.Overlays;
public sealed partial class PainSystem : EntitySystem
{
[Dependency] private readonly IOverlayManager _overlayMan = default!;
[Dependency] private readonly ISharedPlayerManager _playerMan = default!;
private PainOverlay _overlay = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PainComponent, ComponentInit>(OnPainInit);
SubscribeLocalEvent<PainComponent, ComponentShutdown>(OnPainShutdown);
SubscribeLocalEvent<PainComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<PainComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
_overlay = new();
}
private void OnPainInit(Entity<PainComponent> ent, ref ComponentInit args)
{
if (ent.Owner == _playerMan.LocalEntity && !ent.Comp.Suppressed)
_overlayMan.AddOverlay(_overlay);
}
private void OnPainShutdown(Entity<PainComponent> ent, ref ComponentShutdown args)
{
if (ent.Owner == _playerMan.LocalEntity)
_overlayMan.RemoveOverlay(_overlay);
}
private void OnPlayerAttached(Entity<PainComponent> ent, ref LocalPlayerAttachedEvent args)
{
if (!ent.Comp.Suppressed)
_overlayMan.AddOverlay(_overlay);
}
private void OnPlayerDetached(Entity<PainComponent> ent, ref LocalPlayerDetachedEvent args)
{
_overlayMan.RemoveOverlay(_overlay);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
// Handle showing/hiding overlay based on suppression status
if (_playerMan.LocalEntity is not { } player)
return;
if (!TryComp<PainComponent>(player, out var comp))
return;
if (comp.Suppressed && _overlayMan.HasOverlay<PainOverlay>())
_overlayMan.RemoveOverlay(_overlay);
else if (!comp.Suppressed && !_overlayMan.HasOverlay<PainOverlay>())
_overlayMan.AddOverlay(_overlay);
}
}

View File

@ -0,0 +1,65 @@
using Content.Shared._EE.FootPrint;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Shared.Random;
namespace Content.Client._EE.FootPrint;
public sealed class FootPrintsVisualizerSystem : VisualizerSystem<FootPrintComponent>
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FootPrintComponent, ComponentInit>(OnInitialized);
SubscribeLocalEvent<FootPrintComponent, ComponentShutdown>(OnShutdown);
}
private void OnInitialized(EntityUid uid, FootPrintComponent comp, ComponentInit args)
{
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
sprite.LayerMapReserveBlank(FootPrintVisualLayers.Print);
UpdateAppearance(uid, comp, sprite);
}
private void OnShutdown(EntityUid uid, FootPrintComponent comp, ComponentShutdown args)
{
if (TryComp<SpriteComponent>(uid, out var sprite)
&& sprite.LayerMapTryGet(FootPrintVisualLayers.Print, out var layer))
sprite.RemoveLayer(layer);
}
private void UpdateAppearance(EntityUid uid, FootPrintComponent component, SpriteComponent sprite)
{
if (!sprite.LayerMapTryGet(FootPrintVisualLayers.Print, out var layer)
|| !TryComp<FootPrintsComponent>(component.PrintOwner, out var printsComponent)
|| !TryComp<AppearanceComponent>(uid, out var appearance)
|| !_appearance.TryGetData<FootPrintVisuals>(uid, FootPrintVisualState.State, out var printVisuals, appearance))
return;
sprite.LayerSetState(layer, new RSI.StateId(printVisuals switch
{
FootPrintVisuals.BareFootPrint => printsComponent.RightStep ? printsComponent.RightBarePrint : printsComponent.LeftBarePrint,
FootPrintVisuals.ShoesPrint => printsComponent.ShoesPrint,
FootPrintVisuals.SuitPrint => printsComponent.SuitPrint,
FootPrintVisuals.Dragging => _random.Pick(printsComponent.DraggingPrint),
_ => throw new ArgumentOutOfRangeException($"Unknown {printVisuals} parameter.")
}), printsComponent.RsiPath);
if (_appearance.TryGetData<Color>(uid, FootPrintVisualState.Color, out var printColor, appearance))
sprite.LayerSetColor(layer, printColor);
}
protected override void OnAppearanceChange (EntityUid uid, FootPrintComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite is not { } sprite)
return;
UpdateAppearance(uid, component, sprite);
}
}

View File

@ -30,6 +30,19 @@ public sealed class AddictionSystem : SharedAddictionSystem
SubscribeLocalEvent<AddictedComponent, ComponentStartup>(OnInit);
}
protected override void UpdateAddictionSuppression(Entity<AddictedComponent> ent, float duration)
{
var curTime = _timing.CurTime;
var newEndTime = curTime + TimeSpan.FromSeconds(duration);
// Only update if this would extend the suppression
if (newEndTime <= ent.Comp.SuppressionEndTime)
return;
ent.Comp.SuppressionEndTime = newEndTime;
UpdateSuppressed(ent.Comp);
}
public override void Update(float frameTime)
{
base.Update(frameTime);

View File

@ -7,19 +7,20 @@ namespace Content.Server.EntityEffects.Effects;
public sealed partial class Addicted : EntityEffect
{
/// <summary>
/// How long should each metabolism cycle make the effect last for.
/// How long should each metabolism cycle make the effect last for.
/// </summary>
[DataField]
public float AddictionTime = 3f;
public float AddictionTime = 5f;
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-addicted", ("chance", Probability));
public override void Effect(EntityEffectBaseArgs args)
{
var addictionTime = AddictionTime;
if (args is EntityEffectReagentArgs reagentArgs) {
if (args is EntityEffectReagentArgs reagentArgs)
{
addictionTime *= reagentArgs.Scale.Float();
}

View File

@ -0,0 +1,30 @@
using Content.Shared.DeltaV.Pain;
using Content.Shared.EntityEffects;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects;
public sealed partial class InPain : EntityEffect
{
/// <summary>
/// How long should each metabolism cycle make the effect last for.
/// </summary>
[DataField]
public float PainTime = 5f;
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-addicted", ("chance", Probability));
public override void Effect(EntityEffectBaseArgs args)
{
var painTime = PainTime;
if (args is EntityEffectReagentArgs reagentArgs)
{
painTime *= reagentArgs.Scale.Float();
}
var painSystem = args.EntityManager.System<SharedPainSystem>();
painSystem.TryApplyPain(args.TargetEntity, painTime);
}
}

View File

@ -0,0 +1,31 @@
using Content.Shared.DeltaV.Addictions;
using Content.Shared.EntityEffects;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects;
public sealed partial class SuppressAddiction : EntityEffect
{
/// <summary>
/// How long should the addiction suppression last for each metabolism cycle
/// </summary>
[DataField]
public float SuppressionTime = 30f;
protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-addiction-suppression",
("chance", Probability));
public override void Effect(EntityEffectBaseArgs args)
{
var suppressionTime = SuppressionTime;
if (args is EntityEffectReagentArgs reagentArgs)
{
suppressionTime *= reagentArgs.Scale.Float();
}
var addictionSystem = args.EntityManager.System<SharedAddictionSystem>();
addictionSystem.TrySuppressAddiction(args.TargetEntity, suppressionTime);
}
}

View File

@ -0,0 +1,38 @@
using Content.Shared.DeltaV.Pain;
using Content.Shared.EntityEffects;
using Robust.Shared.Prototypes;
namespace Content.Server.EntityEffects.Effects;
public sealed partial class SuppressPain : EntityEffect
{
/// <summary>
/// How long should the pain suppression last for each metabolism cycle
/// </summary>
[DataField]
public float SuppressionTime = 30f;
/// <summary>
/// The strength level of the pain suppression
/// </summary>
[DataField]
public PainSuppressionLevel SuppressionLevel = PainSuppressionLevel.Normal;
protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-pain-suppression",
("chance", Probability),
("level", SuppressionLevel.ToString().ToLowerInvariant()));
public override void Effect(EntityEffectBaseArgs args)
{
var suppressionTime = SuppressionTime;
if (args is EntityEffectReagentArgs reagentArgs)
{
suppressionTime *= reagentArgs.Scale.Float();
}
var painSystem = args.EntityManager.System<SharedPainSystem>();
painSystem.TrySuppressPain(args.TargetEntity, suppressionTime, SuppressionLevel);
}
}

View File

@ -0,0 +1,90 @@
using Content.Shared.DeltaV.Pain;
using Content.Shared.Popups;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server.DeltaV.Pain;
public sealed class PainSystem : SharedPainSystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PainComponent, MapInitEvent>(OnMapInit);
}
private void OnMapInit(Entity<PainComponent> ent, ref MapInitEvent args)
{
ent.Comp.NextUpdateTime = _timing.CurTime;
ent.Comp.NextPopupTime = _timing.CurTime;
}
protected override void UpdatePainSuppression(Entity<PainComponent> ent, float duration, PainSuppressionLevel level)
{
var curTime = _timing.CurTime;
var newEndTime = curTime + TimeSpan.FromSeconds(duration);
// Only update if this would extend the suppression
if (newEndTime <= ent.Comp.SuppressionEndTime)
return;
ent.Comp.LastPainkillerTime = curTime;
ent.Comp.SuppressionEndTime = newEndTime;
UpdateSuppressed(ent);
}
private void UpdateSuppressed(Entity<PainComponent> ent)
{
ent.Comp.Suppressed = (_timing.CurTime < ent.Comp.SuppressionEndTime);
Dirty(ent);
}
private void ShowPainPopup(Entity<PainComponent> ent)
{
if (!_prototype.TryIndex(ent.Comp.DatasetPrototype, out var dataset))
return;
var effects = dataset.Values;
if (effects.Count == 0)
return;
var effect = _random.Pick(effects);
_popup.PopupEntity(Loc.GetString(effect), ent.Owner);
// Set next popup time
var delay = _random.NextFloat(ent.Comp.MinimumPopupDelay, ent.Comp.MaximumPopupDelay);
ent.Comp.NextPopupTime = _timing.CurTime + TimeSpan.FromSeconds(delay);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
var curTime = _timing.CurTime;
var query = EntityQueryEnumerator<PainComponent>();
while (query.MoveNext(out var uid, out var component))
{
if (curTime < component.NextUpdateTime)
continue;
var ent = new Entity<PainComponent>(uid, component);
if (component.Suppressed)
{
UpdateSuppressed(ent);
}
else if (curTime >= component.NextPopupTime)
{
ShowPainPopup(ent);
}
component.NextUpdateTime = curTime + TimeSpan.FromSeconds(1);
}
}
}

View File

@ -5,12 +5,14 @@ using Content.Server.Power.EntitySystems; // Frontier
using Content.Shared.Interaction; // Frontier
using Content.Shared.Examine; // Frontier
using Content.Shared.Power; // Frontier
using Content.Server.Popups; // Frontier
using Robust.Shared.Map;
namespace Content.Server.Weapons.Ranged.Systems;
public sealed partial class GunSystem
{
[Dependency] public PopupSystem _popup = default!; // Frontier
public override void Update(float frameTime)
{
base.Update(frameTime);
@ -50,9 +52,6 @@ public sealed partial class GunSystem
// This code is licensed under AGPLv3. See AGPLv3.txt
private void OnGunExamine(EntityUid uid, AutoShootGunComponent component, ExaminedEvent args)
{
if (!HasComp<ApcPowerReceiverComponent>(uid))
return;
// Powered is already handled by other power components
var enabled = Loc.GetString(component.On ? "gun-comp-enabled" : "gun-comp-disabled");
@ -73,6 +72,7 @@ public sealed partial class GunSystem
DisableGun(uid, component);
args.Handled = true;
_popup.PopupEntity(Loc.GetString("auto-fire-disabled"), uid, args.User);
}
else if (CanEnable(uid, component))
{
@ -81,6 +81,11 @@ public sealed partial class GunSystem
EnableGun(uid, component);
args.Handled = true;
_popup.PopupEntity(Loc.GetString("auto-fire-enabled"), uid, args.User);
}
else
{
_popup.PopupEntity(Loc.GetString("auto-fire-enabled-no-power"), uid, args.User);
}
}

View File

@ -0,0 +1,122 @@
using Content.Server.Atmos.Components;
using Content.Shared._EE.FootPrint;
using Content.Shared.Inventory;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Components;
using Content.Shared._EE.FootPrint;
// using Content.Shared.Standing;
using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.EntitySystems;
using Robust.Shared.Map;
using Robust.Shared.Random;
namespace Content.Server._EE.FootPrint;
public sealed class FootPrintsSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly IMapManager _map = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solution = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
private EntityQuery<TransformComponent> _transformQuery;
private EntityQuery<MobThresholdsComponent> _mobThresholdQuery;
private EntityQuery<AppearanceComponent> _appearanceQuery;
// private EntityQuery<LayingDownComponent> _layingQuery;
public override void Initialize()
{
base.Initialize();
_transformQuery = GetEntityQuery<TransformComponent>();
_mobThresholdQuery = GetEntityQuery<MobThresholdsComponent>();
_appearanceQuery = GetEntityQuery<AppearanceComponent>();
// _layingQuery = GetEntityQuery<LayingDownComponent>();
SubscribeLocalEvent<FootPrintsComponent, ComponentStartup>(OnStartupComponent);
SubscribeLocalEvent<FootPrintsComponent, MoveEvent>(OnMove);
}
private void OnStartupComponent(EntityUid uid, FootPrintsComponent component, ComponentStartup args)
{
component.StepSize = Math.Max(0f, component.StepSize + _random.NextFloat(-0.05f, 0.05f));
}
private void OnMove(EntityUid uid, FootPrintsComponent component, ref MoveEvent args)
{
if (component.PrintsColor.A <= 0f
|| !_transformQuery.TryComp(uid, out var transform)
|| !_mobThresholdQuery.TryComp(uid, out var mobThreshHolds)
|| !_map.TryFindGridAt(_transform.GetMapCoordinates((uid, transform)), out var gridUid, out _))
return;
var dragging = mobThreshHolds.CurrentThresholdState is MobState.Critical or MobState.Dead;
var distance = (transform.LocalPosition - component.StepPos).Length();
var stepSize = dragging ? component.DragSize : component.StepSize;
if (!(distance > stepSize))
return;
component.RightStep = !component.RightStep;
var entity = Spawn(component.StepProtoId, CalcCoords(gridUid, component, transform, dragging));
var footPrintComponent = EnsureComp<FootPrintComponent>(entity);
footPrintComponent.PrintOwner = uid;
Dirty(entity, footPrintComponent);
if (_appearanceQuery.TryComp(entity, out var appearance))
{
_appearance.SetData(entity, FootPrintVisualState.State, PickState(uid, dragging), appearance);
_appearance.SetData(entity, FootPrintVisualState.Color, component.PrintsColor, appearance);
}
if (!_transformQuery.TryComp(entity, out var stepTransform))
return;
stepTransform.LocalRotation = dragging
? (transform.LocalPosition - component.StepPos).ToAngle() + Angle.FromDegrees(-90f)
: transform.LocalRotation + Angle.FromDegrees(180f);
component.PrintsColor = component.PrintsColor.WithAlpha(Math.Max(0f, component.PrintsColor.A - component.ColorReduceAlpha));
component.StepPos = transform.LocalPosition;
if (!TryComp<SolutionContainerManagerComponent>(entity, out var solutionContainer)
|| !_solution.ResolveSolution((entity, solutionContainer), footPrintComponent.SolutionName, ref footPrintComponent.Solution, out var solution)
|| string.IsNullOrWhiteSpace(component.ReagentToTransfer) || solution.Volume >= 1)
return;
_solution.TryAddReagent(footPrintComponent.Solution.Value, component.ReagentToTransfer, 1, out _);
}
private EntityCoordinates CalcCoords(EntityUid uid, FootPrintsComponent component, TransformComponent transform, bool state)
{
if (state)
return new EntityCoordinates(uid, transform.LocalPosition);
var offset = component.RightStep
? new Angle(Angle.FromDegrees(180f) + transform.LocalRotation).RotateVec(component.OffsetPrint)
: new Angle(transform.LocalRotation).RotateVec(component.OffsetPrint);
return new EntityCoordinates(uid, transform.LocalPosition + offset);
}
private FootPrintVisuals PickState(EntityUid uid, bool dragging)
{
var state = FootPrintVisuals.BareFootPrint;
if (_inventory.TryGetSlotEntity(uid, "shoes", out _))
state = FootPrintVisuals.ShoesPrint;
if (_inventory.TryGetSlotEntity(uid, "outerClothing", out var suit) && TryComp<PressureProtectionComponent>(suit, out _))
state = FootPrintVisuals.SuitPrint;
if (dragging)
state = FootPrintVisuals.Dragging;
return state;
}
}

View File

@ -0,0 +1,52 @@
using System.Linq;
using Content.Shared._EE.FootPrint;
using Content.Shared.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Fluids;
using Content.Shared.Fluids.Components;
using Robust.Shared.Physics.Events;
namespace Content.Server._EE.FootPrint;
public sealed class PuddleFootPrintsSystem : EntitySystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PuddleFootPrintsComponent, EndCollideEvent>(OnStepTrigger);
}
private void OnStepTrigger(EntityUid uid, PuddleFootPrintsComponent component, ref EndCollideEvent args)
{
if (!TryComp<AppearanceComponent>(uid, out var appearance)
|| !TryComp<PuddleComponent>(uid, out var puddle)
|| !TryComp<FootPrintsComponent>(args.OtherEntity, out var tripper)
|| !TryComp<SolutionContainerManagerComponent>(uid, out var solutionManager)
|| !_solutionContainer.ResolveSolution((uid, solutionManager), puddle.SolutionName, ref puddle.Solution, out var solutions))
return;
var totalSolutionQuantity = solutions.Contents.Sum(sol => (float) sol.Quantity);
var waterQuantity = (from sol in solutions.Contents where sol.Reagent.Prototype == "Water" select (float) sol.Quantity).FirstOrDefault();
if (waterQuantity / (totalSolutionQuantity / 100f) > component.OffPercent || solutions.Contents.Count <= 0)
return;
tripper.ReagentToTransfer =
solutions.Contents.Aggregate((l, r) => l.Quantity > r.Quantity ? l : r).Reagent.Prototype;
if (_appearance.TryGetData(uid, PuddleVisuals.SolutionColor, out var color, appearance)
&& _appearance.TryGetData(uid, PuddleVisuals.CurrentVolume, out var volume, appearance))
AddColor((Color) color, (float) volume * component.SizeRatio, tripper);
_solutionContainer.RemoveEachReagent(puddle.Solution.Value, 1);
}
private void AddColor(Color col, float quantity, FootPrintsComponent component)
{
component.PrintsColor = component.ColorQuantity == 0f ? col : Color.InterpolateBetween(component.PrintsColor, col, component.ColorInterpolationFactor);
component.ColorQuantity += quantity;
}
}

View File

@ -27,4 +27,17 @@ public abstract class SharedAddictionSystem : EntitySystem
_statusEffects.TryAddTime(uid, StatusEffectKey, TimeSpan.FromSeconds(addictionTime), status);
}
}
public virtual void TrySuppressAddiction(EntityUid uid, float duration)
{
if (!TryComp<AddictedComponent>(uid, out var comp))
return;
var ent = new Entity<AddictedComponent>(uid, comp);
UpdateAddictionSuppression(ent, duration);
}
protected virtual void UpdateAddictionSuppression(Entity<AddictedComponent> ent, float duration)
{
}
}

View File

@ -0,0 +1,69 @@
using Content.Shared.Dataset;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared.DeltaV.Pain;
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState, AutoGenerateComponentPause]
public sealed partial class PainComponent : Component
{
/// <summary>
/// Whether pain effects are currently suppressed by painkillers
/// </summary>
[DataField, AutoNetworkedField]
public bool Suppressed;
/// <summary>
/// The current level of pain suppression
/// </summary>
[DataField]
public PainSuppressionLevel CurrentSuppressionLevel = PainSuppressionLevel.Normal;
/// <summary>
/// The last time painkillers were administered
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
[AutoPausedField]
public TimeSpan LastPainkillerTime;
/// <summary>
/// When the pain suppression effect ends
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
[AutoPausedField]
public TimeSpan SuppressionEndTime;
/// <summary>
/// When to next update this component
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
[AutoPausedField]
public TimeSpan NextUpdateTime;
/// <summary>
/// When to show the next pain effect popup
/// </summary>
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
[AutoPausedField]
public TimeSpan NextPopupTime;
/// <summary>
/// The dataset of pain effect messages to display
/// </summary>
[DataField]
public ProtoId<LocalizedDatasetPrototype> DatasetPrototype = "PainEffects";
/// <summary>
/// Minimum time between pain popups in seconds
/// </summary>
[DataField]
public float MinimumPopupDelay = 1f;
/// <summary>
/// Maximum time between pain popups in seconds
/// </summary>
[DataField]
public float MaximumPopupDelay = 40f;
}

View File

@ -0,0 +1,44 @@
using Content.Shared.StatusEffect;
using Robust.Shared.Prototypes;
namespace Content.Shared.DeltaV.Pain;
public abstract class SharedPainSystem : EntitySystem
{
[Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
public ProtoId<StatusEffectPrototype> StatusEffectKey = "InPain";
protected abstract void UpdatePainSuppression(Entity<PainComponent> ent, float duration, PainSuppressionLevel level);
public virtual void TryApplyPain(EntityUid uid, float painTime, StatusEffectsComponent? status = null)
{
if (!Resolve(uid, ref status, false))
return;
if (!_statusEffects.HasStatusEffect(uid, StatusEffectKey, status))
{
_statusEffects.TryAddStatusEffect<PainComponent>(uid, StatusEffectKey, TimeSpan.FromSeconds(painTime), true, status);
}
else
{
_statusEffects.TryAddTime(uid, StatusEffectKey, TimeSpan.FromSeconds(painTime), status);
}
}
public virtual void TrySuppressPain(EntityUid uid, float duration, PainSuppressionLevel level = PainSuppressionLevel.Normal)
{
if (!TryComp<PainComponent>(uid, out var comp))
return;
UpdatePainSuppression((uid, comp), duration, level);
}
}
// Used by the StatusEffect
public enum PainSuppressionLevel : byte
{
Mild,
Normal,
Strong,
}

View File

@ -0,0 +1,23 @@
using Content.Shared.Chemistry.Components;
using Robust.Shared.GameStates;
namespace Content.Shared._EE.FootPrint;
/// <summary>
/// This is used for marking footsteps, handling footprint drawing.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class FootPrintComponent : Component
{
/// <summary>
/// Owner (with <see cref="FootPrintsComponent"/>) of a print (this component).
/// </summary>
[AutoNetworkedField]
public EntityUid PrintOwner;
[DataField]
public string SolutionName = "step";
[DataField]
public Entity<SolutionComponent>? Solution;
}

View File

@ -0,0 +1,25 @@
using Robust.Shared.Serialization;
namespace Content.Shared._EE.FootPrint;
[Serializable, NetSerializable]
public enum FootPrintVisuals : byte
{
BareFootPrint,
ShoesPrint,
SuitPrint,
Dragging
}
[Serializable, NetSerializable]
public enum FootPrintVisualState : byte
{
State,
Color
}
[Serializable, NetSerializable]
public enum FootPrintVisualLayers : byte
{
Print
}

View File

@ -0,0 +1,88 @@
using System.Numerics;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._EE.FootPrint;
[RegisterComponent]
public sealed partial class FootPrintsComponent : Component
{
[ViewVariables(VVAccess.ReadOnly), DataField]
public ResPath RsiPath = new("/Textures/_EE/Effects/footprints.rsi"); //DeltaV moved to its own space
// all of those are set as a layer
[ViewVariables(VVAccess.ReadOnly), DataField]
public string LeftBarePrint = "footprint-left-bare-human";
[ViewVariables(VVAccess.ReadOnly), DataField]
public string RightBarePrint = "footprint-right-bare-human";
[ViewVariables(VVAccess.ReadOnly), DataField]
public string ShoesPrint = "footprint-shoes";
[ViewVariables(VVAccess.ReadOnly), DataField]
public string SuitPrint = "footprint-suit";
[ViewVariables(VVAccess.ReadOnly), DataField]
public string[] DraggingPrint =
[
"dragging-1",
"dragging-2",
"dragging-3",
"dragging-4",
"dragging-5",
];
// yea, those
[ViewVariables(VVAccess.ReadOnly), DataField]
public EntProtoId<FootPrintComponent> StepProtoId = "Footstep";
[ViewVariables(VVAccess.ReadOnly), DataField]
public Color PrintsColor = Color.FromHex("#00000000");
/// <summary>
/// The size scaling factor for footprint steps. Must be positive.
/// </summary>
[DataField]
public float StepSize = 0.7f;
/// <summary>
/// The size scaling factor for drag marks. Must be positive.
/// </summary>
[DataField]
public float DragSize = 0.5f;
/// <summary>
/// The amount of color to transfer from the source (e.g., puddle) to the footprint.
/// </summary>
[DataField]
public float ColorQuantity;
/// <summary>
/// The factor by which the alpha channel is reduced in subsequent footprints.
/// </summary>
[DataField]
public float ColorReduceAlpha = 0.1f;
[DataField]
public string? ReagentToTransfer;
[DataField]
public Vector2 OffsetPrint = new(0.1f, 0f);
/// <summary>
/// Tracks which foot should make the next print. True for right foot, false for left.
/// </summary>
public bool RightStep = true;
/// <summary>
/// The position of the last footprint in world coordinates.
/// </summary>
public Vector2 StepPos = Vector2.Zero;
/// <summary>
/// Controls how quickly the footprint color transitions between steps.
/// Value between 0 and 1, where higher values mean faster color changes.
/// </summary>
public float ColorInterpolationFactor = 0.2f;
}

View File

@ -0,0 +1,11 @@
namespace Content.Shared._EE.FootPrint;
[RegisterComponent]
public sealed partial class PuddleFootPrintsComponent : Component
{
[ViewVariables()]
public float SizeRatio = 0.2f;
[ViewVariables()]
public float OffPercent = 80f;
}

View File

@ -21,6 +21,11 @@
copyright: "DOS=HIGH, UMB by MASTER BOOT RECORD may be used non-commercially in the Delta-V fork of SS14. Converted from FLAC to OGG, then converted to mono."
source: "https://masterbootrecord.bandcamp.com/album/c-edit-config-sys"
- files: ["deck_the_halls_b-MONO.ogg"]
license: "CC-BY-SA-4.0"
copyright: "Deck the Halls B Kevin MacLeod, mixed down to mono"
source: "https://incompetech.com/music/royalty-free/mp3-royaltyfree/Deck%20the%20Halls%20B.mp3"
- files: ["drozerix_-_alone.xm-MONO.ogg"]
license: "Custom"
copyright: "Alone by Drozerix, converted to mono"

Binary file not shown.

View File

@ -112,4 +112,9 @@
license: "CC0-1.0"
copyright: "Get It Done by A-Guy, converted from mp3 to OGG"
source: "https://github.com/A-Guy173/Music/blob/main/getitdone.mp3"
- files: ["Undefined_Theory.ogg"]
license: "CC0-1.0"
copyright: "Undefined Theory by A-Guy, converted to OGG"
source: "https://www.youtube.com/watch?v=FIOs2t84MKo"

View File

@ -1,49 +1,4 @@
Entries:
- author: Adrian16199
changes:
- message: Gives shoukou an oxygen miner until air actualy works.
type: Fix
id: 185
time: '2023-12-28T21:38:57.0000000+00:00'
- author: Master2112
changes:
- message: Crime Assist program to Security and Lawyer PDA's, to help identify a
crime with a simple yes/no question tree.
type: Add
id: 186
time: '2023-12-29T19:34:56.0000000+00:00'
- author: ps3moira
changes:
- message: Added Scottish Trait.
type: Add
- message: Added Kilt to Theatervend.
type: Add
id: 187
time: '2023-12-29T19:44:44.0000000+00:00'
- author: deltanedas
changes:
- message: Mail no longer has throwing damage.
type: Tweak
id: 188
time: '2023-12-29T19:53:10.0000000+00:00'
- author: Velcroboy
changes:
- message: Space winter is officially over!
type: Remove
id: 189
time: '2023-12-30T14:15:42.0000000+00:00'
- author: Master2112
changes:
- message: Fixed incorrect reference to ftl in crimeassist yaml
type: Fix
id: 190
time: '2023-12-30T22:03:53.0000000+00:00'
- author: Adrian16199
changes:
- message: Added a fluffy tail for the felinids.
type: Add
id: 191
time: '2023-12-30T22:05:52.0000000+00:00'
- author: DarkenedSynergy
changes:
- message: Fixed logistics airlocks looking like engineering airlocks when opened.
@ -3739,3 +3694,56 @@
id: 684
time: '2024-11-18T17:05:11.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2226
- author: Lyndomen, SleepyApril
changes:
- message: Normal kill targets now just need to be killed once- but it needs to
teach them a lesson that will be remembered
type: Tweak
id: 685
time: '2024-11-19T03:58:49.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2225
- author: Lyndomen
changes:
- message: Added holiday cheer
type: Add
id: 686
time: '2024-11-19T05:46:09.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2233
- author: Kr8art
changes:
- message: New mail-themed poster!
type: Add
id: 687
time: '2024-11-19T17:23:49.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2239
- author: MilonPL, dotCatshark
changes:
- message: Added self-refilling bluespace fire extinguishers! They can be unlocked
in the T2 industrial research!
type: Add
id: 688
time: '2024-11-19T20:57:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2171
- author: MilonPL
changes:
- message: Added Chronic pain and Addicted traits.
type: Add
- message: Reworked the addictions system.
type: Tweak
id: 689
time: '2024-11-20T00:59:17.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2192
- author: Lyndomen
changes:
- message: Ported footprints and bloodstains from EE. Sorry Janitors.
type: Add
id: 690
time: '2024-11-20T01:00:15.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2186
- author: therealDLondon
changes:
- message: 'New Lobby Track: "Undefined Theory" by A-Guy'
type: Add
id: 691
time: '2024-11-20T01:10:00.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/2234

View File

@ -1,47 +1,56 @@
### Messages to be used with RP-based medication.
reagent-effect-antidepressant-mild1 = You feel like things aren't so bad.
reagent-effect-antidepressant-mild2 = The world seems a bit brighter.
# Mild antidepressants
reagent-effect-antidepressant-mild1 = You feel like things aren't so bad.
reagent-effect-antidepressant-mild2 = The world seems a bit brighter.
reagent-effect-antidepressant-mild3 = You feel a bit better about yourself.
reagent-effect-antidepressant-mild4 = You feel slightly motivated.
reagent-effect-antidepressant-normal1 = You feel pretty alright.
reagent-effect-antidepressant-normal2 = You find it hard to focus.
# Normal antidepressants
reagent-effect-antidepressant-normal1 = You feel pretty alright.
reagent-effect-antidepressant-normal2 = You find it hard to focus.
reagent-effect-antidepressant-normal3 = You feel purposeful.
reagent-effect-antidepressant-normal4 = You feel motivated.
reagent-effect-antidepressant-normaloverdose1 = You feel irrationally angry.
# Normal antidepresants OD
reagent-effect-antidepressant-normaloverdose1 = You feel irrationally angry.
reagent-effect-antidepressant-normaloverdose2 = Everyone is out to get you!
reagent-effect-antidepressant-strong1 = You feel a sense of great joy deep down.
# Strong antidepressants
reagent-effect-antidepressant-strong1 = You feel a sense of great joy deep down.
reagent-effect-antidepressant-strong2 = You space out for a moment.
reagent-effect-antidepressant-strong3 = You feel good about yourself.
reagent-effect-antidepressant-strong4 = You feel a sense of great purpose.
reagent-effect-antidepressant-strongoverdose1 = You're gonna die! YOU'RE GONNA DIE!
reagent-effect-antidepressant-strongoverdose2 = Run! RUN! HIDE!
# Strong antidepressants OD
reagent-effect-antidepressant-strongoverdose1 = You're gonna die! YOU'RE GONNA DIE!
reagent-effect-antidepressant-strongoverdose2 = Run! RUN! HIDE!
reagent-effect-antidepressant-strongoverdose3 = They're after you. THEY'LL KILL YOU.
reagent-effect-antidepressant-strongoverdose4 = They're all plotting against you.
reagent-effect-antidepressant-strongoverdose5 = Watch your back, BEHIND YOU!
reagent-effect-antidepressant-strongoverdose5 = Watch your back, BEHIND YOU!
reagent-effect-antidepressant-strongoverdose6 = You won't last the shift.
reagent-effect-antidepressant-strongoverdose7 = Shut up. SHUT UP. SHUT UP!
reagent-effect-antidepressant-strongoverdose8 = Get away. GET AWAY! IT'S GONNA EXPLODE!
reagent-effect-antidepressant-strongoverdose9 = They're all liars. LIARS!
# Antidepressant fading
reagent-effect-antidepressant-fade = The antidepressant effects start to fade...
# Mild anxiety meds
reagent-effect-anxietymed-mild1 = You feel a bit calmer.
reagent-effect-anxietymed-mild2 = You feel a little tired.
reagent-effect-anxietymed-mild3 = You feel slightly relaxed.
reagent-effect-anxietymed-mild4 = You feel like it might just be okay.
reagent-effect-anxietymed-mild5 = The road ahead doesn't seem so bad.
# Normal anxiety meds
reagent-effect-anxietymed-normal1 = You feel somewhat relaxed
reagent-effect-anxietymed-normal2 = You feel drowsy for a moment.
reagent-effect-anxietymed-normal3 = You feel calm.
reagent-effect-anxietymed-normal4 = You feel more confident.
reagent-effect-anxietymed-normal5 = Your worries seem to drift away.
# Normal anxiety meds OD
reagent-effect-anxietymed-normaloverdose1 = You feel very sleepy.
reagent-effect-anxietymed-normaloverdose2 = You feel like resting your eyes for just a moment.
reagent-effect-anxietymed-normaloverdose3 = You feel like lying down and napping.
@ -49,6 +58,7 @@ reagent-effect-anxietymed-normaloverdose4 = Your eyes feel heavy.
reagent-effect-anxietymed-normaloverdose5 = You lose your train of thought.
reagent-effect-anxietymed-normaloverdose6 = You forget what you were doing.
# Strong anxiety meds
reagent-effect-anxietymed-strong1 = You feel free of worry.
reagent-effect-anxietymed-strong2 = Your mind goes numb for a moment.
reagent-effect-anxietymed-strong3 = It seems like everything is just fine.
@ -57,8 +67,10 @@ reagent-effect-anxietymed-strong5 = You feel very relaxed.
reagent-effect-anxietymed-strong6 = You feel quite calm.
reagent-effect-anxietymed-strong7 = You feel like you can take on the world!
# Anxiety meds fade
reagent-effect-anxietymed-fade = The calming effects start to fade...
# Addiction popups
reagent-effect-medaddiction-1 = You're yearning for another high.
reagent-effect-medaddiction-2 = You really need some more drugs.
reagent-effect-medaddiction-3 = You feel empty. Find another fix.
@ -68,17 +80,19 @@ reagent-effect-medaddiction-6 = You can feel your hands shaking.
reagent-effect-medaddiction-7 = You could use another hit right now
reagent-effect-medaddiction-8 = One more fix couldn't hurt, right?
# Mild painkillers
reagent-effect-painkiller-mild1 = Your body hurts a bit less.
reagent-effect-painkiller-mild2 = You feel a little bit dizzy.
reagent-effect-painkiller-mild3 = You feel a tiny bit numb.
reagent-effect-painkiller-mild4 = Any pain you had has faded slightly.
# Normal painkillers
reagent-effect-painkiller-normal1 = Any pain you had has faded significantly.
reagent-effect-painkiller-normal2 = You feel dizzy.
reagent-effect-painkiller-normal3 = Your entire body goes numb briefly.
reagent-effect-painkiller-normal4 = You feel your pain fade somewhat.
# Strong painkillers
reagent-effect-painkiller-strong1 = You forgot what pain feels like.
reagent-effect-painkiller-strong2 = You can't see straight.
reagent-effect-painkiller-strong3 = You feel a sense of deep nostalgia.
@ -86,4 +100,11 @@ reagent-effect-painkiller-strong4 = Your entire body feels numb.
reagent-effect-painkiller-strong5 = You hardly feel anything at all.
reagent-effect-painkiller-strong6 = Any pain you were feeling is gone.
reagent-effect-painkiller-fade = The painkiller's effects start to fade...
# Painkiller fade
reagent-effect-painkiller-fade = The painkiller's effects start to fade...
# Pain effects
pain-effect1 = A dull ache pulses through your body.
pain-effect2 = Sharp stabs of pain make you wince.
pain-effect3 = You feel an intense, throbbing pain that clouds your thoughts.
pain-effect4 = Waves of agonizing pain make it hard to focus on anything else.

View File

@ -1,2 +1,6 @@
gun-comp-enabled = The gun is turned [color=green]on[/color].
gun-comp-disabled = The gun is turned [color=red]off[/color].
auto-fire-enabled = Gun turned on.
auto-fire-disabled = Gun turned off.
auto-fire-enabled-no-power = Gun turned on; but it has no power!

View File

@ -2,4 +2,16 @@ reagent-effect-guidebook-addicted =
{ $chance ->
[1] Causes
*[other] cause
} an addiction.
} an addiction
reagent-effect-guidebook-addiction-suppression =
{ $chance ->
[1] Suppresses
*[other] suppress
} active addictions
reagent-effect-guidebook-pain-suppression =
{ $chance ->
[1] Suppresses
*[other] suppress
} pain at { $level } strength

View File

@ -32,3 +32,21 @@ book-text-fishops = FISHOPS ADVANCED USER MANUAL FIRST EDITION
CHAPTER 6: Fish War
In the event of fish war there will be double the fish, more than could possibly be carried. A reinforcement or two will be required to carry the surplus fish. A fish war has never happened in recorded history, so it is currently purely theoretical. Its destructive power would rival several neutronium bombs.
book-text-vulpkanin = Vulpkanin for Dummies, an Exhaustive Guide
So, you're new to the sector and keep seeing these fine folks running around?
Those are Vulpkanin, basically space foxes (or wolves, depending who you ask)!
We've accumulated some quick tips you might use when engaging with these fluff balls.
No Chocolate! Seriously, it's like poison to them. Stick to burgers and fries.
Watch the Tail: A wagging tail usually means they're happy. A puffed-up tail? Back away slowly...
They Come in All Colors: From fiery reds to snowy whites, every Vulpkanin is unique!
Learn their Language: While most Vulpkanin speak common, knowing a few phrases in their native tongue can go a long way in building rapport.
How to Kiss: Kiss
Don't Underestimate Them: Vulpkanin may look cute and cuddly, but they can be fierce fighters when provoked. Treat them with respect and avoid unnecessary conflict.

View File

@ -26,3 +26,9 @@ trait-hushed-desc = You are unable to speak louder than a whisper.
trait-uncloneable-name = Uncloneable
trait-uncloneable-desc = Cannot be cloned
trait-inpain-name = Chronic pain
trait-inpain-desc = Youre constantly in discomfort. You need painkillers to function.
trait-addicted-name = Addicted
trait-addicted-desc = You crave the substance, and your thoughts keep drifting back to it. Without it, you feel incomplete, anxious, and on edge.

View File

@ -25,6 +25,12 @@
path:
path: /Audio/DeltaV/Jukebox/DOS=HIGH,_UMB.ogg
- type: jukebox
id: DeckTheHalls
name: Deck The Halls - Kevin Macleod
path:
path: /Audio/DeltaV/Jukebox/deck_the_halls_b-MONO.ogg
- type: jukebox
id: DrozAlone
name: Drozerix - Alone

View File

@ -0,0 +1,5 @@
- type: localizedDataset
id: PainEffects
values:
prefix: pain-effect
count: 4

View File

@ -140,6 +140,9 @@
- CanPilot
- FootstepSound
- DoorBumpOpener
- type: FootPrints #DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-lizard" #DeltaV port from EE, blood splatter
rightBarePrint: "footprint-right-bare-lizard" #DeltaV port from EE, blood splatter
- type: entity
save: false

View File

@ -20,3 +20,26 @@
color: "#2c5491"
- type: Paper
content: book-text-fishops
- type: entity
parent: BookBase
id: BookVulpFAQ
name: Vulpkanin 101
suffix: library salvage
description: You seriously didn't purchase a "For Dummies" book in 2425?
components:
- type: Sprite
sprite: Objects/Misc/books.rsi
layers:
- state: paper
- state: cover_strong
color: "#c836aa"
- state: decor_spine
color: "#961cc8"
- state: detail_bookmark
color: "#eee039"
- state: icon_question
- state: detail_bookmark
color: "#2c5491"
- type: Paper
content: book-text-vulpkanin

View File

@ -0,0 +1,32 @@
- type: entity
name: bluespace fire extinguisher
parent: FireExtinguisher
id: FireExtinguisherBluespace
description: An experimental fire extinguisher that uses bluespace technology to gradually refill itself. The faint blue glow is only slightly disconcerting.
components:
- type: Sprite
sprite: DeltaV/Objects/Misc/fire_extinguisher_bluespace.rsi
layers:
- state: fire_extinguisher_closed
map: [ "enum.ToggleVisuals.Layer" ]
- type: Item
sprite: DeltaV/Objects/Misc/fire_extinguisher_bluespace.rsi
size: Normal
- type: SolutionContainerManager
solutions:
spray:
maxVol: 200
reagents:
- ReagentId: Water
Quantity: 200
- type: PhysicalComposition
materialComposition:
Steel: 80
Bluespace: 20
- type: SolutionRegeneration
solution: spray
generated:
reagents:
- ReagentId: Water
Quantity: 10
duration: 10

View File

@ -17,3 +17,13 @@
- type: Sprite
sprite: DeltaV/Structures/Wallmounts/Posters/misc.rsi
state: woodygotwood
- type: entity
parent: PosterBase
id: PosterLegitMail
name: "Only You Can Prevent Expired Mail"
description: "A propaganda poster that subtly encourages crew to open their mail. Brought to you by the Ministries Aiding Interstellar Logistics (M.A.I.L.)"
components:
- type: Sprite
sprite: DeltaV/Structures/Wallmounts/Posters/mailposter.rsi
state: mailposter

View File

@ -0,0 +1,10 @@
- type: latheRecipe
parent: BaseToolRecipe
id: FireExtinguisherBluespace
result: FireExtinguisherBluespace
completetime: 6
materials:
Steel: 1000
Silver: 250
Plasma: 500
Bluespace: 200

View File

@ -0,0 +1,4 @@
- type: shader
id: ChromaticAberration
kind: source
path: "/Textures/DeltaV/Shaders/chromatic_aberration.swsl"

View File

@ -5,3 +5,19 @@
category: Disabilities
components:
- type: Uncloneable
- type: trait
id: Addicted
name: trait-addicted-name
description: trait-addicted-desc
category: Disabilities
components:
- type: Addicted
- type: trait
id: InPain
name: trait-inpain-name
description: trait-inpain-desc
category: Disabilities
components:
- type: Pain

View File

@ -1,2 +1,11 @@
- type: statusEffect
id: Addicted
- type: statusEffect
id: SuppressAddiction
- type: statusEffect
id: InPain
- type: statusEffect
id: SuppressPain

View File

@ -165,3 +165,47 @@
- type: Tag
tags:
- DNASolutionScannable
- type: PuddleFootPrints # DeltaV- Begin updates from EE Blood Puddle
- type: entity
name: footstep
id: Footstep
save: false
description: Trace of liquid
components:
- type: Clickable
- type: FootstepModifier
footstepSoundCollection:
collection: FootstepWater
params:
volume: 3
- type: Transform
noRot: false
- type: Sprite
drawdepth: FloorObjects
color: "#FFFFFF80"
- type: Physics
bodyType: Static
- type: Fixtures
fixtures:
slipFixture:
shape:
!type:PhysShapeAabb
bounds: "-0.4,-0.4,0.4,0.4"
mask:
- ItemMask
layer:
- SlipLayer
hard: false
- type: SolutionContainerManager
solutions:
step: { maxVol: 2 }
- type: FootPrint
- type: Puddle
solution: step
- type: Appearance
- type: SpawnOnDespawn
prototype: PuddleSparkle
- type: TimedDespawn
lifetime: 60 # DeltaV End updates from EE Blood Puddle

View File

@ -175,4 +175,5 @@
- PosterLegitShoukou # Nyanotrasen Poster, see Resources/Prototypes/Nyanotrasen/Entities/Structures/Wallmount/Signs/posters.yml
- PosterLegitCornzza # Nyanotrasen Poster, see Resources/Prototypes/Nyanotrasen/Entities/Structures/Wallmount/Signs/posters.yml
- PosterLegitFuckAround # DeltaV Poster, see Resources/Prototypes/DeltaV/Entities/Structures/Wallmount/Signs/posters.yml
- PosterLegitMail # DeltaV Poster, see Resources/Prototypes/DeltaV/Entities/Structures/Wallmount/Signs/posters.yml
chance: 1

View File

@ -115,6 +115,9 @@
sprite: "Effects/creampie.rsi"
state: "creampie_arachnid"
visible: false
- type: FootPrints # DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-spider"
rightBarePrint: "footprint-right-bare-spider"
- type: Inventory
templateId: arachnid

View File

@ -139,6 +139,9 @@
- PsionicsDisabled #Nyano - Summary: PCs can have psionics disabled.
- PsionicallyInsulated #Nyano - Summary: PCs can be made insulated from psionic powers.
- Addicted # DeltaV - Psych med addictions system
- SuppressAddiction # DeltaV - Psych med addictions system
- InPain # DeltaV - Pain system
- SuppressPain # DeltaV - Pain system
- type: Body
prototype: Human
requiredLegs: 2
@ -216,6 +219,7 @@
- DoorBumpOpener
- AnomalyHost
- type: PotentialPsionic # DeltaV - organic species can all be psionic
- type: FootPrints # DeltaV port from EE, blood splatter
- type: entity
save: false

View File

@ -110,6 +110,9 @@
32:
sprite: Mobs/Species/Human/displacement.rsi
state: jumpsuit-female
- type: FootPrints # DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-diona"
rightBarePrint: "footprint-right-bare-diona"
- type: entity
parent: BaseSpeciesDummy

View File

@ -64,6 +64,9 @@
32:
sprite: Mobs/Species/Human/displacement.rsi
state: jumpsuit-female
- type: FootPrints # DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-dwarf"
rightBarePrint: "footprint-right-bare-dwarf"
- type: entity
parent: BaseSpeciesDummy

View File

@ -40,4 +40,4 @@
sizeMaps:
32:
sprite: Mobs/Species/Human/displacement.rsi
state: jumpsuit-female
state: jumpsuit-female

View File

@ -77,7 +77,9 @@
32:
sprite: Mobs/Species/Human/displacement.rsi
state: jumpsuit-female
- type: FootPrints # DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-lizard"
rightBarePrint: "footprint-right-bare-lizard"
- type: entity
parent: BaseSpeciesDummy

View File

@ -120,6 +120,9 @@
32:
sprite: Mobs/Species/Human/displacement.rsi
state: jumpsuit-female
- type: FootPrints # DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-slime"
rightBarePrint: "footprint-right-bare-slime"
- type: entity
parent: MobHumanDummy

View File

@ -130,6 +130,9 @@
32:
sprite: Mobs/Species/Vox/displacement.rsi
state: shoes
- type: FootPrints # DeltaV port from EE, blood splatter
leftBarePrint: "footprint-left-bare-lizard"
rightBarePrint: "footprint-right-bare-lizard"
- type: entity
parent: BaseSpeciesDummy

View File

@ -372,6 +372,7 @@
- Fulton
- FultonBeacon
- PowerCellHyper
- FireExtinguisherBluespace
# End DeltaV additions
- type: EmagLatheRecipes
emagDynamicRecipes:

View File

@ -48,16 +48,12 @@
key: Drowsiness
time: 10
type: Remove
- !type:AdjustReagent # Delta-V - Addictive
- !type:Addicted # Delta-V - Addictive
probability: 0.6 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 20 # maximum addiction severity for this reagent
- !type:ReagentThreshold
min: 0.25
reagent: Addictine
amount: 0.2
- !type:SuppressAddiction
Medicine:
effects:
- !type:ResetNarcolepsy
@ -214,16 +210,12 @@
type: Add
time: 16
refresh: false
- !type:AdjustReagent # Delta-V - Addictive
- !type:Addicted # Delta-V - Addictive
probability: 0.4 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 20 # maximum addiction severity for this reagent
- !type:ReagentThreshold
min: 0.25
reagent: Addictine
amount: 0.2
- !type:SuppressAddiction
- type: reagent
id: Nicotine
@ -266,16 +258,12 @@
probability: 0.05
- !type:Drunk # Headaches and slurring are major symptoms of brain damage, this is close enough
boozePower: 5
- !type:AdjustReagent # Delta-V - Addictive
- !type:Addicted # Delta-V - Addictive
probability: 0.4 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 20 # maximum addiction severity for this reagent
- !type:ReagentThreshold
min: 0.25
reagent: Addictine
amount: 0.2
- !type:SuppressAddiction
- type: reagent
id: SpaceDrugs
@ -294,21 +282,17 @@
type: Add
time: 5
refresh: false
- !type:ChemRerollPsionic #Nyano - Summary: lets the imbiber become psionic.
- !type:ChemRerollPsionic #Nyano - Summary: lets the imbiber become psionic.
conditions:
- !type:ReagentThreshold
reagent: SpaceDrugs
min: 15
- !type:AdjustReagent # Delta-V - Addictive
- !type:Addicted # Delta-V - Addictive
probability: 0.4 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 10 # maximum addiction severity for this reagent
- !type:ReagentThreshold
min: 0.25
reagent: Addictine
amount: 0.1
- !type:SuppressAddiction
- type: reagent
id: Bananadine

View File

@ -150,6 +150,7 @@
- HellfireFreezerMachineCircuitBoard
- PortableScrubberMachineCircuitBoard
- HolofanProjector
- FireExtinguisherBluespace # DeltaV
technologyPrerequisites:
- AtmosphericTech

View File

@ -24,4 +24,5 @@
- /Audio/Lobby/Black_Heat.ogg
- /Audio/Lobby/thestation.ogg
- /Audio/Lobby/Get_It_Done.ogg
- /Audio/Lobby/Undefined_Theory.ogg

View File

@ -118,6 +118,7 @@
Medicine:
metabolismRate : 0.01
effects:
- !type:SuppressAddiction
- !type:PopupMessage
type: Local
visualType: Large
@ -191,17 +192,12 @@
min: 10
reagent: Neurozenium
amount: -7.5
- !type:AdjustReagent
- !type:Addicted
probability: 0.5 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 10 # maximum addiction severity for this reagent
- !type:ReagentThreshold
reagent: Blissifylovene
min: 1.5
reagent: Addictine
amount: 0.1
- !type:HealthChange
conditions:
- !type:ReagentThreshold
@ -450,112 +446,6 @@
- !type:ReagentThreshold
max: 0.1
- type: reagent
id: Addictine
name: reagent-name-addictine
group: Toxins
desc: reagent-desc-addictine
flavor: savory
color: "#d9d9d9"
physicalDesc: reagent-physical-desc-refreshing
metabolisms:
Poison:
metabolismRate : 0.01
effects:
- !type:PopupMessage
type: Local
visualType: LargeCaution
messages:
- "reagent-effect-medaddiction-1"
- "reagent-effect-medaddiction-2"
- "reagent-effect-medaddiction-3"
- "reagent-effect-medaddiction-4"
- "reagent-effect-medaddiction-5"
- "reagent-effect-medaddiction-6"
- "reagent-effect-medaddiction-7"
- "reagent-effect-medaddiction-8"
probability: 0.08
conditions:
- !type:ReagentThreshold # the following three chemicals are addictive, and thus will counteract cravings.
reagent: Blissifylovene
max: 0.01
- !type:ReagentThreshold
reagent: Soretizone
max: 0.01
- !type:ReagentThreshold
reagent: Agonolexyne
max: 0.01
- !type:ReagentThreshold # Delta-V - Following four are also addictive
reagent: SpaceDrugs
max: 0.01
- !type:ReagentThreshold
reagent: THC
max: 0.01
- !type:ReagentThreshold
reagent: Impedrezene
max: 0.01
- !type:ReagentThreshold
reagent: Desoxyephedrine
max: 0.01
- !type:AdjustReagent
reagent: Charcoal # purges bloodstream cleaners
amount: -10.0
- !type:AdjustReagent
reagent: Ipecac # purges bloodstream cleaners
amount: -10.0
- !type:MovespeedModifier
walkSpeedModifier: 0.9 # Delta-V : Changes walk-speed modifier from 0.95 to 0.9
sprintSpeedModifier: 0.7
conditions:
- !type:ReagentThreshold
max: 1.0 # it gets worse before the addiction ends.
- !type:ReagentThreshold # the following three chemicals are addictive, and thus will counteract cravings.
reagent: Blissifylovene
max: 0.01
- !type:ReagentThreshold
reagent: Soretizone
max: 0.01
- !type:ReagentThreshold
reagent: Agonolexyne
max: 0.01
- !type:ReagentThreshold # Delta-V - Following four are also addictive
reagent: SpaceDrugs
max: 0.01
- !type:ReagentThreshold
reagent: THC
max: 0.01
- !type:ReagentThreshold
reagent: Impedrezene
max: 0.01
- !type:ReagentThreshold
reagent: Desoxyephedrine
max: 0.01
- !type:GenericStatusEffect # Delta-V - Makes you stutter
key: Stutter
component: StutteringAccent
conditions:
- !type:ReagentThreshold
reagent: Blissifylovene
max: 0.01
- !type:ReagentThreshold
reagent: Soretizone
max: 0.01
- !type:ReagentThreshold
reagent: Agonolexyne
max: 0.01
- !type:ReagentThreshold
reagent: SpaceDrugs
max: 0.01
- !type:ReagentThreshold
reagent: THC
max: 0.01
- !type:ReagentThreshold
reagent: Impedrezene
max: 0.01
- !type:ReagentThreshold
reagent: Desoxyephedrine
max: 0.01
- type: reagent
id: Stubantazine
name: reagent-name-stubantazine
@ -568,6 +458,8 @@
Medicine:
metabolismRate : 0.02
effects:
- !type:SuppressPain
suppressionLevel: Mild
- !type:PopupMessage
type: Local
visualType: Medium
@ -621,6 +513,9 @@
Medicine:
metabolismRate : 0.01
effects:
- !type:SuppressPain
suppressionLevel: Normal
- !type:SuppressAddiction
- !type:PopupMessage
type: Local
visualType: Large
@ -656,16 +551,11 @@
min: 20
reagent: Soretizone
amount: 0.03
- !type:AdjustReagent
probability: 0.55 # Chance of Addiction rising per tick
- !type:Addicted
probability: 0.7 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 5 # maximum addiction severity for this reagent
- !type:ReagentThreshold
min: 9
reagent: Addictine # add
amount: 0.1
- !type:PopupMessage
type: Local
visualType: Medium # stronger painkiller = more noticable fading
@ -688,6 +578,9 @@
Medicine:
metabolismRate : 0.01
effects:
- !type:SuppressPain
suppressionLevel: Strong
- !type:SuppressAddiction
- !type:PopupMessage
type: Local
visualType: Large
@ -726,16 +619,11 @@
min: 1
reagent: Agonolexyne
amount: 0.04
- !type:AdjustReagent
- !type:Addicted
probability: 0.8 # Chance of Addiction rising per tick
conditions:
- !type:ReagentThreshold
reagent: Addictine
max: 25 # maximum addiction severity for this reagent
- !type:ReagentThreshold
min: 0.25
reagent: Addictine
amount: 0.2
- !type:Drunk # OD causes drunkeness
conditions:
- !type:ReagentThreshold

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

View File

@ -0,0 +1,37 @@
{
"version": 1,
"license": "CC-BY-SA-4.0",
"copyright": "Made by .catshark (Discord) based on the fire extinguisher sprite",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "fire_extinguisher_open",
"delays": [
[
0.1,
0.1
]
]
},
{
"name": "fire_extinguisher_closed",
"delays": [
[
0.1,
0.1
]
]
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
}
]
}

View File

@ -0,0 +1,32 @@
uniform sampler2D SCREEN_TEXTURE;
void fragment() {
highp vec2 coord = FRAGCOORD.xy * SCREEN_PIXEL_SIZE.xy;
highp float time = TIME * 0.3;
const highp float distortAmount = 0.003;
highp vec2 waveOffset = vec2(
distortAmount * (
sin(time * 0.5 + coord.y * 4.0) + // Primary wave
sin(time * 0.7 + coord.y * 8.0) * 0.5 + // Secondary faster wave
sin(time * 0.2 + coord.x * 3.0) * 0.8 // Slower cross wave
),
distortAmount * (
cos(time * 0.5 + coord.x * 4.0) + // Primary wave
cos(time * 0.7 + coord.x * 8.0) * 0.5 + // Secondary faster wave
cos(time * 0.2 + coord.y * 3.0) * 0.8 // Slower cross wave
)
);
highp vec4 redChannel = zTextureSpec(SCREEN_TEXTURE, coord + waveOffset * 1.5 + vec2(-distortAmount * 2.0, distortAmount));
highp vec4 greenChannel = zTextureSpec(SCREEN_TEXTURE, coord + waveOffset);
highp vec4 blueChannel = zTextureSpec(SCREEN_TEXTURE, coord + waveOffset * 1.2 + vec2(distortAmount * 2.0, -distortAmount));
COLOR = vec4(
redChannel.r,
greenChannel.g,
blueChannel.b,
(redChannel.a + greenChannel.a + blueChannel.a) / 3.0
);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Original work by Kr8",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "mailposter"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

View File

@ -0,0 +1,71 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "IMPERIAL SPACE",
"states": [
{
"name": "footprint-left-bare-diona"
},
{
"name": "footprint-left-bare-dwarf"
},
{
"name": "footprint-left-bare-human"
},
{
"name": "footprint-left-bare-lizard"
},
{
"name": "footprint-left-bare-slime"
},
{
"name": "footprint-left-bare-spider"
},
{
"name": "footprint-right-bare-diona"
},
{
"name": "footprint-right-bare-dwarf"
},
{
"name": "footprint-right-bare-human"
},
{
"name": "footprint-right-bare-lizard"
},
{
"name": "footprint-right-bare-slime"
},
{
"name": "footprint-right-bare-spider"
},
{
"name": "footprint-shoes"
},
{
"name": "footprint-suit"
},
{
"name": "dragging-1"
},
{
"name": "dragging-2"
},
{
"name": "dragging-3"
},
{
"name": "dragging-4"
},
{
"name": "dragging-5"
},
{
"name": "dragging-test"
}
]
}