#include <ComboConstants.au3>
#include <SliderConstants.au3>
#include <String.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <Sound.au3>
#include <Array.au3>

TCPStartup()

Global $PORTLobby = 666, $PORTSeat0 = 660, $PORTSeat1 = 661, $PORTSeat2 = 662, $PORTSeat3 = 663, $PORTSeat4 = 664
global $Socket0 = TCPListen(@IPAddress1, $PORTSeat0), $Socket1 = TCPListen(@IPAddress1, $PORTSeat1), $Socket2 = TCPListen(@IPAddress1, $PORTSeat2), $Socket3 = TCPListen(@IPAddress1, $PORTSeat3), $Socket4 = TCPListen(@IPAddress1, $PORTSeat4), $SocketLobby = TCPListen(@IPAddress1, $PORTLobby)
Global $sTitle = 'Server'
Global $aWinnings[10] = ['Hi Card', 'One Pair', 'Two Pair', 'Three Of A Kind', 'Straight', 'Flush', 'Full House', 'Four Of A Kind', 'Straight Flush', 'Royal Flush']
Global $aSuit[4] = ['d', 'h', 's', 'c'], $aDeck[52], $aCopyDeck, $iDeckCount = 51, $iDealCount = 0
Global $iplayerNR, $aFlop[3], $turn, $river, $aSeat[5] = ["None","None","None","None","None"], $iButton = 0, $aHolecards

For $i = 0 To 3
	For $j = 0 To 12
		$aDeck[$i * 13 + $j] = $aSuit[$i] & $j + 1
	Next
Next

while 1
	while _getDealtIn() > 1
			$iPlayerNR = _getDealtIn ()
			_newgame($iPlayerNR)
	WEnd
	Sleep(25)
WEnd

#region Adlibs + TCP
AdlibRegister("_TCPSeat0")
AdlibRegister("_TCPSeat1")
AdlibRegister("_TCPSeat2")
AdlibRegister("_TCPSeat3")
AdlibRegister("_TCPSeat4")

func _tcpSeat0()
	Switch $aSeat[0]
	case string("None")
		Local $ConnectedSocket
		Do
			$ConnectedSocket = TCPAccept($Socket0)
		Until $ConnectedSocket <> -1
		local $ClientIP = SocketToIP($ConnectedSocket)
		$aSeat[0] = $ClientIP
	case Else
		$recv = TCPRecv( $ConnectedSocket, 2048 )
		If @error Then 
			$aSeat[0] = "None"
		Else
			_TCPTranslate($recv)
		EndIf
	EndSwitch
EndFunc

func _tcpSeat1()
	Switch $aSeat[1]
	case string("None")
		Local $ConnectedSocket
		Do
			$ConnectedSocket = TCPAccept($Socket)
		Until $ConnectedSocket <> -1
		local $ClientIP = SocketToIP($ConnectedSocket)
		$aSeat[1] = $ClientIP
	case Else
		$recv = TCPRecv( $ConnectedSocket, 2048 )
		If @error Then 
			$aSeat[1] = "None"
		Else
			_TCPTranslate($recv)
		EndIf
	EndSwitch	
EndFunc

func _tcpSeat2()
	Switch $aSeat[2]
	case string("None")
		Local $ConnectedSocket
		Do
			$ConnectedSocket = TCPAccept($Socket)
		Until $ConnectedSocket <> -1
		local $ClientIP = SocketToIP($ConnectedSocket)
		$aSeat[2] = $ClientIP
	case Else
		$recv = TCPRecv( $ConnectedSocket, 2048 )
		If @error Then 
			$aSeat[2] = "None"
		Else
			_TCPTranslate($recv)
		EndIf
	EndSwitch	
EndFunc

func _tcpSeat3()
	Switch $aSeat[3]
	case string("None")
		Local $ConnectedSocket
		Do
			$ConnectedSocket = TCPAccept($Socket)
		Until $ConnectedSocket <> -1
		local $ClientIP = SocketToIP($ConnectedSocket)
		$aSeat[3] = $ClientIP
	case Else
		$recv = TCPRecv( $ConnectedSocket, 2048 )
		If @error Then 
			$aSeat[3] = "None"
		Else
			_TCPTranslate($recv)
		EndIf
	EndSwitch
EndFunc

