private static bool IsLesser(DigitPosition o, string[] strings)
        {
            var nextIndex = o.Index + 1;
            if (nextIndex >= strings.Length)
            {
                return false;
            }

            return int.Parse(o.S) < int.Parse(strings[nextIndex]);
        }
        private static Point[] GetShape(BarPosition barPosition, DigitPosition digitPos)
        {
            //Points retrieved when the form was 1006, 560.
            switch (barPosition)
            {
            case BarPosition.Top:
                Point[] shape1 = { new Point(44 + (int)digitPos,  111), new Point(213 + (int)digitPos, 111),
                                   new Point(168 + (int)digitPos, 155), new Point(86 + (int)digitPos, 155) };
                return(shape1);

            case BarPosition.TopLeft:
                Point[] shape2 = { new Point(36 + (int)digitPos, 233), new Point(36 + (int)digitPos, 120),
                                   new Point(79 + (int)digitPos, 164), new Point(79 + (int)digitPos, 223),
                                   new Point(52 + (int)digitPos, 249) };
                return(shape2);

            case BarPosition.TopRight:
                Point[] shape3 = { new Point(221 + (int)digitPos, 119), new Point(178 + (int)digitPos, 163),
                                   new Point(178 + (int)digitPos, 220), new Point(205 + (int)digitPos, 248),
                                   new Point(221 + (int)digitPos, 232) };
                return(shape3);

            case BarPosition.Middle:
                Point[] shape4 = { new Point(83 + (int)digitPos,  236), new Point(175 + (int)digitPos, 236),
                                   new Point(196 + (int)digitPos, 258), new Point(175 + (int)digitPos, 279),
                                   new Point(83 + (int)digitPos,  279), new Point(60 + (int)digitPos, 258) };
                return(shape4);

            case BarPosition.BottomLeft:
                Point[] shape5 = { new Point(53 + (int)digitPos, 266), new Point(36 + (int)digitPos, 285),
                                   new Point(36 + (int)digitPos, 396), new Point(80 + (int)digitPos, 350),
                                   new Point(80 + (int)digitPos, 292) };
                return(shape5);

            case BarPosition.BottomRight:
                Point[] shape6 = { new Point(205 + (int)digitPos,                                                               266), new Point(221 + (int)digitPos, 281),
                                   new Point(221 + (int)digitPos,                                                               396), new Point(177 +
                                                                                                                                                (int)digitPos,                                350), new Point(177 + (int)digitPos, 294) };
                return(shape6);

            case BarPosition.Bottom:
                Point[] shape7 = { new Point(88 + (int)digitPos,  359), new Point(169 + (int)digitPos, 359),
                                   new Point(212 + (int)digitPos, 404), new Point(45 + (int)digitPos, 404) };
                return(shape7);

            default:
                return(null);
            }
        }
        /// <summary>
        /// We can only be missing digits at the beginning (because the number is small),
        /// not in the center, or at the end. E.g. "33333" - valid,
        /// "33_33" - not valid, "3333_" - not valid
        /// </summary>
        public static bool isDigitSequenceNotInterrupting(List <DigitEnum> digits, PlayerIndex playerIndex)
        {
            Dbg.assertPlayerIndexIsInRangeAndNotInvalid(playerIndex);

            // Must have 5 digits for BP score
            Dbg.assert(digits.Count == 5);

            bool          bSequenceStarted = false;
            DigitEnum     firstDigit       = DigitEnum.Error;
            DigitPosition firstDigitIndex  = DigitPosition.Error;

            // From left to right - For all digits in list see if sequence interrupts
            for (int d = ( int )DigitPosition.DigitPos0; d <= (int)DigitPosition.DigitPos4; d++)
            {
                Dbg.assertDigitEnumIsInRange(digits[d]);

                // We previously found a valid digit, must be followed by digits until the end
                // If it's not then we have an error
                if (bSequenceStarted && digits[d] == DigitEnum.Error)
                {
                    //Dbg.onError( "Wrong BP digit sequence at pos: " + d.ToString() +
                    //    " for player: " + playerIndex.ToString() );

                    return(false);
                }

                // Did we find the first valid digit?
                if (!bSequenceStarted && digits[d] != DigitEnum.Error)
                {
                    firstDigit       = digits[d];
                    firstDigitIndex  = ( DigitPosition )d;
                    bSequenceStarted = true;
                }
            }

            // We can only have '0' at the beginning if it's the last digit (usually on DC)
            if (firstDigit == DigitEnum.Digit0)
            {
                if (firstDigitIndex != DigitPosition.DigitPos4)
                {
                    return(false);
                }
            }

            return(true);
        }
        //public static int getHorizontalDigitOffsetForPlayer(PlayerIndex playerIndex, DigitPosition digitPos )
        //{
        //    // We might have casted it from an int, check if it's inside enum range
        //    Dbg.assertPlayerIndexIsInRangeAndNotInvalid( playerIndex );
        //    Dbg.assertDigitPosEnumIsInRangeAndNotInvalid( digitPos );

        //    string resolution = ScreenCapture.getScreenshotResolutionAsString();

        //    //horizontalDigitOffset[ ( int )DigitPosition.DigitPos0 ] = 661;   // Left-most digit
        //    //horizontalDigitOffset[ ( int )DigitPosition.DigitPos1 ] = 683;
        //    //horizontalDigitOffset[ ( int )DigitPosition.DigitPos2 ] = 715;
        //    //horizontalDigitOffset[ ( int )DigitPosition.DigitPos3 ] = 738;
        //    //horizontalDigitOffset[ ( int )DigitPosition.DigitPos4 ] = 760;   // Right-most digit

        //    switch ( playerIndex )
        //    {
        //        case PlayerIndex.Survivor1:
        //        case PlayerIndex.Survivor2:
        //        case PlayerIndex.Survivor3:
        //        case PlayerIndex.Survivor4:
        //            return horizontalDigitOffset[ resolution ][( int )digitPos ];

        //        case PlayerIndex.Killer:
        //            // All digits except for the first one are moved by 1 pixel for killer
        //            if ( digitPos == DigitPosition.DigitPos0 )
        //                return horizontalDigitOffset[ resolution ][ ( int )digitPos ];

        //            return horizontalDigitOffset[ resolution ][ ( int )digitPos ] + 1;

        //        default:
        //            Dbg.onError( "Invalid player" );
        //            break;
        //    }

        //    Dbg.onError( "Error" );

        //    return 0;
        //}

        /// <summary>
        /// digitIndex is 0 based
        /// </summary>
        public bool recognize(PlayerIndex playerIndex, DigitPosition digitPos, bool bDebug = false)
        {
            // We might have casted it from an int, check if it's inside enum range
            Dbg.assertPlayerIndexIsInRangeAndNotInvalid(playerIndex);
            Dbg.assertDigitPosEnumIsInRangeAndNotInvalid(digitPos);

            string resolution = ScreenCapture.getScreenshotResolutionAsString();

            //int verticalBeginningOfDigits = verticalPosOfFirstSurvivorBPDigit[ resolution ];

            int horizontalOffset = horizontalDigitOffset[resolution][playerIndex][( int )digitPos];
            int verticalOffset   = verticalOffsetBetweenEndscorePlayerBpDigits[resolution][( int )playerIndex];

            //// For killer it is moved 5 pixels down
            //if ( playerIndex == PlayerIndex.Killer )
            //    verticalOffset = verticalOffset + 5;

            return(base.recognize(horizontalOffset, verticalOffset, bDebug));
        }
