Example #1
0
        private DuplicateDealMetadata ExtractDuplicateDealMetadata(string line, DealMetadata deal, Dictionary <string, int> columnHeaders)
        {
            try
            {
                var duplicateDeal = new DuplicateDealMetadata();
                var values        = ParsePBNHelpers.ParseTableLine(line, columnHeaders);

                duplicateDeal.NSPairIndex = Int32.Parse(values["PairId_NS"]);
                duplicateDeal.EWPairIndex = Int32.Parse(values["PairId_EW"]);
                duplicateDeal.Contract    = values["Contract"];

                SysPlayer declarer;
                duplicateDeal.Declarer = Enum.TryParse(values["Declarer"], true, out declarer) ? (int)declarer : (int)SysPlayer.N;

                if (duplicateDeal.Contract == "-")
                {
                    return(null);
                }

                var position = PlayerPosition.North;
                switch (duplicateDeal.Declarer)
                {
                case (int)SysPlayer.S:
                    position = PlayerPosition.South;
                    break;

                case (int)SysPlayer.E:
                    position = PlayerPosition.East;
                    break;

                case (int)SysPlayer.W:
                    position = PlayerPosition.West;
                    break;
                }

                var contract = new Contract(duplicateDeal.Contract, position);

                int tricks;
                duplicateDeal.Result = Int32.TryParse(values["Result"], out tricks)
                    ? _scoreCalculator.CalculateScore(contract, tricks, (SysVulnerabilityEnum)deal.SysVulnerabilityId)
                    : _scoreCalculator.CalculateScore(contract, values["Result"], (SysVulnerabilityEnum)deal.SysVulnerabilityId);

                duplicateDeal.NSPercentage    = Int32.Parse(values.ContainsKey("Percentage_NS") ? values["Percentage_NS"] : values["IMP_NS"]);
                duplicateDeal.EWPercentage    = Int32.Parse(values.ContainsKey("Percentage_EW") ? values["Percentage_EW"] : values["IMP_EW"]);
                duplicateDeal.ContractDisplay = contract.Display();
                duplicateDeal.HandViewerInput = deal.HandViewerInput + ParsePBNHelpers.ConvertToPbnBiddingSequence(contract, deal.Dealer);
                duplicateDeal.Tricks          = values["Result"];

                return(duplicateDeal);
            }
            catch (Exception ex)
            {
                CustomErrorSignal.Handle(ex);
                return(null);
            }
        }
Example #2
0
        private void CalculateOptimalContract(DealMetadata currentDeal)
        {
            var contract = _scoreCalculator.ComputeOptimalContract(currentDeal.PBNRepresentation, (SysVulnerabilityEnum)currentDeal.SysVulnerabilityId);

            currentDeal.BestContract                = contract.Item2.Notation();
            currentDeal.BestContractDisplay         = contract.Item2.Display();
            currentDeal.BestContractResult          = contract.Item1;
            currentDeal.BestContractDeclarer        = contract.Item2.PlayerPosition.ConvertToSysPlayer();
            currentDeal.BestContractHandViewerInput = currentDeal.HandViewerInput + ParsePBNHelpers.ConvertToPbnBiddingSequence(contract.Item2, currentDeal.Dealer);
        }
Example #3
0
        private static void CalculateMakeableContracts(DealMetadata deal)
        {
            var contracts = DoubleDummyModule.CalculateMakeableContracts(deal.PBNRepresentation);

            contracts.ForEach(contract => deal.MakeableContracts.Add(new MakeableContractMetadata
            {
                Contract        = contract.Display(),
                Declarer        = contract.PlayerPosition.ConvertToSysPlayer(),
                Denomination    = contract.Trump.Order,
                Level           = contract.Level,
                HandViewerInput = deal.HandViewerInput + ParsePBNHelpers.ConvertToPbnBiddingSequence(contract, deal.Dealer)
            }));
        }