func _tcpSeat4()
	Switch $aSeat[4]
	case string("None")
		Local $ConnectedSocket
		Do
			$ConnectedSocket = TCPAccept($Socket)
		Until $ConnectedSocket <> -1
		local $ClientIP = SocketToIP($ConnectedSocket)
		$aSeat[4] = $ClientIP
	case Else
		$recv = TCPRecv( $ConnectedSocket, 2048 )
		If @error Then 
			$aSeat[4] = "None"
		Else
			_TCPTranslate($recv)
		EndIf
	EndSwitch	
EndFunc

Func SocketToIP($SHOCKET)
    Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

    Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
            "ptr",DLLStructGetPtr($sockaddr),"int_ptr",DLLStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0

    Return $aRet
EndFunc

func _TCPTranslate ($sMsg)
	ConsoleWrite($sMsg)
EndFunc
#endregion

func _newGame ($PlayerNr)
	$aCopyDeck = $aDeck
	$iPlayerNr = $PlayerNr
	global $aHolecards[5][2]
	$aHolecards = _dealHolecards ()
	$aflop = _dealFlop()
	$turn = _dealturn()
	$river = _dealriver()
	$iWinner = _Sd_getWinner ()
	ConsoleWrite($iPlayerNr&" Spieler waren in die Hand gedealt."&@LF&"Holecards: "&$aHolecards[0][0]&","&$aHolecards[0][1]& _ 
	" - "&$aHolecards[1][0]&","&$aHolecards[1][1]&" - "&$aHolecards[2][0]&","&$aHolecards[2][1]&" - "&$aHolecards[3][0]&","&$aHolecards[3][1]&" - "&$aHolecards[4][0]&","&$aHolecards[4][1]&@LF)
	ConsoleWrite(@LF&"Flop was:"&@TAB&"Turn:"&@TAB&"River:"&@LF&$aFlop[0]&" "&$aFlop[1]&" "&$aFlop[2]&@TAB&$turn&@TAB&$river&@lf)
	ConsoleWrite("Winner is Seat #"&$iWinner&@LF)

EndFunc

func _getDealtIn () ;return Anz aktiver Seats (aus $aSeat)
	local $iCount = 0
	for $i = 0 to 4
		Switch $aSeat[$i]
		case String("None")
			sleep(10)
		case Else
			$iCount += 1
		EndSwitch
	Next
	return $iCount
EndFunc

#region Showdown funktionen
func _Sd_GetHand ($iplayer)
local $tCards [7]
$tCards[0] = $aFlop[0]
$tCards[1] = $aFlop[1]
$tCards[2] = $aFlop[2]
$tCards[3] = $turn
$tCards[4] = $river
$tCards[5] = $aHolecards[$iplayer][0]
$tCards[6] = $aHolecards[$iplayer][1]
$tCards = _sortCards($tCards)
$tCards = _ArrayCombinations($tCards,5)
local $aReturn
$aReturn = _RoyalFlush($tCards)
if $aReturn = 9 Then return $aReturn
$aReturn = _straightFlush($tCards)
if IsArray($aReturn) Then return $aReturn
$aReturn = _fourofakind($tCards) 
if IsArray($aReturn) Then return $aReturn
$aReturn = _fullhouse($tCards) 
if IsArray($aReturn) Then return $aReturn
$aReturn =  _flush($tCards) 
if IsArray($aReturn) Then return $aReturn
$aReturn = _Straight($tCards) 
if IsArray($aReturn) Then return $aReturn
$aReturn = _threeofakind($tCards)
if IsArray($aReturn) Then return $aReturn
$aReturn = _twopair($tCards)
if IsArray($aReturn) Then return $aReturn
$aReturn = _pair($tCards)
if IsArray($aReturn) Then return $aReturn
$aReturn = _HiCards($tCards)
if IsArray($aReturn) then return $aReturn
EndFunc

func _Sd_getWinner ()	;returns zerobased seat number of winner as integer (splitpot -> array where $a[0] is number of winners and $a[n] is last winner)
 local $aCheck[5][2], $aSearch, $aReturn[1] = ["0"]
    for $i = 0 to 4
		if $aSeat[$i] <> string("None") And $aSeat[$i] <> string("Wait") then ;wenn Holecards gedealt wurden	
			$aTmp = _sd_getHand($i)              ;returnwert ist ein eindimensionaler array mit den kartenwerten (siehe oben)
			$aCheck[$i][0] = $i
			for $j = 0 to UBound($aTmp) -1
				$aCheck[$i][1] &= $aTmp[$j]& ","        ;aCheck[n][m] -> n = spielerID,[m] = hand
			Next
		EndIf
    Next
	$aCheck = _arraySetAceValue($aCheck)
	_ArraySort($aCheck,1,0,0,1)
	
	$iReturn = $aCheck[0][0]
	return $iReturn
