using Robust.Shared.Audio;
using Robust.Shared.Serialization;
namespace Content.Shared.Power.Generator;
///
/// Responsible for power output switching & UI logic on portable generators.
///
///
/// A portable generator is expected to have the following components: SolidFuelGeneratorAdapterComponent .
///
///
[RegisterComponent]
[Access(typeof(SharedPortableGeneratorSystem))]
public sealed partial class PortableGeneratorComponent : Component
{
///
/// Chance that this generator will start. If it fails, the user has to try again.
///
[DataField("startChance")]
[ViewVariables(VVAccess.ReadWrite)]
public float StartChance { get; set; } = 1f;
///
/// Amount of time it takes to attempt to start the generator.
///
[DataField("startTime")]
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan StartTime { get; set; } = TimeSpan.FromSeconds(2);
///
/// Sound that plays when attempting to start this generator.
///
[DataField("startSound")]
[ViewVariables(VVAccess.ReadWrite)]
public SoundSpecifier? StartSound { get; set; }
///
/// Sound that plays when attempting to start this generator.
/// Plays instead of if the generator has no fuel (dumbass).
///
[DataField("startSoundEmpty")]
[ViewVariables(VVAccess.ReadWrite)]
public SoundSpecifier? StartSoundEmpty { get; set; }
}
///
/// Sent to the server to adjust the targeted power level of a portable generator.
///
[Serializable, NetSerializable]
public sealed class PortableGeneratorSetTargetPowerMessage : BoundUserInterfaceMessage
{
public int TargetPower;
public PortableGeneratorSetTargetPowerMessage(int targetPower)
{
TargetPower = targetPower;
}
}
///
/// Sent to the server to try to start a portable generator.
///
[Serializable, NetSerializable]
public sealed class PortableGeneratorStartMessage : BoundUserInterfaceMessage
{
}
///
/// Sent to the server to try to stop a portable generator.
///
[Serializable, NetSerializable]
public sealed class PortableGeneratorStopMessage : BoundUserInterfaceMessage
{
}
///
/// Sent to the server to try to change the power output of a power-switchable portable generator.
///
[Serializable, NetSerializable]
public sealed class PortableGeneratorSwitchOutputMessage : BoundUserInterfaceMessage
{
}
///
/// Sent to the server to try to eject all fuel stored in a portable generator.
///
[Serializable, NetSerializable]
public sealed class PortableGeneratorEjectFuelMessage : BoundUserInterfaceMessage
{
}
///
/// Contains network state for the portable generator.
///
[Serializable, NetSerializable]
public sealed class PortableGeneratorComponentBuiState : BoundUserInterfaceState
{
public float RemainingFuel;
public bool Clogged;
public (float Load, float Supply)? NetworkStats;
public float TargetPower;
public float MaximumPower;
public float OptimalPower;
public bool On;
public PortableGeneratorComponentBuiState(
FuelGeneratorComponent component,
float remainingFuel,
bool clogged,
(float Demand, float Supply)? networkStats)
{
RemainingFuel = remainingFuel;
Clogged = clogged;
TargetPower = component.TargetPower;
MaximumPower = component.MaxTargetPower;
OptimalPower = component.OptimalPower;
On = component.On;
NetworkStats = networkStats;
}
}
[Serializable, NetSerializable]
public enum GeneratorComponentUiKey
{
Key
}
///
/// Sprite layers for generator prototypes.
///
[Serializable, NetSerializable]
public enum GeneratorVisualLayers : byte
{
Body,
Unlit
}
///
/// Appearance keys for generators.
///
[Serializable, NetSerializable]
public enum GeneratorVisuals : byte
{
///
/// Boolean: is the generator running?
///
Running,
}