#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=windmill.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.6.1
	Author:         Cartan12

	Script Function:
	Ein einfaches Mühlespiel in GDI+

#ce ----------------------------------------------------------------------------
;include
#include <GDIP.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet("{ESC}", "_abwaelen")
Global $debug = 0 ;Entwickler Modus ^^
Global $Geschwindigkeit = 1.5 ;Hier könnt ihr die Geschwindegkeit der Steine einstellen
Global $hotkey = 1
Global $x = 18, $y = 18, $heigh = 650, $widht = 600, $ausgewaehlt = False, $bk, $player = 0, $anderer_player = 1, $muehle = 0, $feld_alt = 0, $verschiebt = 0, $stein_verschiebt
Global $steine[2] = [9,9], $steine_spielfeld[2] = [0, 0], $steine_vorhanden[2] = [1, 1]
Global $fields[24], $field_ausgewaehlt[24], $muehle_feld_aktiv[16]
For $i = 0 To 15
	$muehle_feld_aktiv[$i] = 0
Next
For $i = 0 To 23
	$fields[$i] = 0
	$field_ausgewaehlt[$i] = 0
Next
Global $fieldpos[24][2] = [[6, 6],[270, 6],[538, 6], _;0,1,2
		[104, 104],[270, 104],[438, 104], _;3,4,5
		[202, 202],[270, 202],[340, 202], _;6,7,8
		[6, 270],[104, 270],[202, 270],[340, 270],[438, 270],[538, 270], _;9,10,11,12,13,14
		[202, 340],[270, 340],[340, 340], _;15,16,17
		[104, 438],[270, 438],[438, 438], _;18,19,20
		[6, 538],[270, 538],[538, 538]];21,22,23
Global $muehle_feld[16][3] = [[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11],[12, 13, 14],[15, 16, 17],[18, 19, 20],[21, 22, 23], _
		[0, 9, 21],[3, 10, 18],[6, 11, 15],[1, 4, 7],[16, 19, 22],[8, 12, 17],[5, 13, 20],[2, 14, 23]]
Global $zugmoeglichkeiten[32][2] = [[0, 1],[1, 2], _
		[3, 4],[4, 5], _
		[6, 7],[7, 8], _
		[9, 10],[10, 11],[12, 13],[13, 14], _
		[15, 16],[16, 17], _
		[18, 19],[19, 20], _
		[21, 22],[22, 23], _
		[0, 9],[9, 21], _
		[3, 10],[10, 18], _
		[6, 11],[11, 15], _
		[1, 4],[4, 7],[16, 19],[19, 22], _
		[8, 12],[12, 17],[5, 13],[13, 20], _
		[2, 14],[14, 23]]
Global $imgpfad = @ScriptDir & "\Pic\"
_GDIPlus_Startup()

$bk = _GDIPlus_ImageLoadFromFile($imgpfad & "muehle.png")

OnAutoItExitRegister("_exit")
Opt("MouseCoordMode", 0)
Opt("GUIOnEventMode", 1)
$GUI = GUICreate("Mühle", $widht, $heigh)
;~ WinSetTrans($GUI,"",90)
GUISetBkColor(0xFFFFFF)

GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
GUIRegisterMsg($WM_PAINT, "WM_PAINT")

$graphic = _GDIPlus_GraphicsCreateFromHWND($GUI)
$bitmap = _GDIPlus_BitmapCreateFromGraphics($widht, $heigh, $graphic)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
_GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2)

$brush_red = _GDIPlus_BrushCreateSolid(0xFFFF0000)
$brush_blue = _GDIPlus_BrushCreateSolid(0xFF0000FF)
$brush_bk = _GDIPlus_BrushCreateSolid(0xFF35C3C8)
$pen_muehle = _GDIPlus_PenCreate(0xFF000000,7)

GUISetState()

While 1
	Sleep(10)
	If WinActive($GUI) Then
		If Not $hotkey Then HotKeySet("{ESC}", "_abwaelen")
		If _IsPressed(01) Then
			While _IsPressed(01)
				Sleep(10)
			WEnd
			_checkMouseclick()
		EndIf
	Else
		HotKeySet("{ESC}")
		$hotkey = 0
	EndIf
	If $debug Then
		$pos = GUIGetCursorInfo($GUI)
		ToolTip($pos[0] & " " & $pos[1],0,0)
	EndIf
WEnd