EndFunc

func _arraySetAceValue($aArray)
	local $aReturn = $aArray
	for $h = 0 to 4
		local $sCheck = $aArray[$h][1]
		local $aTmp = StringSplit($sCheck,",",2)
		for $i = UBound($aTmp)-1 to 1 step -1
			if $aTmp[$i] = 1 Then
				$aTmp[$i] = 14
			EndIf
		if StringLen($aTmp[$i]) = 1 Then
			$aTmp[$i] = 0&$aTmp[$i]
		EndIf	
		Next
		$sCheck = _ArrayToString($aTmp,",")
		$aReturn[$h][1] = String($sCheck)
	Next
	return $aReturn	
EndFunc
#endregion

#region Deal

func _dealHolecards ()		;return playerNR
	For $i = 0 to UBound($aSeat) -1
		if $aSeat[$i] <> string("None") then
			$aHoleCards[$i][0] = _dealCard ()
			$aHolecards[$i][1] = _dealCard ()
		Else
			$aHolecards[$i][0] = string("None")
		EndIf
	Next
	return $aHolecards
EndFunc

func _dealCard ()
	local $tRand = random(0,$ideckcount,1)
	local $iCard = $aCopyDeck[$tRand]
	$aCopyDeck[$tRand] = $acopyDeck[$ideckCount]
	$iDeckCount -= 1
	return $iCard
EndFunc

func _dealFlop ()	;return array werte flop (0 - 2)
	for $i = 0 to 2
		$aFlop[$i] = _dealCard()
	Next
	return $aFlop
EndFunc

func _dealTurn ()	;return wert turnkarte
	local $tTurn = _dealCard ()
	return $tTurn
EndFunc

func _dealRiver ()	;return wert riverkarte
	local $tRiver = _dealCard()
	return $tRiver
EndFunc

Func _SortCards($aCards)
	Local $tmp
	For $i = 0 To UBound($aCards) - 2
		For $j = $i + 1 To UBound($aCards) - 1
			If int(StringMid($aCards[$j], 2)) < int(StringMid($aCards[$i], 2)) Then
				$tmp = $aCards[$i]
				$aCards[$i] = $aCards[$j]
				$aCards[$j] = $tmp
			EndIf
		Next
	Next
	Return $aCards
EndFunc   ;==>_SortCards
#endregion

#region Showdown Hände

Func _RoyalFlush($aCards)		;return 9
	for $i = 1 to $aCards[0]					
		$sCards = $aCards[$i]						;jeder string wird überprüft
		if $sCards = String("c1c10c11c12c13") Or $sCards = String("s1s10s11s12s13") Or $sCards = String("h1h10h11h12h13") Or $sCards = String("d1d10d11d12d13") then 
			return 9
		EndIf
	Next
EndFunc   ;==>_RoyalFlush

Func _StraightFlush($aCards)		;return 8, wert höchste Karte
	For $i = 1 to $aCards[0]
		Local $sCards = $aCards[$i]
		
		local $aTmp= StringSplit($sCards,"cshd",2)
		local $iCount = 1
		For $j = UBound($aTmp) - 1 to 2 step -1
			if Number($aTmp[$j]) = (Number($aTmp[$j-1]) + 1)  Then	;wenn die jeweils verherigeKarte 1 kleiner ist dann $iCount += 1
				$iCount += 1
			EndIf
		Next
		if $iCount = 5 Then		
			local $aColor = StringSplit($sCards,"0123456789",2)
			Local $iCount = 1
			local $sTmp = $aColor[0]
			For $k = 1 to UBound($aColor) - 1
				if $aColor[$k] = $sTmp Then
					$iCount += 1
				EndIf
			Next
			if $iCount = 5 then
				Local $iHi = $aTmp[UBound($aTmp)-1]
				Local $aReturn[2]
				$aReturn[0] = 8
				$aReturn[1] = $iHi
				return $aReturn
			EndIf
		EndIf
	Next
EndFunc   ;==>_StraightFlush

