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)); }
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); }