#11
|
|||
|
|||
Re: ipoker skins and scripts?
; ========================================
; AHK Bet Pot Script for iPoker by butcha ; ---------------------------------------- ; Includes mouse wheel functionality ; Supports both full view and mini view ; ---------------------------------------- ; Latest version is available at: ; http://hem.passagen.se/perg/iPokerBetPot.txt ; ======================================== ; ; INSTRUCTIONS: ; ---------------------------------------- ; 1. Check the 'User Settings'-section below, ; so that all 3 options (WheelUnit, ; WhiteBetBox and ButtonsOnLeft) are ok. ; (Defaults should be working for most.) ; 2. Rename the script file so that it has the ; file extension .ahk. ; 3. Start the script. ; 4. Right click the mouse button anywhere on a ; iPoker table, where it's your turn to act, ; to set the betting box to a pot bet. ; 5. Scroll the mouse wheel up or down to change ; the betting amount. ; ; ; CONFIRMED SUPPORTED SKINS: ; ---------------------------------------- ; - CD Poker ; - Expekt Poker ; - Noble Poker ; - Paddy Power Poker ; - Titan Poker ; Feel free to add to this list by contacting me. ; ; ; HOW DOES THE SCRIPT WORK? ; ---------------------------------------- ; The short version is that it reads the pot size ; from the text on the table and it reads the call- ; and raise sizes from the text on the Call- and ; Raise-button respectively. ; If you are interested in a more technical ; explanation go to line 520 in this script. ; ; ; TROUBLESHOOTING: ; ---------------------------------------- ; Since the script reads the text off the screen ; it is extremely important that the table you ; want to act on has both the pot size-text and ; the Call- and Raise-buttons fully visible. ; This includes overlay statistics programs like ; PokerAce Hud and GameTime+. ; ; The next thing to note is that I haven't tested ; this script with every iPoker skin out there. ; It should work with all skins that writes out ; the pot size, call size and raise size with one ; color only (although possibly a different one for ; each), no anti-aliasing and with the font ; Tahoma 11 pts. ; It also works on skins that use Tahoma, 12 pts ; bold to write out the call or raise size on the ; buttons in full view, which I believe most skins ; do. ; ; If you have changed the appearance of your iPoker ; table by modding the graphics-files the script ; should still be in effect, but this is not 100%. ; ; If you still have no success the best thing you ; can do is take a screenshot of the table in a ; situation where you would expect it to work. ; Save the image in a format without compression, ; like BMP or PNG. Then upload the screenshot ; somewhere and give me the link. I will not accept ; file transfers over Msn, but you can contact me ; for help. ; ; One last note. If the iPoker client ever gets ; redesigned, this script will stop working. ; ; ; KNOWN BUGS: ; ---------------------------------------- ; - If you move the mouse wheel very fast ; there might be strange behavior ; ; ; CONTACT ME: ; ---------------------------------------- ; 2+2 Forums Name: butcha ; ; All comments are welcome. ; ; ; ---------------------------------------- ; ======================================== ; ; ; ==================== ; SCRIPT SETTINGS 1 ; ==================== #NoEnv #Persistent #SingleInstance, Force ; ==================== ; USER SETTINGS ; ==================== ; Mouse Wheel Unit ; -------------------- ; The amount your bet changes up or down ; when you scroll the wheel. This value ; can be either the words sb or bb, or a ; number, e.g. 0.50 or 10 WheelUnit = bb ; -------------------- ; White Betting Box ; -------------------- ; Set this value to 1 if the background of the ; box where you type in your bets is white. ; Change this to 0 if the background is NOT white. ; If you don't have a white background the script ; may send the betting amount to the chat-box if ; you act out of turn, no matter of this setting. ; (Note 1: White means the exact color 0xFFFFFF.) ; (Note 2: This setting has no effect if the area ; behind the betting box is always white.) WhiteBetBox := 1 ; -------------------- ; Buttons On Left ; -------------------- ; This option is only for those of you playing ; at a skin where the Action-buttons (Fold, Call, ; Raise) and the box where you type in your bets ; is more to the left than most skins. ; If you do, set this option to 1. ; The only skin I know so far that this applies ; to is BetFred Poker. ; The default is 0 (zero). ; This setting ONLY effects full view. ButtonsOnLeft := 0 ; ==================== ; ERROR CHECK USER SETTINGS ; ==================== If (WheelUnit != "sb" AND WheelUnit != "bb") If WheelUnit Is Not Number { MsgBox, 16, Configuration error, (LTrim Check the 'User settings'-section at the top of the script. The variable WheelUnit must be either the words sb or bb or a number. ) ExitApp } ; -------------------- If (WhiteBetBox != 0 AND WhiteBetBox != 1) { MsgBox, 16, Configuration error, (LTrim Check the 'User settings'-section at the top of the script. The variable WhiteBetBox must be 1 for a white betting box background and 0 for a non-white betting box background. ) ExitApp } ; -------------------- If (ButtonsOnLeft != 0 AND ButtonsOnLeft != 1) { MsgBox, 16, Configuration error, (LTrim Check the 'User settings'-section at the top of the script. The variable ButtonsOnLeft must be 0 for most skins and 1 ONLY for those skins that have Action buttons more to the left, like for example BetFred Poker. ) ExitApp } ; -------------------- ; ==================== ; SCRIPT SETTINGS 2 ; ==================== SetBatchLines, -1 SetKeyDelay, -1 SetMouseDelay, -1 SetWinDelay, -1 SetTitleMatchMode, 2 SendMode, Input CoordMode, Mouse, Screen CoordMode, Pixel, Screen ; ==================== ; GLOBAL VARIABLES ; ==================== SysGet, Sb, 7 SysGet, Sc, 4 TableSize := 0 PotTextColor := 0x0 CallTextColor := 0x0 RaiseTextColor := 0x0 MouseX := 0 MouseY := 0 BetSize := 0 ButtonOffset := -18*ButtonsOnLeft ; ==================== Return ; HOT KEYS ; ==================== ; Right Mouse Button ; -------------------- ~RButton:: BetPot() Return ; -------------------- ; Mouse Wheel Up ; -------------------- ~WheelUp:: ChangeBet(1) Return ; -------------------- ; Mouse Wheel Down ; -------------------- ~WheelDown:: ChangeBet(-1) Return ; -------------------- ; ==================== ; MAIN FUNCTIONS ; ==================== ; Bet Pot ; -------------------- ; Sets the betting box to a pot size bet. BetPot() { global Id := GetTableId() If (NOT Id) Return TableSize := GetTableSize(Id) If (NOT TableSize) Return If (WhiteBetBox AND NOT WhiteBetBoxVisible()) Return PotTextColor := GetPotTextColor() PotLocationFound := GetPotLocation() If (NOT PotLocationFound) Return PotSize := GetPotSize() If (NOT PotSize) Return CallTextColor := GetCallTextColor() CallLocationFound := GetCallLocation() If (CallLocationFound) CallSize := GetCallSize() Else CallSize := 0 BetSize := FormatBet(PotSize + 2*CallSize) SaveMousePos() SetBet(BetSize) RestoreMousePos() } ; -------------------- ; Change Bet ; -------------------- ; Changes the bet by the parameter unit multiplied ; by WheelUnit, as specified at the top of the script ChangeBet(unit) { global Id := GetTableId() If (NOT Id) Return TableSize := GetTableSize(Id) If (NOT TableSize) Return If (WhiteBetBox AND NOT WhiteBetBoxVisible()) Return RaiseTextColor := GetRaiseTextColor() RaiseLocationFound := GetRaiseLocation() If (NOT RaiseLocationFound) Return RaiseSize := GetRaiseSize() If (NOT RaiseSize) Return If WheelUnit Is Number { BetSize := FormatBet(RaiseSize + unit*WheelUnit) } Else { Blind := GetBlind(Id,WheelUnit) BetSize := FormatBet(RaiseSize + unit*Blind) } SaveMousePos() SetBet(BetSize) RestoreMousePos() } ; -------------------- ; ==================== ; HELP FUNCTIONS ; ==================== ; Get Table Id ; -------------------- ; Returns the unique ID number of the window under ; the mouse if it is a iPoker table. If it is not ; the return value is zero. GetTableId() { MouseGetPos, ,,id WinGet, id, ID, - ahk_id %id% ahk_class PTIODEVICE Return id } ; -------------------- ; Get Table Size ; -------------------- ; Returns the position and size of a iPoker table. ; The size can take on one of three values, 1 for ; a full view table, 2 for a mini view table and ; 0 if the table size could not be determined. ; The parameter is the unique ID number of a table- ; window. GetTableSize(id) { global Vx,Vy,Sb,Sc WinGetPos, Vx,Vy,Width,Height, ahk_id %id% Vx += Sb Vy += Sb+Sc Width -= (2*Sb) Height -= (2*Sb+Sc) If Width Between 798 And 802 If Height Between 598 And 602 Return 1 If Width Between 510 And 514 If Height Between 322 And 326 Return 2 Return 0 } ; -------------------- ; White Bet Box Visible ; -------------------- ; Self-explanatory. ; Returns True if a White Betting Box is visible, ; otherwise it returns False. WhiteBetBoxVisible() { global TableSize,Vx,Vy If (TableSize = 1) { PixelSearch, ,,Vx+557,Vy+462,Vx+601,Vy+472, 0xFFFFFF, 0, RGB If (ErrorLevel = 0) Return True Else Return False } If (TableSize = 2) { PixelSearch, ,,Vx+401,Vy+266,Vx+436,Vy+272, 0xFFFFFF, 0, RGB If (ErrorLevel = 0) Return True Else Return False } Return False } ; -------------------- ; Get Pot Text Color ; -------------------- ; Self-explanatory. GetPotTextColor() { global If (TableSize = 1) { Return % GetOddColor(Vx+359,Vy+131,40,8) } If (TableSize = 2) { Return % GetOddColor(Vx+51,Vy+28,24,12) } Return 0 } ; -------------------- ; Get Call Text Color ; -------------------- ; Self-explanatory. GetCallTextColor() { global If (TableSize = 1) { Return % GetOddColor(Vx+414+ButtonOffset,Vy+513,24,12) } If (TableSize = 2) { Return % GetOddColor(Vx+296,Vy+293,24,12) } Return 0 } ; -------------------- ; Get Raise Text Color ; -------------------- ; Self-explanatory. GetRaiseTextColor() { global If (TableSize = 1) { Return % GetOddColor(Vx+541+ButtonOffset,Vy+513,24,12) } If (TableSize = 2) { Return % GetOddColor(Vx+386,Vy+293,24,10) } Return 0 } ; -------------------- ; Get Pot Size ; -------------------- ; Self-explanatory. GetPotSize() { global Px,Py,Pw,Ph,PotTextColor If (Ph = 10) { GetTextMatrix("st",Px,Py,Pw,Ph,PotTextColor) Return % ParseSmallTextMatrix() } Return 0 } ; -------------------- ; Get Call Size ; -------------------- ; Self-explanatory. GetCallSize() { global Cx,Cy,Cw,Ch,CallTextColor If (Ch = 11) { GetTextMatrix("lt",Cx,Cy,Cw,Ch,CallTextColor) Return % ParseLargeTextMatrix() } Else If (Ch = 10) { GetTextMatrix("st",Cx,Cy,Cw,Ch,CallTextColor) Return % ParseSmallTextMatrix() } Return 0 } ; -------------------- ; Get Raise Size ; -------------------- ; Self-explanatory. GetRaiseSize() { global Rx,Ry,Rw,Rh,RaiseTextColor If (Rh = 11) { GetTextMatrix("lt",Rx,Ry,Rw,Rh,RaiseTextColor) Return % ParseLargeTextMatrix() } Else If (Rh = 10) { GetTextMatrix("st",Rx,Ry,Rw,Rh,RaiseTextColor) Return % ParseSmallTextMatrix() } Return 0 } ; -------------------- ; Get Blind ; -------------------- ; Returns the big or small blind. ; The type parameter can be "bb" or "sb". GetBlind(id,type) { WinGetTitle, title, ahk_id %id% If InStr(title, "/$") { StringGetPos, s1, title, $ StringGetPos, s2, title, $,, s1+1 StringGetPos, s3, title, %A_Space%,, s2 If (s3 = -1) { StringLen, s3, title } StringMid, sb, title, s1+2,s2-s1-2 StringMid, bb, title, s2+2,s3-s2-1 } Else { StringLen, len, title StringGetPos, s1, title, / StringGetPos, s2, title, %A_Space%, R, len-s1 StringGetPos, s3, title, %A_Space%,, s1 If (s3 = -1) { s3 := len } StringMid, sb, title, s2+2,s1-s2-1 StringMid, bb, title, s1+2,s3-s1-1 } StringReplace, sb, sb, `,, StringReplace, bb, bb, `,, val := %type% If val Is Not Number Return 0 Return val } ; -------------------- ; Format Bet ; -------------------- ; Returns 0 if the parameter is less than 0, ; otherwise it formats the input so that it has ; 2 decimals if it is a floating point. ; Integers are not altered. FormatBet(bet) { If (bet < 0) Return 0 If bet Is Float { OldFormat := A_FormatFloat SetFormat, Float, 0.2 bet += 0.0 SetFormat, Float, %OldFormat% } Return bet } ; -------------------- ; Set Bet ; -------------------- ; Sets the betting box at the iPoker table ; to be the specified parameter. SetBet(bet) { global TableSize,Vx,Vy,ButtonOffset If (TableSize = 1) MouseMove, Vx+597+ButtonOffset,Vy+472 Else If (TableSize = 2) MouseMove, Vx+432,Vy+270 Else Return Click, Left 2 Send, %bet% } ; -------------------- ; Save Mouse Position ; -------------------- SaveMousePos() { global MouseX,MouseY MouseGetPos, MouseX,MouseY } ; -------------------- ; Restore Mouse Position ; -------------------- RestoreMousePos() { global MouseX,MouseY MouseMove, MouseX,MouseY } ; -------------------- ; ==================== ; COLOR & PIXEL FUNCTIONS ; ==================== ; Here follows a more detailed explanation of how this script works. I have chosen to write ; this section mostly because I am more interested in the technical aspects of this script ; than its functionality. Also, if someone out there tries to modify this script it will ; be a lot easier if I provide comments here. ; ; Basically what this script does is read the color of each pixel in a specific area and ; match the result to a known color, thus extracting only wanted pixels. ; These pixels can then be matched to a known pattern to produce numbers. ; ; STEP 1: ; Identify the color of the text. ; This is done by the help of the GetOddColor-method. What this method does is extract ; the color in a specified area, which differs the MOST from the average color in that ; area. If the area only consist of 2 colors it will yield the one with the least amount ; of pixels. ; ; STEP 2: ; Locate the pot-, call- and/or raise-text on screen. ; Here we use the GetColorBounds-method. This method gives us the bounding rectangle of ; a specific color within a specific area. In other words, it gives us the smallest ; possible rectangle that contains ALL the pixels of the input-color within the input-area. ; ; STEP 3: ; Retrieve the pot/call/raise text ; This is done in two steps: ; Step 3.A) Read the pixel color of every pixel within the area from Step 2. ; Getting the pixel information is a piece of cake. Storing it in a way that makes sense ; is somewhat harder. What I have chosen to do is to store each pixel that corresponds to ; my text color as a 1 and each pixel that doesn't as a 0. ; I store the information in a numbered variable for each pixel column in the area. ; This variable is made to 0 before start and then I use bitwise-or to change the ; corresponding bit in the variable to a 1. ; The method GetTextMatrix is used for this step. ; Step 3.B) Transform this pixel information into numbers ; This is the step that probably makes the least sense when looking at the code, but once ; you know what bits are and how they are used it's pretty easy. ; From the last step we have all the information needed stored as arrays of 1's and 0's, ; but how? Well, the information is really not interpreted as an array of 1's and 0's, ; but instead as an integer. If you are familiar with computer arithmetic you know that! ; We can then simply figure out what value each column must take to match a certain number ; and Tada!, we have our number! ; Let's take the number 4 as an example: ; Here is how it is stored in step 3.A (assuming Tahoma 11pts): ; Column 1: 00011000 ; Column 2: 00101000 ; Column 3: 01001000 ; Column 4: 11111111 ; Column 5: 00001000 ; If this makes no sense, let's turn it, flip it and change the 1's and 0's to something pretty: ; Column: 54321 ; ---M- ; --MM- ; -M-M- ; M--M- ; MMMMM ; ---M- ; ---M- ; It's a freaking four!! ; If we now go back to the columns we note that each column is a binary number. Some simple ; binary arithmetic gives us: ; 00011000 = 24, ; 00101000 = 40, ; 01001000 = 72, ; 11111111 = 255, ; 00001000 = 8 ; And these are the numbers we use to match the columns in the ParseSmallText. ; The ParseLargeText-method works exactly the same, but for use with Tahoma, 12pts bold. ; GetOddColor(X,Y,Width,Height) { odd_color := 0 colors := "" reds := 0x0 greens := 0x0 blues := 0x0 count := 0 Loop, %Width% { sx := X+A_Index-1 Loop, %Height% { sy := Y+A_Index-1 PixelGetColor, px_color, sx,sy, RGB If (NOT InStr(colors,px_color)) { px_r := SubStr(px_color, 1, 4) px_g := "0x" . SubStr(px_color, 5, 2) px_b := "0x" . SubStr(px_color, 7, 2) reds += px_r greens += px_g blues += px_b colors := colors . "`n" . px_color count++ } c%px_color%++ } } red_avg := reds / count green_avg := greens / count blue_avg := blues / count StringTrimLeft, colors, colors, 1 If (StrLen(colors) < 20) { min_px_count := 99999 Loop, Parse, colors, `n { If (A_LoopField != "") { If (c%A_LoopField% < min_px_count) { min_px_count := c%A_LoopField% odd_color := A_LoopField } } } Return odd_color } max_variation := 0 Loop, Parse, colors, `n { If (A_LoopField != "") { px_r := SubStr(A_LoopField, 1, 4) px_g := "0x" . SubStr(A_LoopField, 5, 2) px_b := "0x" . SubStr(A_LoopField, 7, 2) SetFormat, Integer, D px_r += 0 px_g += 0 px_b += 0 red_var := Sqrt( (red_avg - px_r)**2 ) green_var := Sqrt( (green_avg - px_r)**2 ) blue_var := Sqrt( (blue_avg - px_r)**2 ) variation := (red_var + green_var + blue_var) / 3 If (variation > max_variation) { max_variation := variation odd_color := A_LoopField } c%A_LoopField% := 0 } } Return odd_color } ; -------------------- ; Get Pot Location ; -------------------- ; Returns the boundaries for the rectangle ; around the Pot size-text GetPotLocation() { global TableSize,Vx,Vy,PotTextColor,Px,Py,Pw,Ph If (TableSize = 1) { PotFound := GetColorBounds("P",Vx+403,Vy+127,90,16,PotTextColo r) If (NOT PotFound) Return False Pw++ If (Ph = 11) Ph-- Else If (Ph = 10) Py-- Else If (Ph = 9) Ph++ Else If (Ph = 8) { Ph += 2 Py-- } Else Return False Return True } If (TableSize = 2) { PotFound := GetColorBounds("P",Vx+45,Vy+28,58,12,PotTextColor) If (NOT PotFound) Return False Pw++ If (Ph = 11) Ph-- Else If (Ph = 10) Py-- Else If (Ph = 9) Ph++ Else If (Ph = 8) { Ph += 2 Py-- } Else { Px := 0 Py := 0 Pw := 0 Ph := 0 Return False } Return True } Return False } ; -------------------- ; Get Call Location ; -------------------- ; Returns the boundaries for the rectangle ; around the Call size-text GetCallLocation() { global TableSize,Vx,Vy,ButtonOffset,CallTextColor,Cx,Cy,C w,Ch If (TableSize = 1) { CallFound := GetColorBounds("C",Vx+386+ButtonOffset,Vy+510,80,1 8,CallTextColor) If (NOT CallFound) Return False Cx-- Cw += 2 If (Ch = 13) { Cy++ Ch -= 2 } Else If (Ch = 12 OR Ch = 11) { Ch-- } Else If (Ch = 9 OR Ch = 8) { Cy-- Ch += 2 } Else { Cx := 0 Cy := 0 Cw := 0 Ch := 0 Return False } Return True } If (TableSize = 2) { CallFound := GetColorBounds("C",Vx+270,Vy+292,77,18,CallTextCol or) If (NOT CallFound) Return False Cx-- Cw += 2 If (Ch = 11) Ch-- Else If (Ch = 10) Cy-- Else If (Ch = 9) Ch++ Else If (Ch = 8) { Ch += 2 Cy-- } Else { Cx := 0 Cy := 0 Cw := 0 Ch := 0 Return False } Return True } Return False } ; -------------------- ; Get Raise Location ; -------------------- ; Returns the boundaries for the rectangle ; around the Raise size-text GetRaiseLocation() { global TableSize,Vx,Vy,ButtonOffset,RaiseTextColor,Rx,Ry, Rw,Rh If (TableSize = 1) { RaiseFound := GetColorBounds("R",Vx+513+ButtonOffset,Vy+510,80,1 8,RaiseTextColor) If (NOT RaiseFound) Return False Rx-- Rw += 2 If (Rh = 13) { Ry++ Rh -= 2 } Else If (Rh = 12 OR Rh = 11) { Rh-- } Else If (Rh = 9 OR Rh = 8) { Rh += 2 Ry-- } Else { Rx := 0 Ry := 0 Rw := 0 Rh := 0 Return False } Return True } If (TableSize = 2) { RaiseFound := GetColorBounds("R",Vx+360,Vy+292,77,12,RaiseTextCo lor) If (NOT RaiseFound) Return False Rx-- Rw += 2 If (Rh = 11) Rh-- Else If (Rh = 10) Ry-- Else If (Rh = 9) Rh++ Else If (Rh = 8) { Rh += 2 Ry-- } Else { Rx := 0 Ry := 0 Rw := 0 Rh := 0 Return False } Return True } Return False } ; -------------------- ; Get Color Bounds ; -------------------- ; Calculates the smallest possible rectangle ; that encloses all the pixels within the ; provided area of the provided color. ; The result is stored in variables with the ; provided prefix. GetColorBounds(prefix,X,Y,Width,Height,Color) { global local min_x,max_x,min_y,max_y,i min_x := 9999 max_x := 0 min_y := 9999 max_y := 0 Loop, %Width% { i := A_Index - 1 PixelSearch, ,, X+i,Y,X+i,Y+Height-1, %Color%, 0, RGB If (ErrorLevel = 0) { If (i < min_x) min_x := i If (i > max_x) max_x := i } } If (min_x >= max_x OR max_x = 9999) { %prefix%x := 0 %prefix%y := 0 %prefix%w := 0 %prefix%h := 0 Return False } %prefix%x := X + min_x %prefix%w := max_x - min_x + 1 Loop, %Height% { i := A_Index - 1 PixelSearch, ,, %prefix%x,Y+i,%prefix%x+%prefix%w,Y+i, %Color%, 0, RGB If (ErrorLevel = 0) { If (i < min_y) min_y := i If (i > max_y) max_y := i } } If (min_y >= max_y OR max_y = 9999) { %prefix%x := 0 %prefix%y := 0 %prefix%w := 0 %prefix%h := 0 Return False } %prefix%y := Y + min_y %prefix%h := max_y - min_y + 1 Return True } ; -------------------- ; Get Text Matrix ; -------------------- ; Returns a matrix where each element is a 1 ; if the corresponding pixel in the provided ; area is the provided color. If it is not ; the element is 0. ; The result is stored in separate variables ; for each column of the matrix. ; The col-variable contains the number of ; columns and the sep-variable contains a string ; with each column number in the matrix that ; is only zeros. ; The variables begin with the provided prefix. GetTextMatrix(prefix,X,Y,Width,Height,Color) { global local col,i,j,px_color col := 0 %prefix%_sep := 0 Loop, %Width% { col++ %prefix%_col%col% := 0 i := A_Index - 1 Loop, %Height% { j := A_Index - 1 PixelGetColor, px_color, X+i,Y+j, RGB If (px_color = Color) { %prefix%_col%col% := %prefix%_col%col% | 2**(Height-j-1) } } If (%prefix%_col%col% = 0) { %prefix%_sep := %prefix%_sep . "`n" . col } } %prefix%_col := col } ; -------------------- ; Parse Small Text Matrix ; -------------------- ; Parses a text matrix with pixel information. ; The font is Tahoma, 11 pts. ParseSmallTextMatrix() { global local number,this,next,a,b,c,d,e number := "" StringSplit, st_sep, st_sep, `n If (st_sep0 > 1) { Loop, %st_sep0% { If (A_Index = %st_sep0%) Break this := st_sep%A_Index% next := A_Index + 1 next := st_sep%next% If (this = next) Continue If (this + 2 = next) { a := this + 1 a := st_col%a% If (a = 6) number := number . "." } If (this + 4 = next) { a := this + 1 a := st_col%a% >> 1 b := this + 2 b := st_col%b% >> 1 c := this + 3 c := st_col%c% >> 1 If (a = 65 AND b = 255 AND c = 1) number := number . "1" } If (this + 6 = next) { a := this + 1 a := st_col%a% >> 1 b := this + 2 b := st_col%b% >> 1 c := this + 3 c := st_col%c% >> 1 d := this + 4 d := st_col%d% >> 1 e := this + 5 e := st_col%e% >> 1 If (a = 67 AND b = 133 AND c = 137 AND d = 145 AND e = 97) number := number . "2" If (a = 66 AND b = 129 AND c = 145 AND d = 145 AND e = 110) number := number . "3" If (a = 24 AND b = 40 AND c = 72 AND d = 255 AND e = 8) number := number . "4" If (a = 242 AND b = 145 AND c = 145 AND d = 145 AND e = 142) number := number . "5" If (a = 62 AND b = 81 AND c = 145 AND d = 145 AND e = 14) number := number . "6" If (a = 128 AND b = 131 AND c = 140 AND d = 176 AND e = 192) number := number . "7" If (a = 110 AND b = 145 AND c = 145 AND d = 145 AND e = 110) number := number . "8" If (a = 112 AND b = 137 AND c = 137 AND d = 138 AND e = 124) number := number . "9" If (a = 126 AND b = 129 AND c = 129 AND d = 129 AND e = 126) number := number . "0" } } } Loop, %st_col% { st_col%A_Index% := 0 } If number is Number Return number Return 0 } ; -------------------- ; Parse Large Text Matrix ; -------------------- ; Parses a text matrix with pixel information. ; The font is Tahoma, 12 pts bold. Although ; the digit 2 is missing 1 pixel. Don't ask me ; why. ParseLargeTextMatrix() { global local number,this,next,a,b,c,d,e,f,g number := "" StringSplit, lt_sep, lt_sep, `n If (lt_sep0 > 1) { Loop, %lt_sep0% { If (A_Index = %lt_sep0%) Break this := lt_sep%A_Index% next := A_Index + 1 next := lt_sep%next% If (this = next) Continue If (this + 3 = next) { a := this + 1 a := lt_col%a% b := this + 2 b := lt_col%b% If (a = 6 AND b = 6) number := number . "." } If (this + 7 = next) { a := this + 1 a := lt_col%a% >> 1 b := this + 2 b := lt_col%b% >> 1 c := this + 3 c := lt_col%c% >> 1 d := this + 4 d := lt_col%d% >> 1 e := this + 5 e := lt_col%e% >> 1 f := this + 6 f := lt_col%f% >> 1 If (a = 129 AND b = 129 AND c = 511 AND d = 511 AND e = 1 AND f = 1) number := number . "1" } If (this + 8 = next) { a := this + 1 a := lt_col%a% >> 1 b := this + 2 b := lt_col%b% >> 1 c := this + 3 c := lt_col%c% >> 1 d := this + 4 d := lt_col%d% >> 1 e := this + 5 e := lt_col%e% >> 1 f := this + 6 f := lt_col%f% >> 1 g := this + 7 g := lt_col%g% >> 1 If (a = 193 AND b = 259 AND c = 263 AND d = 269 AND e = 281 AND f = 497 AND g = 225) number := number . "2" If (a = 130 AND b = 257 AND c = 273 AND d = 273 AND e = 273 AND f = 511 AND g = 238) number := number . "3" If (a = 24 AND b = 40 AND c = 72 AND d = 136 AND e = 511 AND f = 511 AND g = 8) number := number . "4" If (a = 2 AND b = 481 AND c = 481 AND d = 289 AND e = 289 AND f = 319 AND g = 286) number := number . "5" If (a = 126 AND b = 255 AND c = 417 AND d = 289 AND e = 289 AND f = 319 AND g = 30) number := number . "6" If (a = 256 AND b = 256 AND c = 263 AND d = 287 AND e = 376 AND f = 480 AND g = 384) number := number . "7" If (a = 238 AND b = 511 AND c = 273 AND d = 273 AND e = 273 AND f = 511 AND g = 238) number := number . "8" If (a = 240 AND b = 505 AND c = 265 AND d = 265 AND e = 267 AND f = 510 AND g = 252) number := number . "9" If (a = 254 AND b = 511 AND c = 257 AND d = 257 AND e = 257 AND f = 511 AND g = 254) number := number . "0" } } } Loop, %lt_col% { lt_col%A_Index% := 0 } If number is Number Return number Return 0 } ; -------------------- ; ==================== ; END OF SCRIPT ; ==================== |
|
|