Func _Fourofakind($aCards)	;return 7,wert poker, wert hohe karte
	for $i = $aCards[0] to 1 step -1
		Local $sCards = $aCards[$i]
		Local $aTmp = StringSplit($sCards,"cshd",2)
		for $j = 1 to 2
			Local $iTmp = $aTmp[$j]
			Local $iCount = 1 
			for $k = $j + 1 to UBound($aTmp) - 1 
				if $aTmp[$k] = $iTmp Then
					$iCount += 1
				EndIf
			Next
			if $iCount = 4 then
				Local $sCheck = "",$aCheck,$iCheck
				For $l = 1 to $aCards[0]
					$sCheck &= $aCards[$l]
				Next
				$aCheck = StringSplit($sCheck,"csdh",2)
				$iCheck = _ArrayMax($aCheck,1)
				If _ArraySearch($aCheck,1) > - 1 Then
					$iCheck = 1
				EndIf
				If $iCheck = $iTmp Then
					$a = _ArrayFindAll($aCheck,$iTmp)
					for $m = 0 to UBound($a) - 1
						_ArrayDelete($aCheck,$a[$m])
					Next
					$iCheck = _ArrayMax($aCheck,1)
				EndIf
				Local $aReturn[3] 
				$aReturn[0] = 7
				$aReturn[1] = $iTmp
				$aReturn[2] = $iCheck
				return $aReturn
			EndIf
		Next
	Next
EndFunc   ;==>_Fourofakind

Func _FullHouse($aCards)	;return 6, wert trips, wert pair
	Local $iCount21, $iCount22,	$iCount1 = 1, $iCount2 = 0,$itmp21, $iTmp22, $iTmp1, $iTmp2
	
	for $i = $aCards[0] To 1 Step -1
		local $iTmp, $iTmp2
		Local $iSearch = 0,	$iCount1 = 1, $iCount2 = 0
		Local $iStart = 2
		Local $sCheck = $aCards[$i]
		Local $aTmp = StringSplit($sCheck,"csdh",2)
		$iTmp1 = $aTmp[1]
		for $j = 0 to 2
			$iSearch = _ArraySearch($aTmp,$iTmp1,$iStart)
			if $iSearch > 0 Then
				$iCount1 += 1
				$iStart = $iSearch + 1
			EndIf
		Next
		for $k = 1 to UBound($aTmp) -1
			if $aTmp[$k] <> $iTmp1 Then
				$iTmp2 = $aTmp[$k]
				$iStart = _ArraySearch($aTmp,$iTmp2)
				ExitLoop
			EndIf
		Next
		for $l = 0 to 2
			$iSearch = _ArraySearch($aTmp,$iTmp2,$iStart)
			if $iSearch > 0 Then
				$iCount2 += 1
				$iStart = $iSearch + 1
			EndIf
		Next
		if ($iCount1 = 3 AND $iCount2 = 2) Then $i = 0
		if ($iCount1 = 2 AND $iCount2 = 3) Then $i = 0
	Next
		
	For $m = 1 To $aCards[0]
		local $iTmp, $iTmp22, $iCount21 = 1, $iCount22 = 0
		Local $iStart = 2,$isearch = 0
		Local $sCheck = $aCards[$m]
		Local $aTmp = StringSplit($sCheck,"csdh",2)
		$iTmp21 = $aTmp[1]
		for $n = 0 to 2
			$iSearch = _ArraySearch($aTmp,$iTmp21,$iStart)
			if $iSearch > 0 Then
				$iCount21 += 1
				$iStart = $iSearch + 1
			EndIf
		Next
		for $o = 1 to UBound($aTmp) -1
			if $aTmp[$o] <> $iTmp21 Then
				$iTmp22 = $aTmp[$o]
				$iStart = _ArraySearch($aTmp,$iTmp22)
				ExitLoop
			EndIf
		Next
		for $p = 0 to 2
			$iSearch = _ArraySearch($aTmp,$iTmp22,$iStart)
			if $iSearch > 0 Then
				$iCount22 += 1
				$iStart = $iSearch + 1
			EndIf
		Next
		if ($iCount21 = 3 AND $iCount22 = 2) Then $m = $aCards[0] +1
		if ($iCount21 = 2 AND $iCount22 = 3) Then $m = $aCards[0] +1
	Next
	
	if ($iCount1 = 3 AND $iCount2 = 2) Then					;ass in wertigkeit anpassen

			if $iCount21 = 3 And $iTmp21 = 1 Then
				If $iTmp1 <> 1 then 
					$iTmp2 = $iTmp1
					$iTmp1 = 1
				EndIf
			ElseIf $iCount21 = 2 and $iTmp21 = 1 then
				$iTmp2 = 1
			EndIf
					
			Local $aReturn[3]
			$aReturn[0] = 6
			$aReturn[1]	= $iTmp1
			$aReturn[2] = $iTmp2
			return $aReturn
	ElseIf ($iCount1 = 2 AND $iCount2 = 3) then

			if $iCount21 = 3 And $iTmp21 = 1 Then
				If $iTmp2 <> 1 then 
					$iTmp1 = $iTmp2
					$iTmp2 = 1
				EndIf
			ElseIf $iCount21 = 2 and $iTmp21 = 1 then
				$iTmp1 = 1
			EndIf
			
			Local $aReturn[3]
			$aReturn[0] = 6
			$aReturn[1]	= $iTmp2
			$aReturn[2] = $iTmp1
			return $aReturn
	EndIf	