Func _checkMouseclick()
	Local $pos = GUIGetCursorInfo($GUI), $temp = 0
	If Not $muehle Then
		For $i = 0 To 23
			Local $temp_X = $fieldpos[$i][0] + 55, $temp_Y = $fieldpos[$i][1] + 55
			If $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = 0 And $steine_vorhanden[$player] = 1 Then
				$fields[$i] = $player + 1
				$steine[$player] -= 1
				$steine_spielfeld[$player] += 1
				If $steine[$player] = 0 Then $steine_vorhanden[$player] = 0
				If Not _checkMuehle() Then _changePlayer()
				_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
			ElseIf $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = $player + 1 And $steine_vorhanden[$player] = 0 And $ausgewaehlt = 0 Then
				$field_ausgewaehlt[$i] = 1
				$feld_alt = $i
				$ausgewaehlt = 1
				_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
			ElseIf $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = 0 And $steine_vorhanden[$player] = 0 And $ausgewaehlt = 1 Then
				If $steine_spielfeld[$player] = 3 Then
					$fields[$feld_alt] = 0
					$fields[$i] = $player + 1
					$field_ausgewaehlt[$feld_alt] = 0
					$ausgewaehlt = 0
					If Not _checkMuehle() Then _changePlayer()
					_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
					Return
				EndIf
				For $k = 0 To 31
					If $zugmoeglichkeiten[$k][0] == $feld_alt Or $zugmoeglichkeiten[$k][1] == $feld_alt Then
						If $zugmoeglichkeiten[$k][0] == $i Or $zugmoeglichkeiten[$k][1] == $i Then
							$l = 0
							$fields[$feld_alt] = 0
							$field_ausgewaehlt[$feld_alt] = 0
							$ausgewaehlt = 0
							If $fieldpos[$feld_alt][0] = $fieldpos[$i][0] Then
								If $feld_alt>$i Then
									Do
										$temp = WM_PAINT_special($l,$feld_alt,$i,$player,0)
										$l += $Geschwindigkeit
									Until $temp <= $fieldpos[$i][1]
								Else
									Do
										$temp = WM_PAINT_special($l,$feld_alt,$i,$player,0)
										$l += $Geschwindigkeit
									Until $temp >= $fieldpos[$i][1]
								EndIf
							ElseIf $fieldpos[$feld_alt][1] = $fieldpos[$i][1] Then
								If $feld_alt>$i Then
									Do
										$temp = WM_PAINT_special($l,$feld_alt,$i,$player,1)
										$l += $Geschwindigkeit
									Until $temp <= $fieldpos[$i][0]
								Else
									Do
										$temp = WM_PAINT_special($l,$feld_alt,$i,$player,1)
										$l += $Geschwindigkeit
									Until $temp >= $fieldpos[$i][0]
								EndIf
							EndIf
							$fields[$i] = $player + 1
							If Not _checkMuehle() Then _changePlayer()
							_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
						EndIf
					EndIf
				Next
			EndIf
		Next
	ElseIf $muehle Then
		For $i = 0 To 23
			Local $temp_X = $fieldpos[$i][0] + 55, $temp_Y = $fieldpos[$i][1] + 55
			If $pos[0] > $fieldpos[$i][0] And $pos[1] > $fieldpos[$i][1] And $pos[0] < $temp_X And $pos[1] < $temp_Y And $fields[$i] = $anderer_player + 1 Then
				For $k = 0 To 15
					If Not $muehle_feld_aktiv[$k] Then ContinueLoop
					For $j = 0 To 2
						If $i = $muehle_feld[$k][$j] Then
							Return
						EndIf
					Next
				Next
				If $steine_spielfeld[$anderer_player] <= 3 And Not $steine_vorhanden[$anderer_player] Then
					MsgBox(0, "Gewonnen!", "Spieler " & $player + 1 & " hat gewonnen!")
					Exit
				EndIf
				$fields[$i] = 0
				$steine_spielfeld[$anderer_player] -= 1
				$muehle = 0
				_changePlayer()
				_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
			EndIf
		Next
	EndIf
EndFunc   ;==>_checkMouseclick

Func _abwaelen()
	$field_ausgewaehlt[$feld_alt] = 0
	$ausgewaehlt = 0
	_WinAPI_RedrawWindow($GUI, 0, 0, $RDW_INTERNALPAINT)
EndFunc   ;==>_abwaelen