Example #4
0
        private async Task <ImportEvent> ProcessPbnFile(string filePath)
        {
            var command      = new ImportEvent();
            var currentDeal  = new DealMetadata();
            var currentState = ParseState.ReadingDeal;

            var identifiedPairs        = 0;
            var identifiedDealResults  = 0;
            var totalScoreTableHeaders = new Dictionary <string, int>();
            var scoreTableHeaders      = new Dictionary <string, int>();

            using (var reader = new StreamReader(filePath))
            {
                string line;
                while ((line = await reader.ReadLineAsync()) != null)
                {
                    if (line.StartsWith("% <META  name=PairCount"))
                    {
                        command.NoOfPairs = Int32.Parse(ParsePBNHelpers.ExtractValue(line)); continue;
                    }
                    if (line.StartsWith("% <META  name=BoardCount"))
                    {
                        command.NoOfBoards = Int32.Parse(ParsePBNHelpers.ExtractValue(line)); continue;
                    }
                    if (line.StartsWith("% <META  name=RoundCount"))
                    {
                        command.NoOfRounds = Int32.Parse(ParsePBNHelpers.ExtractValue(line)); continue;
                    }
                    if (line.StartsWith("[Board"))
                    {
                        var deal = new DealMetadata {
                            Index = Int32.Parse(ParsePBNHelpers.ExtractValue(line))
                        };
                        command.Deals.Add(deal);
                        currentDeal           = deal;
                        currentState          = ParseState.ReadingDeal;
                        identifiedDealResults = 0;
                        continue;
                    }
                    if (line.StartsWith("[Dealer "))
                    {
                        var dealer = ParsePBNHelpers.ExtractValue(line);
                        currentDeal.Dealer = ParsePBNHelpers.GetPlayerIdFromString(dealer);
                        continue;
                    }
                    if (line.StartsWith("[Deal "))
                    {
                        currentDeal.PBNRepresentation = ParsePBNHelpers.ExtractValue(line);
                        currentDeal.HandViewerInput   = ParsePBNHelpers.ConvertPBNToHandViewerInput(currentDeal.PBNRepresentation, currentDeal.Index, (SysVulnerabilityEnum)currentDeal.SysVulnerabilityId);
                        CalculateMakeableContracts(currentDeal);
                        CalculateOptimalContract(currentDeal);
                        continue;
                    }
                    if (line.StartsWith("[Vulnerable"))
                    {
                        currentDeal.SysVulnerabilityId = (int)Enum.Parse(typeof(SysVulnerabilityEnum), ParsePBNHelpers.ExtractValue(line), true);
                        continue;
                    }
                    if (currentState == ParseState.ReadingTotalScoreTable && identifiedPairs < command.NoOfPairs)
                    {
                        command.Pairs.Add(ExtractPairMetadata(line, totalScoreTableHeaders));
                        identifiedPairs++;
                        continue;
                    }
                    if (currentState == ParseState.ReadingDealScoreTable && identifiedDealResults < command.NoOfRounds)
                    {
                        var duplicateDeal = ExtractDuplicateDealMetadata(line, currentDeal, scoreTableHeaders);
                        if (duplicateDeal != null)
                        {
                            currentDeal.DealResults.Add(duplicateDeal);
                        }

                        identifiedDealResults++;
                        continue;
                    }
                    if (line.StartsWith("[TotalScoreTable"))
                    {
                        totalScoreTableHeaders = ParsePBNHelpers.ParseTableHeader(ParsePBNHelpers.ExtractValue(line));
                        currentState           = ParseState.ReadingTotalScoreTable; continue;
                    }
                    if (line.StartsWith("[ScoreTable"))
                    {
                        scoreTableHeaders = ParsePBNHelpers.ParseTableHeader(ParsePBNHelpers.ExtractValue(line));
                        currentState      = ParseState.ReadingDealScoreTable;
                    }
                }
            }
            return(command);
        }