using Unity.Entities; using Unity.NetCode; namespace ProjectM.Simulation { /// /// A player's private choice-of-3 boon offer for the just-cleared room. OWNER-ONLY replication /// (): 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 , which for HUD purposes still only surfaces each /// player's component on the client that owns that ghost). Written by BoonOfferSystem on the RoomReward /// entry edge (options drawn deterministically from Hash(RunSeed, room, NetworkId)); is /// cleared by BoonApplySystem 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. /// [GhostComponent(OwnerSendType = SendToOwnerType.SendToOwner)] public struct BoonOffer : IComponentData { /// 1 = awaiting this player's pick. [GhostField] public byte Pending; /// Boon catalog id of option 0. [GhostField] public byte Option0; /// Boon catalog id of option 1. [GhostField] public byte Option1; /// Boon catalog id of option 2. [GhostField] public byte Option2; } }