Func _checkMuehle()
	Local $temp[3]
	For $i = 0 To 15
		If $muehle_feld_aktiv[$i] Then
			For $j = 0 To 2
				$temp[$j] = $fields[$muehle_feld[$i][$j]]
			Next
			If $temp[0] > 0 And $temp[1] > 0 And $temp[2] > 0 Then
				If $temp[0] = 1 And $temp[1] = 1 And $temp[2] = 1 Then
					ContinueLoop
				ElseIf $temp[0] = 2 And $temp[1] = 2 And $temp[2] = 2 Then
					ContinueLoop
				EndIf
			Else
				$muehle_feld_aktiv[$i] = 0
			EndIf
		EndIf
		For $j = 0 To 2
			$temp[$j] = $fields[$muehle_feld[$i][$j]]
		Next
		If $temp[0] > 0 And $temp[1] > 0 And $temp[2] > 0 Then
			If $temp[0] = 1 And $temp[1] = 1 And $temp[2] = 1 Then
				$muehle_feld_aktiv[$i] = 1
				$muehle = 1
				Return 1
			ElseIf $temp[0] = 2 And $temp[1] = 2 And $temp[2] = 2 Then
				$muehle_feld_aktiv[$i] = 1
				$muehle = 1
				Return 1
			EndIf
		ElseIf $temp[0] = 0 And $temp[1] = 0 And $temp[2] = 0 Then
			$muehle_feld_aktiv[$i] = 0
		EndIf
	Next
	$muehle = 0
	Return 0
EndFunc   ;==>_checkMuehle

Func _changePlayer()
	If $player = 0 Then
		$player = 1
		$anderer_player = 0
	ElseIf $player = 1 Then
		$player = 0
		$anderer_player = 1
	EndIf
EndFunc   ;==>_changePlayer

Func _exit()
	_GDIPlus_ImageDispose($bk)
	_GDIPlus_GraphicsDispose($graphic)
	_GDIPlus_BitmapDispose($bitmap)
	_GDIPlus_BrushDispose($brush_red)
	_GDIPlus_BrushDispose($brush_blue)
	_GDIPlus_BrushDispose($brush_bk)
	_GDIPlus_PenDispose($pen_muehle)
	_GDIPlus_Shutdown()
	Exit
EndFunc   ;==>_exit

Func WM_PAINT()
	_GDIPlus_GraphicsClear($backbuffer, 0xFFFFFFFF)
;~ 	_GDIPlus_GraphicsDrawImageRect($backbuffer,$bk,15,15,$widht-30,$heigh-80)
	_drawMuehle()
	If $debug Then
		For $i = 0 To 23
			_GDIPlus_GraphicsDrawString($backbuffer, $i, $fieldpos[$i][0], $fieldpos[$i][1])
		Next
	EndIf
	For $i = 0 To 23
		If $field_ausgewaehlt[$i] Then
			_GDIPlus_GraphicsFillRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, $brush_bk)
		EndIf
	Next
	For $i = 0 To 23
		If $fields[$i] = 1 Then
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_blue)
		ElseIf $fields[$i] = 2 Then
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_red)
		EndIf
	Next
	_GDIPlus_GraphicsDrawString($backbuffer, "Spieler " & $player + 1 & " ist am Zug!", 50, $heigh - 40)
	If $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Stein zum rausschmeißen aussuchen!", 50, $heigh - 20)
	If $steine_vorhanden[$player] Then _GDIPlus_GraphicsDrawString($backbuffer, "Der Spieler hat noch " & $steine[$player] & " Spielsteine übrig!", 200, $heigh - 40)
	If Not $steine_vorhanden[$player] And Not $ausgewaehlt And Not $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Spielstein zum verschieben auswählen!", 200, $heigh - 40)
	_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, $widht, $heigh)
EndFunc   ;==>WM_PAINT

Func WM_PAINT_special($il,$sfeld_alt,$ii,$iplayer,$imodus)
	_GDIPlus_GraphicsClear($backbuffer, 0xFFFFFFFF)