EndFunc   ;==>_FullHouse

Func _Flush($aCards)		;return 5, werte der karten
	for $i = $aCards[0] to 1 step -1	
		Local $sCards = $aCards[$i]
		local $aColor = StringSplit($sCards,"0123456789",2)
		Local $aTmp = StringSplit($sCards,"csdh",2)
		Local $iCount = 1
		local $sTmp = $aColor[0]
		For $j = 1 to UBound($aColor) - 1
			if $aColor[$j] = $sTmp Then
				$iCount += 1
			EndIf
		Next
		if $iCount = 5 then
			Local $aReturn[1]
			$aReturn[0] = 5
			
			if _ArraySearch($aTmp,1) > -1 Then 
				_ArrayAdd($aReturn,1)
				_ArrayDelete($aTmp,_ArraySearch($aTmp,1))
			EndIf
			
			for $k = UBound($aTmp) - 1 to 1 step -1
				_ArrayAdd($aReturn,$aTmp[$k])
			Next
			return $aReturn
		EndIf
	Next
endFunc   ;==>_Flush

Func _Straight($aCards)		;return 4, wert höchste karte (ace hi = 14 !!)
	Local $sCheck, $aCheck, $iCount = 1,$bAce = 0
	$sCheck = $aCards[1]
	$aCheck = StringSplit($sCheck,"csdh",2)
	$iSearch = _ArraySearch($aCheck,1)
	if $iSearch > -1 Then
		$bAce = 1
	EndIf
	for $i = $aCards[0] to 1 step -1
		$iCount = 1
		$sCheck = $aCards[$i]
		$aCheck = StringSplit($sCheck,"csdh",2)
		For $j = UBound($aCheck) - 1 to 2 step -1
			if Number($aCheck[$j]) = (Number($aCheck[$j-1]) + 1)  Then	;wenn die jeweils verherigeKarte 1 kleiner ist dann $iCount += 1
				$iCount += 1
			EndIf
		Next
		Local $aReturn[2]
		if ($iCount = 4 or $iCount = 5) and $aCheck[UBound($aCheck) -1] = 13 and $aCheck[UBound($aCheck) - 4] = 10 and $bAce = 1 Then
			$aReturn[0] = 4
			$aReturn[1] = 14
			Return $aReturn
		ElseIf $iCount = 5 Then
			$aReturn[0] = 4
			$aReturn[1] = $aCheck[UBound($aCheck)-1]
			Return $aReturn
		EndIf
	Next
EndFunc   ;==>_Straight

Func _Threeofakind($aCards)	;return 3,Wert Trips, Wert hohe karte 1, wert hohe karte 2
	Local $sCheck,$aCheck,$iCount = 1,$iCheck
	for $i = $aCards[0] to 1 step -1
		$sCheck = $aCards[$i]
		$aCheck = StringSplit($sCheck,"csdh",2)
		$iCount = 1
		for $j = 1 to 5
			$iCheck = $aCheck[$j]
			for $k = $j+1 to UBound($aCheck) -1
				if $aCheck[$k] = $iCheck Then
					$iCount +=1
				EndIf
				If $iCount = 4 Then
					for $l = 0 To 2
							_ArrayDelete($aCheck,_arraysearch($aCheck,$iCheck))
					Next					
					Local $aReturn[4]
					$aReturn[0] = 3
					$aReturn[1] = $iCheck
					$aReturn[2] = _ArrayPop($aCheck)
					$aReturn[3] = _ArrayPop($aCheck)
					
					$aCheck = StringSplit($aCards[1],"csdh",2)
					if _ArraySearch($aCheck,1) > -1 And $iCheck <> 1 Then
						$aReturn[3] = $aReturn[2]
						$aReturn[2] = 1
					EndIf
					Return $aReturn
				EndIf
			Next
		Next
	Next
