Skip to content

Commit

Permalink
Mass Contests Affect Camera Shake (#560)
Browse files Browse the repository at this point in the history
# Description

I made this entirely on a whim to prove a point in the middle of a
conversation. I have not tested this code, but I'm confident that it
will work as advertised.

This refactors the public KickCamera function so that it no longer:
Divides by 1, divides by 1 again, multiplies by 1, normalizes a
vector(turning its A value to 1), and then divides said vector by 1
again for good measure.

Instead 1 has been replaced by MassContest, wooh! I also got rid of
redundant steps. The effect of this is that characters with greater than
human-standard mass are slightly more resistant to all sources of camera
shake(Explosions, gravity generator turning off, gunfire, being hit by
flying objects, etc), while characters with less than standard human
mass experience a greater amount of camera shake.

You're welcome. Now go find a Felinid to shake vigorously. 

# Changelog


:cl:
- add: Camera Shake is now affected by character mass. Small characters
experience more camera shake. Large characters experience less.
  • Loading branch information
VMSolidus committed Jul 21, 2024
1 parent f25fc1e commit 25056a9
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions Content.Client/Camera/CameraRecoilSystem.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
using System.Numerics;
using Content.Shared.Camera;
using Content.Shared.CCVar;
using Content.Shared.Contests;
using Robust.Shared.Configuration;

namespace Content.Client.Camera;

public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
{
[Dependency] private readonly IConfigurationManager _configManager = default!;
[Dependency] private readonly ContestsSystem _contests = default!;

private float _intensity;

Expand Down Expand Up @@ -37,15 +39,15 @@ public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilCompo
if (!Resolve(uid, ref component, false))
return;

recoil *= _intensity;
var massRatio = _contests.MassContest(uid);
var maxRecoil = KickMagnitudeMax / massRatio;
recoil *= _intensity / massRatio;

// Use really bad math to "dampen" kicks when we're already kicked.
var existing = component.CurrentKick.Length();
var dampen = existing / KickMagnitudeMax;
component.CurrentKick += recoil * (1 - dampen);
component.CurrentKick += recoil * (1 - existing);

if (component.CurrentKick.Length() > KickMagnitudeMax)
component.CurrentKick = component.CurrentKick.Normalized() * KickMagnitudeMax;
if (component.CurrentKick.Length() > maxRecoil)
component.CurrentKick = component.CurrentKick.Normalized() * maxRecoil;

component.LastKickTime = 0;
}
Expand Down

0 comments on commit 25056a9

Please sign in to comment.