Skip to content

Commit

Permalink
NyanoCombat 2, Part 3: Physical Traits (#607)
Browse files Browse the repository at this point in the history
# Description

Done in partnership with @OldDanceJacket 

This PR adds 9 additional physical traits to the game, 5 positive, and 4
negative. While this PR is intended to go with NyanoCombat 2, Part 1 and
2, I have made this PR function completely standalone. It does not
require either of the two other PRs.

## Positive Traits
- **Will To Live**: Increases your Dead threshold by 10
- **Tenacity**: Increases your Crit threshold by 5
- **Vigor**: Increases your maximum Stamina by 10
- **High Adrenaline**: You gain up to 10% more damage with all melee
attacks when injured.
- **Masochism**: You ignore the first 10% of stamina damage penalties to
melee attacks. If NyanoCombat 2 Part 1 isn't merged yet, this makes you
deal up to 10% more melee damage when you receive stamina damage.
- **Martial Artist**: Your unarmed melee attacks have bonus range, and
deal 50% more damage(for every species in the game, this means 7.5
instead of 5 damage). This trait is identical to one that the Boxer job
receives for free, thus it cannot be taken by Boxers.

## Negative Traits
- **Will To Die**: Decreases your Dead threshold by 15
- **Glass Jaw**: Decreases your Crit Threshold by 10
- **Lethargy**: Decreases your maximum Stamina by 15
- **Adrenal Dysfunction**: Your melee attacks are penalized by up to 20%
when injured. If NyanoCombat 2 Part 1 is merged, this cancels out the
natural bonus everyone globally gets to melee when injured.
- **Low Pain Tolerance**: Your melee attacks are penalized by up to 15%
when receiving stamina damage. If NyanoCombat 2 Part 1 is merged, this
stacks with the natural penalties everyone globally gets to melee when
taking stamina damage.


# TODO

- [ ] Let ODJ look over these for balance.

# Media


![image](https://github.com/user-attachments/assets/242e8b50-8a5e-4079-bf1d-f952ceeade38)

# Changelog

:cl: VMSolidus and Skubman
- add: 11 new Physical Traits have been added to the game! 6 positive
traits, and 5 negative traits.

---------

Signed-off-by: Danger Revolution! <[email protected]>
Co-authored-by: Angelo Fallaria <[email protected]>
Co-authored-by: Danger Revolution! <[email protected]>
  • Loading branch information
3 people committed Aug 10, 2024
1 parent c006ec8 commit 79b3190
Show file tree
Hide file tree
Showing 8 changed files with 434 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Content.Shared/Traits/Assorted/Components/AdrenalineComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Robust.Shared.GameStates;

namespace Content.Shared.Traits.Assorted.Components;

/// <summary>
/// This is used for any trait that modifies the Melee System implementation of Health Contest
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class AdrenalineComponent : Component
{
/// <summary>
/// When true, multiplies by the inverse of the resulting Contest.
/// </summary>
[DataField]
public bool Inverse { get; private set; } = false;

/// <summary>
/// Used as the RangeModifier input for a Health Contest.
/// </summary>
[DataField]
public float RangeModifier { get; private set; } = 1;

/// <summary>
/// Used as the BypassClamp input for a Health Contest.
/// </summary>
[DataField]
public bool BypassClamp { get; private set; } = false;
}
16 changes: 16 additions & 0 deletions Content.Shared/Traits/Assorted/Components/CritModifierComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Robust.Shared.GameStates;

namespace Content.Shared.Traits.Assorted.Components;

/// <summary>
/// This is used for any trait that modifies CritThreshold
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class CritModifierComponent : Component
{
/// <summary>
/// The amount that an entity's critical threshold will be incremented by.
/// </summary>
[DataField]
public int CritThresholdModifier { get; private set; } = 0;
}
16 changes: 16 additions & 0 deletions Content.Shared/Traits/Assorted/Components/DeadModifierComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Robust.Shared.GameStates;

namespace Content.Shared.Traits.Assorted.Components;

/// <summary>
/// This is used for any trait that modifies DeadThreshold
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class DeadModifierComponent : Component
{
/// <summary>
/// The amount that an entity's DeadThreshold will be incremented by.
/// </summary>
[DataField]
public int DeadThresholdModifier { get; private set; } = 0;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Robust.Shared.GameStates;

namespace Content.Shared.Traits.Assorted.Components;

/// <summary>
/// This is used for any trait that modifies the Melee System implementation of Stamina Contest
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class PainToleranceComponent : Component
{
/// <summary>
/// When true, multiplies by the inverse of the resulting Contest.
/// </summary>
[DataField]
public bool Inverse { get; private set; } = false;

/// <summary>
/// Used as the RangeModifier input for a Stamina Contest.
/// </summary>
[DataField]
public float RangeModifier { get; private set; } = 1;

/// <summary>
/// Used as the BypassClamp input for a Stamina Contest.
/// </summary>
[DataField]
public bool BypassClamp { get; private set; } = false;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Robust.Shared.GameStates;

namespace Content.Shared.Traits.Assorted.Components;

/// <summary>
/// This is used for any trait that modifies stamina CritThreshold
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class StaminaCritModifierComponent : Component
{
/// <summary>
/// The amount that an entity's stamina critical threshold will be incremented by.
/// </summary>
[DataField]
public int CritThresholdModifier { get; private set; } = 0;
}
63 changes: 63 additions & 0 deletions Content.Shared/Traits/Assorted/Systems/TraitStatModifierSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using Content.Shared.Contests;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
using Content.Shared.Traits.Assorted.Components;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Damage.Components;

namespace Content.Shared.Traits.Assorted.Systems;

public sealed partial class TraitStatModifierSystem : EntitySystem
{
[Dependency] private readonly ContestsSystem _contests = default!;
[Dependency] private readonly MobThresholdSystem _threshold = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CritModifierComponent, ComponentStartup>(OnCritStartup);
SubscribeLocalEvent<DeadModifierComponent, ComponentStartup>(OnDeadStartup);
SubscribeLocalEvent<StaminaCritModifierComponent, ComponentStartup>(OnStaminaCritStartup);
SubscribeLocalEvent<AdrenalineComponent, GetMeleeDamageEvent>(OnAdrenalineGetDamage);
SubscribeLocalEvent<PainToleranceComponent, GetMeleeDamageEvent>(OnPainToleranceGetDamage);
}

private void OnCritStartup(EntityUid uid, CritModifierComponent component, ComponentStartup args)
{
if (!TryComp<MobThresholdsComponent>(uid, out var threshold))
return;

var critThreshold = _threshold.GetThresholdForState(uid, Mobs.MobState.Critical, threshold);
if (critThreshold != 0)
_threshold.SetMobStateThreshold(uid, critThreshold + component.CritThresholdModifier, Mobs.MobState.Critical);
}

private void OnDeadStartup(EntityUid uid, DeadModifierComponent component, ComponentStartup args)
{
if (!TryComp<MobThresholdsComponent>(uid, out var threshold))
return;

var deadThreshold = _threshold.GetThresholdForState(uid, Mobs.MobState.Dead, threshold);
if (deadThreshold != 0)
_threshold.SetMobStateThreshold(uid, deadThreshold + component.DeadThresholdModifier, Mobs.MobState.Dead);
}

private void OnStaminaCritStartup(EntityUid uid, StaminaCritModifierComponent component, ComponentStartup args)
{
if (!TryComp<StaminaComponent>(uid, out var stamina))
return;

stamina.CritThreshold += component.CritThresholdModifier;
}

private void OnAdrenalineGetDamage(EntityUid uid, AdrenalineComponent component, ref GetMeleeDamageEvent args)
{
var modifier = _contests.HealthContest(uid, component.BypassClamp, component.RangeModifier);
args.Damage *= component.Inverse ? 1 / modifier : modifier;
}

private void OnPainToleranceGetDamage(EntityUid uid, PainToleranceComponent component, ref GetMeleeDamageEvent args)
{
var modifier = _contests.StaminaContest(uid, component.BypassClamp, component.RangeModifier);
args.Damage *= component.Inverse ? 1 / modifier : modifier;
}
}
59 changes: 59 additions & 0 deletions Resources/Locale/en-US/traits/traits.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,64 @@ trait-description-Foreigner =
For one reason or another you do not speak this station's primary language.
Instead, you have a translator issued to you that only you can use.
trait-name-WillToLive = Will To Live
trait-description-WillToLive =
You have an unusually strong "will to live", and will resist death more than others.
Your damage threshold for becoming Dead is increased by 10 points.
trait-name-WillToDie = Will To Die
trait-description-WillToDie =
You have an unusually weak "will to live", and will succumb to injuries sooner than others.
Your damage threshold for becoming Dead is decreased by 15 points.
trait-name-Tenacity = Tenacity
trait-description-Tenacity =
Whether it be through raw grit, willpower, or subtle bionic augmentations, you are hardier than others.
Your damage threshold for becoming Critical is increased by 5 points.
trait-name-GlassJaw = Glass Jaw
trait-description-GlassJaw =
Your body is more fragile than others, resulting in a greater susceptibility to critical injuries
Your damage threshold for becoming Critical is decreased by 10 points.
trait-name-HighAdrenaline = High Adrenaline
trait-description-HighAdrenaline =
Whether by natural causes, genetic or bionic augmentation, you have a more potent adrenal gland.
When injured, your melee attacks deal up to 10% more damage, in addition to the natural bonuses from adrenaline.
The standard adrenaline bonuses to melee damage are up to a 20% increase.
trait-name-AdrenalDysfunction = Adrenal Dysfunction
trait-description-AdrenalDysfunction =
Your adrenal gland is completely nonfunctional, or potentially missing outright.
Your melee attacks do not benefit from Adrenaline when injured.
The standard adrenaline bonuses to melee damage are up to a 20% increase.
trait-name-Masochism = Masochism
trait-description-Masochism =
Deriving enjoyment from your own pain, you are not as inhibited by it as others.
You ignore the first 10% of stamina damage penalties to your melee attacks.
trait-name-LowPainTolerance = Low Pain Tolerance
trait-description-LowPainTolerance =
Your tolerance for pain is far below average, and its effects are more inhibiting.
Your melee damage is penalized by up to an additional 15% when taking stamina damage.
trait-name-MartialArtist = Martial Artist
trait-description-MartialArtist =
You have received formal training in unarmed combat, whether with Fists, Feet, or Claws.
Your unarmed melee attacks have a small range increase, and deal 50% more damage.
This does not apply to any form of armed melee, only the weapons you were naturally born with.
trait-name-Vigor = Vigor
trait-description-Vigor =
Whether by pure determination, fitness, or bionic augmentations, your endurance is enhanced.
Your stamina is increased by 10 points.
trait-name-Lethargy = Lethargy
trait-description-Lethargy =
You become tired faster than others, making you more vulnerable to exhaustion and fatigue.
Your stamina is decreased by 15 points.
trait-name-SignLanguage = Sign Language
trait-description-SignLanguage =
You can understand and use Galactic Sign Language (GSL).
Expand Down Expand Up @@ -129,3 +187,4 @@ trait-name-WeaponsGeneralist = Weapons Generalist
trait-description-WeaponsGeneralist =
You are a jack of all trades with melee weapons, enabling you to be versatile with your weapon arsenal.
Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%.
Loading

0 comments on commit 79b3190

Please sign in to comment.