Exemple #5
0
 public static void assertDigitPosEnumIsInRangeAndNotInvalid(DigitPosition digitPos)
 {
     assert(Enum.IsDefined(typeof(DigitPosition), ( int )digitPos));
     assert(digitPos != DigitPosition.Error);
 }
        private void RenderOutline(int number, DigitPosition digitPos)
        {
            switch (number)
            {
            case 0:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 1:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                break;

            case 2:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 3:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 4:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                break;

            case 5:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 6:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 7:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                break;

            case 8:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 9:
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.DrawPolygon(_outlinePen, GetShape(BarPosition.Bottom, digitPos));
                break;
            }
        }
        /// <summary>
        /// Renders a specified number at the specified position
        /// </summary>
        private void RenderNumber(int number, DigitPosition digitPos)
        {
            switch (number)
            {
            case 0:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 1:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                break;

            case 2:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 3:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 4:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                break;

            case 5:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 6:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 7:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                break;

            case 8:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;

            case 9:
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Top, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopLeft, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.TopRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Middle, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.BottomRight, digitPos));
                _bufGraphics.Graphics.FillPolygon(_foreBrush, GetShape(BarPosition.Bottom, digitPos));
                break;
            }
        }
        /// <summary>
        /// Take player index and index of a digit in BP score and return the digit.
        /// E.g. digit at index '2' from BP score "14 356" will be '3'
        /// </summary>
        public static DigitEnum recognizeDigitAtDigitPosForPlayer(PlayerIndex playerIndex, DigitPosition digitPos)
        {
            // We might have casted it from an int, check if it's inside enum range
            Dbg.assertPlayerIndexIsInRangeAndNotInvalid(playerIndex);
            Dbg.assertDigitPosEnumIsInRangeAndNotInvalid(digitPos);


            List <bool> boolDigitList = new List <bool>();

            // Try to recognize ALL possible digits at that place
            for (int d = 0; d <= 9; d++)
            {
                boolDigitList.Add(digit[d].recognize(playerIndex, digitPos));
            }

            Dbg.ensureMaxOneBoolIsTrue(boolDigitList);

            // see which one is true, if any
            DigitEnum recognizedDigit = DigitEnum.Error;

            for (int d = (int)DigitEnum.Digit0; d <= (int)DigitEnum.Digit9; d++)
            {
                // Already set it before, so we have more than 1 value => error
                if (boolDigitList[d] && recognizedDigit != DigitEnum.Error)
                {
                    return(DigitEnum.Error);
                }

                if (boolDigitList[d])
                {
                    recognizedDigit = ( DigitEnum )d;
                }
            }

            Dbg.assertDigitEnumIsInRange(recognizedDigit);

            return(recognizedDigit);
        }