29 lines
1.5 KiB
C#
29 lines
1.5 KiB
C#
using Unity.Entities;
|
|
using Unity.NetCode;
|
|
|
|
namespace ProjectM.Simulation
|
|
{
|
|
/// <summary>
|
|
/// A player's private choice-of-3 boon offer for the just-cleared room. OWNER-ONLY replication
|
|
/// (<see cref="SendToOwnerType.SendToOwner"/>): the offer is an observe-only HUD read of the LOCAL player — no
|
|
/// prediction, no teammate read — so the traffic-minimal owner-only path is correct (Play-validated at Step 9;
|
|
/// the proven fallback is <see cref="SendToOwnerType.All"/>, which for HUD purposes still only surfaces each
|
|
/// player's component on the client that owns that ghost). Written by <c>BoonOfferSystem</c> on the RoomReward
|
|
/// entry edge (options drawn deterministically from Hash(RunSeed, room, NetworkId)); <see cref="Pending"/> is
|
|
/// cleared by <c>BoonApplySystem</c> on a valid pick and zeroed by the Returning-edge strip. INERT until Step 9 —
|
|
/// baked at Step 3 so the player ghost re-bakes exactly ONCE for the whole redesign.
|
|
/// </summary>
|
|
[GhostComponent(OwnerSendType = SendToOwnerType.SendToOwner)]
|
|
public struct BoonOffer : IComponentData
|
|
{
|
|
/// <summary>1 = awaiting this player's pick.</summary>
|
|
[GhostField] public byte Pending;
|
|
/// <summary>Boon catalog id of option 0.</summary>
|
|
[GhostField] public byte Option0;
|
|
/// <summary>Boon catalog id of option 1.</summary>
|
|
[GhostField] public byte Option1;
|
|
/// <summary>Boon catalog id of option 2.</summary>
|
|
[GhostField] public byte Option2;
|
|
}
|
|
}
|