using System; using Robust.Shared.GameObjects; using Robust.Shared.Maths; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Content.Server.Power.Components { /// /// Battery node on the pow3r network. Needs other components to connect to actual networks. /// [RegisterComponent] public class BatteryComponent : Component { public override string Name => "Battery"; /// /// Maximum charge of the battery in joules (ie. watt seconds) /// [ViewVariables(VVAccess.ReadWrite)] public float MaxCharge { get => _maxCharge; set => SetMaxCharge(value); } [DataField("maxCharge")] private float _maxCharge; /// /// Current charge of the battery in joules (ie. watt seconds) /// [ViewVariables(VVAccess.ReadWrite)] public float CurrentCharge { get => _currentCharge; set => SetCurrentCharge(value); } [DataField("startingCharge")] private float _currentCharge; /// /// True if the battery is fully charged. /// [ViewVariables] public bool IsFullyCharged => MathHelper.CloseToPercent(CurrentCharge, MaxCharge); /// /// If sufficient charge is avaiable on the battery, use it. Otherwise, don't. /// public virtual bool TryUseCharge(float chargeToUse) { if (chargeToUse >= CurrentCharge) { return false; } else { CurrentCharge -= chargeToUse; return true; } } public virtual float UseCharge(float toDeduct) { var chargeChangedBy = Math.Min(CurrentCharge, toDeduct); CurrentCharge -= chargeChangedBy; return chargeChangedBy; } public void FillFrom(BatteryComponent battery) { var powerDeficit = MaxCharge - CurrentCharge; if (battery.TryUseCharge(powerDeficit)) { CurrentCharge += powerDeficit; } else { CurrentCharge += battery.CurrentCharge; battery.CurrentCharge = 0; } } protected virtual void OnChargeChanged() { } private void SetMaxCharge(float newMax) { _maxCharge = Math.Max(newMax, 0); _currentCharge = Math.Min(_currentCharge, MaxCharge); OnChargeChanged(); } private void SetCurrentCharge(float newChargeAmount) { _currentCharge = MathHelper.Clamp(newChargeAmount, 0, MaxCharge); OnChargeChanged(); } } }