library Hand requires Card function I2Hand takes integer i returns string if i == 0 then return "high card" elseif i == 1 then return "pair" elseif i == 2 then return "two pair" elseif i == 3 then return "three of a kind" elseif i == 4 then return "straight" elseif i == 5 then return "flush" elseif i == 6 then return "full house" elseif i == 7 then return "four of a kind" elseif i == 8 then return "straight flush" elseif i == 9 then return "royal flush" else return "error" endif endfunction struct hand card array c [5] method toString takes nothing returns string local string s = "" local integer i = 0 loop set s = s + .c[i].toString() + ", " exitwhen i == 4 set i = i + 1 endloop return SubString(s, 0, StringLength(s)-2) endmethod method isFlush takes nothing returns boolean local integer i = 1 local integer s = .c[0].s loop if .c[i].s != s then return false endif exitwhen i == 4 set i = i + 1 endloop return true endmethod method isPair takes nothing returns boolean local integer x = 0 local integer y loop set y = 0 loop if .c[x].v == .c[y].v and x != y then return true endif exitwhen y == 4 set y = y + 1 endloop exitwhen x == 4 set x = x + 1 endloop return false endmethod method isTwoPair takes nothing returns boolean local integer x = 0 local integer y local integer c = 0 local integer v = -1 loop set y = 0 loop if .c[x].v == .c[y].v and x != y and .c[x].v != v then set c = c + 1 if c == 2 then return true endif set v = .c[x].v endif exitwhen y == 4 set y = y + 1 endloop exitwhen x == 4 set x = x + 1 endloop return false endmethod method isThreeOfAKind takes nothing returns boolean local integer v = 0 local integer i local integer c loop set i = 0 set c = 0 loop if .c[i].v == v then set c = c + 1 if c == 3 then return true endif endif exitwhen i == 4 set i = i + 1 endloop exitwhen v == 12 set v = v + 1 endloop return false endmethod method isFourOfAKind takes nothing returns boolean local integer v = 0 local integer i local integer c loop set i = 0 set c = 0 loop if .c[i].v == v then set c = c + 1 if c == 4 then return true endif endif exitwhen i == 4 set i = i + 1 endloop exitwhen v == 12 set v = v + 1 endloop return false endmethod method isFullHouse takes nothing returns boolean return .isThreeOfAKind() and .isTwoPair() endmethod method isStraight takes nothing returns boolean local integer array v local integer i = 0 local integer j local integer t loop set v[i] = .c[i].v if v[i] == 0 then set v[i] = 13 endif exitwhen i == 4 set i = i + 1 endloop set i = 1 loop set j = i loop exitwhen j == 0 if v[j] < v[j] then set t = v[j] set v[j] = v[j-1] set v[j-1] = t endif set j = j - 1 endloop exitwhen i == 4 set i = i + 1 endloop set i = 0 loop if v[i] != v[i+1]-1 then return false endif exitwhen i == 3 set i = i + 1 endloop return true endmethod method isStraightFlush takes nothing returns boolean return .isStraight() and .isFlush() endmethod method isRoyalFlush takes nothing returns boolean local integer array v local integer i = 0 local integer j local integer t // Copy hand and check for flush loop if .c[i].s != .c[0].s then return false endif set v[i] = .c[i].v if v[i] == 0 then set v[i] = 13 endif exitwhen i == 4 set i = i + 1 endloop // Sort hand lowest to highest set i = 1 loop set j = i loop exitwhen j == 0 if v[j] < v[j] then set t = v[j] set v[j] = v[j-1] set v[j-1] = t endif set j = j - 1 endloop exitwhen i == 4 set i = i + 1 endloop // Check lowest card is a 10 if v[0] != 9 then return false endif // Check for straight set i = 0 loop if v[i] != v[i+1]-1 then return false endif exitwhen i == 3 set i = i + 1 endloop return true endmethod method getRank takes nothing returns integer if .isRoyalFlush() then return 9 elseif .isStraightFlush() then return 8 elseif .isFourOfAKind() then return 7 elseif .isFullHouse() then return 6 elseif .isFlush() then return 5 elseif .isStraight() then return 4 elseif .isThreeOfAKind() then return 3 elseif .isTwoPair() then return 2 elseif .isPair() then return 1 else return 0 endif endmethod endstruct endlibrary