//using Content.Shared.CCVar; // Frontier
using Robust.Shared.Serialization;
using CCVars = Content.Shared._EE.CCVar.EECCVars; // Frontier
namespace Content.Shared.Contests;
public sealed partial class ContestsSystem
{
///
/// Clamp a contest to a Range of [Epsilon, 32bit integer limit]. This exists to make sure contests are always "Safe" to divide by.
///
private float ContestClamp(float input)
{
return Math.Clamp(input, float.Epsilon, float.MaxValue);
}
///
/// Shorthand for checking if clamp overrides are allowed, and the bypass is used by a contest.
///
private bool ContestClampOverride(bool bypassClamp)
{
return _cfg.GetCVar(CCVars.AllowClampOverride) && bypassClamp;
}
///
/// Constructor for feeding options from a given set of ContestArgs into the ContestsSystem.
/// Just multiply by this and give it a user EntityUid and a ContestArgs variable. That's all you need to know.
///
public float ContestConstructor(EntityUid user, ContestArgs args)
{
if (!_cfg.GetCVar(CCVars.DoContestsSystem))
return 1;
if (!args.DoEveryInteraction)
return args.DoMassInteraction ? ((!args.MassDisadvantage
? MassContest(user, args.MassBypassClamp, args.MassRangeModifier)
: 1 / MassContest(user, args.MassBypassClamp, args.MassRangeModifier))
+ args.MassOffset)
: 1
* (args.DoStaminaInteraction ? ((!args.StaminaDisadvantage
? StaminaContest(user, args.StaminaBypassClamp, args.StaminaRangeModifier)
: 1 / StaminaContest(user, args.StaminaBypassClamp, args.StaminaRangeModifier))
+ args.StaminaOffset)
: 1)
* (args.DoHealthInteraction ? ((!args.HealthDisadvantage
? HealthContest(user, args.HealthBypassClamp, args.HealthRangeModifier)
: 1 / HealthContest(user, args.HealthBypassClamp, args.HealthRangeModifier))
+ args.HealthOffset)
: 1);
//* (args.DoMindInteraction ? ((!args.MindDisadvantage
// ? MindContest(user, args.MindBypassClamp, args.MindRangeModifier)
// : 1 / MindContest(user, args.MindBypassClamp, args.MindRangeModifier))
// + args.MindOffset)
// : 1)
//* (args.DoMoodInteraction ? ((!args.MoodDisadvantage
// ? MoodContest(user, args.MoodBypassClamp, args.MoodRangeModifier)
// : 1 / MoodContest(user, args.MoodBypassClamp, args.MoodRangeModifier))
// + args.MoodOffset)
// : 1);
var everyContest = EveryContest(user,
args.MassBypassClamp,
args.StaminaBypassClamp,
args.HealthBypassClamp,
args.MindBypassClamp,
args.MoodBypassClamp,
args.MassRangeModifier,
args.StaminaRangeModifier,
args.HealthRangeModifier,
args.MindRangeModifier,
args.MoodRangeModifier,
args.EveryMassWeight,
args.EveryStaminaWeight,
args.EveryHealthWeight,
args.EveryMindWeight,
args.EveryMoodWeight,
args.EveryInteractionSumOrMultiply);
return !args.EveryDisadvantage ? everyContest : 1 / everyContest;
}
}
[Serializable, NetSerializable, DataDefinition]
public sealed partial class ContestArgs
{
///
/// Controls whether this melee weapon allows for mass to factor into damage.
///
[DataField]
public bool DoMassInteraction;
///
/// When true, mass provides a disadvantage.
///
[DataField]
public bool MassDisadvantage;
///
/// When true, mass contests ignore clamp limitations for a melee weapon.
///
[DataField]
public bool MassBypassClamp;
///
/// Multiplies the acceptable range of outputs provided by mass contests for melee.
///
[DataField]
public float MassRangeModifier = 1;
///
/// The output of a mass contest is increased by this amount.
///
[DataField]
public float MassOffset;
///
/// Controls whether this melee weapon allows for stamina to factor into damage.
///
[DataField]
public bool DoStaminaInteraction;
///
/// When true, stamina provides a disadvantage.
///
[DataField]
public bool StaminaDisadvantage;
///
/// When true, stamina contests ignore clamp limitations for a melee weapon.
///
[DataField]
public bool StaminaBypassClamp;
///
/// Multiplies the acceptable range of outputs provided by mass contests for melee.
///
[DataField]
public float StaminaRangeModifier = 1;
///
/// The output of a stamina contest is increased by this amount.
///
[DataField]
public float StaminaOffset;
///
/// Controls whether this melee weapon allows for health to factor into damage.
///
[DataField]
public bool DoHealthInteraction;
///
/// When true, health contests provide a disadvantage.
///
[DataField]
public bool HealthDisadvantage;
///
/// When true, health contests ignore clamp limitations for a melee weapon.
///
[DataField]
public bool HealthBypassClamp;
///
/// Multiplies the acceptable range of outputs provided by mass contests for melee.
///
[DataField]
public float HealthRangeModifier = 1;
///
/// The output of health contests is increased by this amount.
///
[DataField]
public float HealthOffset;
///
/// Controls whether this melee weapon allows for psychic casting stats to factor into damage.
///
[DataField]
public bool DoMindInteraction;
///
/// When true, high psychic casting stats provide a disadvantage.
///
[DataField]
public bool MindDisadvantage;
///
/// When true, mind contests ignore clamp limitations for a melee weapon.
///
[DataField]
public bool MindBypassClamp;
///
/// Multiplies the acceptable range of outputs provided by mind contests for melee.
///
[DataField]
public float MindRangeModifier = 1;
///
/// The output of a mind contest is increased by this amount.
///
[DataField]
public float MindOffset;
///
/// Controls whether this melee weapon allows mood to factor into damage.
///
[DataField]
public bool DoMoodInteraction;
///
/// When true, mood provides a disadvantage.
///
[DataField]
public bool MoodDisadvantage;
///
/// When true, mood contests ignore clamp limitations for a melee weapon.
///
[DataField]
public bool MoodBypassClamp;
///
/// Multiplies the acceptable range of outputs provided by mood contests for melee.
///
[DataField]
public float MoodRangeModifier = 1;
///
/// The output of mood contests is increased by this amount.
///
[DataField]
public float MoodOffset;
///
/// Enables the EveryContest interaction for a melee weapon.
/// IF YOU PUT THIS ON ANY WEAPON OTHER THAN AN ADMEME, I WILL COME TO YOUR HOUSE AND SEND YOU TO MEET YOUR CREATOR WHEN THE PLAYERS COMPLAIN.
///
[DataField]
public bool DoEveryInteraction;
///
/// When true, EveryContest provides a disadvantage.
///
[DataField]
public bool EveryDisadvantage;
///
/// How much Mass is considered for an EveryContest.
///
[DataField]
public float EveryMassWeight = 1;
///
/// How much Stamina is considered for an EveryContest.
///
[DataField]
public float EveryStaminaWeight = 1;
///
/// How much Health is considered for an EveryContest.
///
[DataField]
public float EveryHealthWeight = 1;
///
/// How much psychic casting stats are considered for an EveryContest.
///
[DataField]
public float EveryMindWeight = 1;
///
/// How much mood is considered for an EveryContest.
///
[DataField]
public float EveryMoodWeight = 1;
///
/// When true, the EveryContest sums the results of all contests rather than multiplying them,
/// probably giving you a very, very, very large multiplier...
///
[DataField]
public bool EveryInteractionSumOrMultiply;
}