/// <summary>
        /// Checks if <see cref="Player"/> meets supplied prerequisite.
        /// </summary>
        public bool Meets(Player player, uint prerequisiteId)
        {
            PrerequisiteEntry entry = GameTableManager.Instance.Prerequisite.GetEntry(prerequisiteId);

            if (entry == null)
            {
                throw new ArgumentException();
            }

            for (int i = 0; i < entry.PrerequisiteTypeId.Length; i++)
            {
                var type = (PrerequisiteType)entry.PrerequisiteTypeId[i];
                if (type == PrerequisiteType.None)
                {
                    continue;
                }

                PrerequisiteComparison comparison = (PrerequisiteComparison)entry.PrerequisiteComparisonId[i];
                if (!Meets(player, type, comparison, entry.Value[i], entry.ObjectId[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
        private bool MeetsEvaluateOr(Player player, uint prerequisiteId, PrerequisiteEntry entry)
        {
            for (int i = 0; i < entry.PrerequisiteTypeId.Length; i++)
            {
                var type = (PrerequisiteType)entry.PrerequisiteTypeId[i];
                if (type == PrerequisiteType.None)
                {
                    continue;
                }

                PrerequisiteComparison comparison = (PrerequisiteComparison)entry.PrerequisiteComparisonId[i];
                if (Meets(player, type, comparison, entry.Value[i], entry.ObjectId[i]))
                {
                    return(true);
                }
            }

            log.Trace($"Player {player.Name} failed prerequisite OR check ({prerequisiteId})");
            return(false);
        }
        /// <summary>
        /// Checks if <see cref="Player"/> meets supplied prerequisite.
        /// </summary>
        public bool Meets(Player player, uint prerequisiteId)
        {
            PrerequisiteEntry entry = GameTableManager.Instance.Prerequisite.GetEntry(prerequisiteId);

            if (entry == null)
            {
                throw new ArgumentException();
            }

            switch ((EvaluationMode)entry.Flags)
            {
            case EvaluationMode.EvaluateAND:
                return(MeetsEvaluateAnd(player, prerequisiteId, entry));

            case EvaluationMode.EvaluateOR:
                return(MeetsEvaluateOr(player, prerequisiteId, entry));

            default:
                log.Trace($"Unhandled EvaluationMode {entry.Flags}");
                return(false);
            }
        }