public virtual void OnLootRoll(DungeonLootEntry entry, DungeonLootRoll roll)
        {
            if (entry == null || !entry.Valid)
            {
                return;
            }

            GroupMessage(
                m =>
                String.Format(
                    "{0} select{1} {2} for:  {3}",
                    m == roll.Mobile ? "You" : roll.Mobile.RawName,
                    m != roll.Mobile ? "s" : String.Empty,
                    roll.Action,
                    entry.Item.ResolveName(m).ToUpperWords()));
        }
        public virtual void OnLootWin(DungeonLootEntry entry, DungeonLootRoll roll, bool timeout)
        {
            if (entry == null || !entry.Valid)
            {
                return;
            }

            entry.Item.Movable = true;

            if (!GiveLoot(roll.Mobile, entry.Item, false))
            {
                entry.Winner = null;
                entry.Rolls.Remove(roll.Mobile);
                roll.Free();
                return;
            }

            foreach (var val in entry.Rolls.Values)
            {
                DungeonLootRoll r;

                if (val != null)
                {
                    r = val.Value;
                }
                else
                {
                    continue;
                }

                GroupMessage(
                    m =>
                    String.Format(
                        "{0} roll{1} {2}",
                        m == r.Mobile ? "You" : r.Mobile.RawName,
                        m != r.Mobile ? "s" : String.Empty,
                        r.Value));
            }

            GroupMessage(
                m =>
                String.Format(
                    "{0} receive{1} loot: {2}",
                    m == roll.Mobile ? "You" : roll.Mobile.RawName,
                    m != roll.Mobile ? "s" : String.Empty,
                    entry.Item.ResolveName(m).ToUpperWords()));
        }
        private int Roll(PlayerMobile m, DungeonLootAction action)
        {
            if (!Valid || HasWinner || m == null || m.Deleted)
            {
                return(-1);
            }

            var roll = Rolls.GetValue(m);

            if (roll == null)
            {
                var value = action != DungeonLootAction.Pass ? (1 + Utility.Random(100)) : 0;

                Rolls.AddOrReplace(m, roll = new DungeonLootRoll(m, action, value));
            }

            if (Dungeon != null)
            {
                Dungeon.OnLootRoll(this, roll.Value);
            }

            return(roll.Value);
        }
        public virtual void Deserialize(GenericReader reader)
        {
            reader.GetVersion();

            Item    = reader.ReadItem();
            Created = reader.ReadDateTime();
            Expire  = reader.ReadDeltaTime();
            Winner  = reader.ReadMobile <PlayerMobile>();

            Rolls = reader.ReadDictionary(
                r =>
            {
                var k             = r.ReadMobile <PlayerMobile>();
                DungeonLootRoll?v = null;

                if (r.ReadBool())
                {
                    v = new DungeonLootRoll(r);
                }

                return(new KeyValuePair <PlayerMobile, DungeonLootRoll?>(k, v));
            });
        }