;~ 	_GDIPlus_GraphicsDrawImageRect($backbuffer,$bk,15,15,$widht-30,$heigh-80)
	_drawMuehle()
	For $i = 0 To 23
		If $fields[$i] = 1 Then
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_blue)
		ElseIf $fields[$i] = 2 Then
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$i][0], $fieldpos[$i][1], 55, 55, 55, $brush_red)
		EndIf
	Next
	If Not $imodus Then
		Local $temp = $fieldpos[$sfeld_alt][1] + $il
		If $sfeld_alt>$ii Then $temp = $fieldpos[$sfeld_alt][1] - $il
		If Not $iplayer Then
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$sfeld_alt][0], $temp, 55, 55, 55, $brush_blue)
		Else
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $fieldpos[$sfeld_alt][0], $temp, 55, 55, 55, $brush_red)
		EndIf
	Else
		Local $temp = $fieldpos[$sfeld_alt][0] + $il
		If $sfeld_alt>$ii Then $temp = $fieldpos[$sfeld_alt][0] - $il
		If Not $player Then
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $temp, $fieldpos[$sfeld_alt][1], 55, 55, 55, $brush_blue)
		Else
			_GDIPlus_GraphicsFillRoundRect($backbuffer, $temp, $fieldpos[$sfeld_alt][1], 55, 55, 55, $brush_red)
		EndIf
	EndIf
	_GDIPlus_GraphicsDrawString($backbuffer, "Spieler " & $player + 1 & " ist am Zug!", 50, $heigh - 40)
	If $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Stein zum rausschmeißen aussuchen!", 50, $heigh - 20)
	If $steine_vorhanden[$player] Then _GDIPlus_GraphicsDrawString($backbuffer, "Der Spieler hat noch " & $steine[$player] & " Spielsteine übrig!", 200, $heigh - 40)
	If Not $steine_vorhanden[$player] And Not $ausgewaehlt And Not $muehle Then _GDIPlus_GraphicsDrawString($backbuffer, "Bitte einen Spielstein zum verschieben auswählen!", 200, $heigh - 40)
	_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, $widht, $heigh)
	Return $temp
EndFunc   ;==>WM_PAINT

Func _drawMuehle()
    _GDIPlus_GraphicsDrawLine($backbuffer,33,28,34,568,$pen_muehle);links außen
    _GDIPlus_GraphicsDrawLine($backbuffer,31,566,569,566,$pen_muehle) ;unten außen
    _GDIPlus_GraphicsDrawLine($backbuffer,566,568,566,28,$pen_muehle) ;rechts außen
    _GDIPlus_GraphicsDrawLine($backbuffer,30,30,569,30,$pen_muehle) ; oben außen
    _GDIPlus_GraphicsDrawLine($backbuffer,132,129,132,471,$pen_muehle) ;links mitte
    _GDIPlus_GraphicsDrawLine($backbuffer,129,468,471,468,$pen_muehle);unten mitte
    _GDIPlus_GraphicsDrawLine($backbuffer,468,471,468,129,$pen_muehle);rechts mitte
    _GDIPlus_GraphicsDrawLine($backbuffer,129,132,471,132,$pen_muehle);links mitte
    _GDIPlus_GraphicsDrawLine($backbuffer,232,229,232,367,$pen_muehle);links innen
    _GDIPlus_GraphicsDrawLine($backbuffer,229,364,367,364,$pen_muehle);unten innen
    _GDIPlus_GraphicsDrawLine($backbuffer,364,367,364,229,$pen_muehle);rechts innen
    _GDIPlus_GraphicsDrawLine($backbuffer,367,232,229,232,$pen_muehle);oben innen
    _GDIPlus_GraphicsDrawLine($backbuffer,32,296,232,296,$pen_muehle)
    _GDIPlus_GraphicsDrawLine($backbuffer,296,568,296,364,$pen_muehle)
    _GDIPlus_GraphicsDrawLine($backbuffer,568,296,364,296,$pen_muehle)
    _GDIPlus_GraphicsDrawLine($backbuffer,296,32,296,232,$pen_muehle)
EndFunc

Func _GDIPlus_GraphicsFillRoundRect($gra, $x, $y, $w, $h, $r = 30, $brush = 0)
	;by TheShadowAE
	Local $path = _GDIPlus_PathCreate(1)
	_GDIPlus_PathAddPie($path, $x, $y, $r, $r, 180, 90)
	_GDIPlus_PathAddPie($path, $x + $w - $r, $y, $r, $r, 270, 90)
	_GDIPlus_PathAddPie($path, $x + $w - $r, $y + $h - $r, $r, $r, 0, 90)
	_GDIPlus_PathAddPie($path, $x, $y + $h - $r, $r, $r, 90, 90)
	_GDIPlus_PathAddRectangle($path, $x, $y + $r / 2, $w, $h - $r)
	_GDIPlus_PathAddRectangle($path, $x + $r / 2, $y, $w - $r, $h)
	_GDIPlus_PathCloseFigure($path)
	_GDIPlus_GraphicsFillPath($gra, $path, $brush)
	_GDIPlus_PathDispose($path)
EndFunc   ;==>_GDIPlus_GraphicsFillRoundRect