EndFunc   ;==>_Three

Func _TwoPair($aCards)		;return 2, wert pair1, wert pair2, wert hi card
	For $i = $aCards[0] to 1 step -1
		Local $aCheck, $iCheck, $iHi, $iPair1, $iPair2
		$aCheck = StringSplit($aCards[$i],"csdh",2)
		$iTmp1 = _ArrayPop($aCheck)
		$iTmp2 = _ArrayPop($aCheck)
		$iTmp3 = _ArrayPop($aCheck)
		$iTmp4 = _ArrayPop($aCheck)
		$iTmp5 = _ArrayPop($aCheck)
		Local $aReturn[4]
		If $iTmp1 = $iTmp2 And $iTmp3 = $iTmp4 Then
			$aReturn[0] = 2
			$aReturn[1] = $iTmp1
			$aReturn[2] = $iTmp3
			$aReturn[3] = $iTmp5
		ElseIf $iTmp1 = $iTmp2 And $iTmp4 = $iTmp5 Then
			$aReturn[0] = 2
			$aReturn[1] = $iTmp1
			$aReturn[2] = $iTmp4
			$aReturn[3] = $iTmp3
		ElseIf $iTmp2 = $iTmp3 And $iTmp4 = $iTmp5 Then
			$aReturn[0] = 2
			$aReturn[1] = $iTmp2
			$aReturn[2] = $iTmp4
			$aReturn[3] = $iTmp1
		EndIf
		if $aReturn[0] = 2 Then
			$aCheck = StringSplit($aCards[1],"csdh",2)
			$aSearch = _ArrayFindAll($aCheck,1)
			If UBound($aSearch) - 1 > 0 Then
				$aReturn[2] = $aReturn[1]
				$aReturn[1] = 1
			ElseIf $aSearch <> -1 Then
				$aReturn[3] = 1
			EndIf
			return $aReturn
		EndIf
	Next
EndFunc   ;==>_TwoPair

Func _Pair($aCards)		;return 1,wert pair, wert hi card1, hi card2, hi card3
	local $aCheck = StringSplit($aCards[1],"csdh",2)
	if $aCheck[1] = $aCheck[2] And $aCheck[1] = 1 Then
		Local $aReturn[5]
		$aReturn[0] = 1
		$aReturn[1] = 1
		$aCheck = StringSplit($aCards[UBound($aCards)-1],"csdh",2)
		$aReturn[2] = _ArrayPop($aCheck)
		$aReturn[3] = _ArrayPop($aCheck)
		$aReturn[4] = _ArrayPop($aCheck)
		return $aReturn
	Else
		for $i = UBound($aCards) -1 to 1 step -1
			Local $sCards = $aCards[$i]
			Local $aTmp = StringSplit($sCards,"cshd",2)
			for $j = 1 to 4
				Local $iTmp = $aTmp[$j]
				Local $iCount = 1 
				for $k = $j + 1 to UBound($aTmp) - 1 
					if $aTmp[$k] = $iTmp Then
						$iCount += 1
					EndIf
				Next
				if $iCount = 2 then
					for $l = 0 to 1
					_ArrayDelete($aTmp,_arraysearch($aTmp,$iTmp))
					Next
					Local $aReturn[5] 
					$aReturn[0] = 1
					$aReturn[1] = $iTmp
					$aReturn[2] = _ArrayPop($aTmp)
					$aReturn[3] = _ArrayPop($aTmp)
					$aReturn[4] = _arraypop($aTmp)
					if _ArraySearch($aCheck,1) > -1 Then
						$aReturn[4] = $aReturn[3]
						$aReturn[3] = $aReturn[2]
						$aReturn[2] = 1
					EndIf
					Return $aReturn
				EndIf
			Next
		Next
	EndIf
	
EndFunc   ;==>_Pair

Func _HiCards($aCards)	;return 0, hi cards absteigende reinfolge
Local $aReturn[1]
$aReturn[0] = 0
local $j = 4
local $aCheck = StringSplit($aCards[1],"csdh",2)
if _ArraySearch($aCheck,1) > -1 Then
	_ArrayAdd($aReturn,1)
	$j -=1
EndIf
local $aCheck = StringSplit($aCards[ubound($aCards)-1],"csdh",2)
for $i = 0 to $j
_ArrayAdd($aReturn,_ArrayPop($aCheck))
Next
return $aReturn
EndFunc
#endregion

TCPShutdown()