#include <WinAPI.au3>
#include <WinAPISys.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>


;HotKeySet("{ESC}", "_Exit")
Opt("MustDeclareVars", 1)
Opt("TrayAutoPause", 0)


Global Const $cLEM_MAX = 24
Global Const $cLEM_SCALE = 2
Global Const $cLEM_ANITIME = 80
Global Const $cLEM_DRAWWORLD = False


_GDIPlus_Startup()


Global $bLEM_SPRITES_WALK = "0x08060A040000000006666000066F000000FFF00000FC000000FC000000FC000000CC00000FCC000000FF00000060600006660000066F000000FFF00000FC00000FCC00000FCC0F0000CC0F000CC0F0000FF00000000000000606000006660000006F000000FFF0000FFC00000FCC0000FFCCC0000CCCC000FF00FF000000000000660000066F600006FFF00000FC000000FC00000FCC000000CC0000FCCCC000F00FF0000000000006666000066F000006FFF00000FC000000CF000000FC000000CC00000FCC000000FF00000060600006660000066F000000FFF00000FC000000CF000000CF0F0000CC0F000CC0F0000FF00000000000000606000006660000006F000000FFF00000CF000000CF000000CCF0000CCCC000FF00FF000000000000660000066F600006FFF00000FC000000FC000000CF000000CC0000FCCCC000F00FF000"
Global $tLEM_SPRITES_WALK = _Lemming_SpritesCreate($bLEM_SPRITES_WALK)
Global $bLEM_SPRITES_CLIMB = "0x100A0B080000000000000000000000000000000000000F00000000000006FF00F00000000006FFC0F000000000066CCF0000000000066CCC0000000000000CCC0000000000000CCC00000000000000CF000000000000000F00000000000000000000000000000F00000000000006FF00F00000000006FFC0F000000000066CCF0000000000066CCC0000000000006CCC0000000000000CCC00000000000000CC00000000000000CF000000000000000F00000000000000000000000000000F00F00000000006FF00F00000000006FFCFF000000000066CCC0000000000006CCC0000000000000CCC00000000000000CC00000000000000CC00000000000000CF000000000000000F0000000000000000F00000000000F000F0000000006FFFCF00000000006FFFCC000000000066CCCC0000000000066CCC0000000000000CCC0000000000000CCC00000000000000CC00000000000000CF000000000000000F00000000000000000000000000000000F0000000000F000F0000000006FFCCFC0000000006FFCCCC000000000666CCCC000000000066CCCC0000000000000CCC0000000000000CCC00000000000000CF000000000000000F000000000000000000000000000000000000000000000000F0000000000F000F0000000006FFCCFC0000000066FFCCCC000000006666CCCC000000000600CCCC000000000000CCCC0000000000000CCF000000000000000F000000000000000000000000000000000000000000000000000000000000F000F0000000006FF00F00000000006FFCFC000000000666CCCC000000000660CCCC0000000006600CCC0000000000000CCF00000000000000CF0000000000000000000000000000000000000000000000000000000000000F00000000000006FF00F00000000006FF0F00000000006666FC0000000000666CCC0000000000000CCC0000000000000CCF00000000000000CF00000000000000000000000000000F00000000000006FF00F00000000006FFCF0000000000066CCC0000000000006CCC0000000000000CCC0000000000000CCC00000000000000CC00000000000000FF000000000000000000000000000000F00000000000006FF00000000000006FFC0000000000006CCC0000000000000CCFF000000000000CC00000000000000CCC00000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000F00000000000006FF00000000000006FFC0000000000006CCC0000000000000CFC0000000000000FCFF0000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006F00000000000006FFC0000000000006FFC000000000000CCCC0000000000000CF000000000000000FF0000000000000000000000000000000000000000000000000000000000000000000000000000000F000000000000000F00000000000000CC00000000000006FC0000000000006FFC0000000000006FFC00000000000066CC000000000000000F000000000000000F000000000000000000000000000000000000000000000000000000000000000CF00000000000666FF000000000006FFC0000000000006FFC00000000000000CC00000000000000CF000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000000066F00000000000066FCC000000000006FFCF000000000006CCCC000000000000CFC0000000000000F0000000000000000F00000000000000000000000000000000000000000000000000000000000000066600000000000066F00000000000006FFF000000000000FFC000000000000F0CCF0000000000000CC00000000000000CC0000000000000FFC000000000000000FF000000"
Global $tLEM_SPRITES_CLIMB = _Lemming_SpritesCreate($bLEM_SPRITES_CLIMB)
Global $bLEM_SPRITES_FALL = "0x0C0A1008000066000000000000066F00000000000006FFF00000000000F0CC0F00000000000FCCF0000000000000CC00000000000000CC000000000000F0CCF000000000000FC00F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000606000000000000066F00000000000000FFF0000000000000CC000000000000FFCCFF000000000000CC00000000000000CC00000000000000CCFF0000000000FFC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066000000000000066F00000000000006FFF0000000000000CC0000000000000FCCF00000000000F0CC0F000000000000CC0F000000000000CCF000000000000FC0000000000000F0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000606000000000000066F00000000000006FFF0000000000000CC000000000000FFCCFF000000000000CC00000000000000CC000000000000FFCCFF000000000000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006600000000000CC66F000000000000C6FFF00000000000F0CC0F0000000000BFCCF00000000000B0CC000000000000B0CC0F0000000000B0CCF000000000000FC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066000000000000066F00000000000006FFF0000000000000CB0F000000000000BBB0000000000000BCB0000000000000BBB00000000000F0BBF000000000000FC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006BBB0000000000066CBCB00000000006FFCBB00000000000CFBCB00000000000CCFCB00000000000CC00B00000000000CC00000000000000CCF00000000000FFC0000000000000000000000000000000000000000000000BBCB0000000000BBBBBBB000000000BCBBBBBB0000000000BCBCBCB00000000000C000000000000000F00000000000000F600000000000000FFF0000000000000CC0F000000000000CCF0000000000000CC00000000000000CC0F00000000000FCCF000000000000FC000000000000000000000000000000BBB00000000000BBBBBBB00000000BCBCBCBCB00000000000C000000000000000C00000000000000CF000000000000000F066000000000000FCF6600000000000CCFF600000000000CC00000000000F0CCCF0000000000FCCCCF00000000000CCC00000000000000C000000000000000F0000000000000000F00000000000000BBB00000000000BBBBBBB00000000BCBCBCBCB00000000000C000000000000000C00000000000000CF666000000000000F6F6600000000000F6FF000000000000CCC0000000000000CCCF000000000000CCC0F000000000FCCC000000000000FCCC00000000000000CC000000000000000FF0000000000000000000000000000BBB00000000000BBBBBBB00000000BCBCBCBCB00000000000C000000000000000C66600000000000CF6FF000000000000F6FFF00000000000FCC00000000000000CCF0000000000000CC0F00000000000CCC0000000000000CCC00000000000FCCC0000000000000F0C0F00000000000000F0000000000000000000000000000BBB00000000000BBBBBBB00000000BCBCBCBCB00000000000C000000000000000C66000000000000CF6F0000000000000F6F0000000000000FCFF000000000000CC00000000000000CC00000000000000CC00000000000000CCCF000000000000CCCF00000000000FF0000000000000000000000000000000000000000000"
Global $tLEM_SPRITES_FALL = _Lemming_SpritesCreate($bLEM_SPRITES_FALL)

Global $sLEM_WINLIST = ""

Global $tLEM_WORLD = _Lemming_WorldCreate()



Global $aLEM[$cLEM_MAX]
For $i = 0 To $cLEM_MAX - 1
	$aLEM[$i] = _Lemming_Create(Random(100, @DesktopWidth - 100), Random(100, @DesktopHeight - 100), Random(0.8, 1.2), Random(-1, 1))
Next

Global $aLEM_HZ[2][5]
Global $aLEM_VT[3][5]





$tLEM_WORLD.Update = 1
$tLEM_WORLD.Calc = 1
While Sleep(10)
	_Lemming_WorldUpdateWinList($tLEM_WORLD)
	_Lemming_WorldCalc($tLEM_WORLD)

	_Lemmings_Calc()
WEnd



Func _Lemmings_Calc()
	Local Static $iTimer = TimerInit()
	If TimerDiff($iTimer) < $cLEM_ANITIME Then Return
	$iTimer = TimerInit()


	For $i = 0 To $cLEM_MAX - 1
		_Lemming_CalcCol($aLEM[$i], $aLEM_HZ, $aLEM_VT)
		_Lemming_CalcAni($aLEM[$i])
		_Lemming_Draw($aLEM[$i])
	Next
EndFunc   ;==>_Lemmings_Calc




Func _Lemming_CalcCol(ByRef $tLem, ByRef $aHZ, ByRef $aVT)
	If Not IsDllStruct($tLem) Then Return
	If Not IsArray($aHZ) Or Not IsArray($aVT) Then Return


	Local $fPX1, $fPY1, $fPX2, $fPY2, $iIdx, $hWnd
	Switch $tLem.AniType
		Case 1 ;Climbing

			$fPY1 = $tLem.Y - 12 * $cLEM_SCALE
			If $fPY1 < 0 Then
				$tLem.Dir *= -1
				_Lemming_ChangeAni($tLem, 2)
				Return
			EndIf


			;Continue climbing
			If $tLem.Dir > 0 Then
				$fPX1 = $tLem.X + 4 * $cLEM_SCALE
				$fPX2 = $tLem.X
			Else
				$fPX1 = $tLem.X
				$fPX2 = $tLem.X - 4 * $cLEM_SCALE
			EndIf
			$fPY1 = $tLem.Y - 8 * $cLEM_SCALE
			$fPY2 = $tLem.Y - 10 * $cLEM_SCALE

			Local $bClimb = False
			For $i = 1 To $aVT[0][0]
				If $fPX1 >= $aVT[$i][0] And $fPX2 <= $aVT[$i][2] Then
					If $fPY1 >= $aVT[$i][1] And $fPY2 <= $aVT[$i][3] Then
						If $tLem.Dir > 0 Then
							$tLem.X = $aVT[$i][0] - 3 * $cLEM_SCALE
						Else
							$tLem.X = $aVT[$i][0] + 3 * $cLEM_SCALE
						EndIf
						$tLem.WrldIdx = $aVT[$i][4]
						$bClimb = True
						ExitLoop
					EndIf
				EndIf
			Next

			If Not $bClimb Then
				If $tLem.Dir > 0 Then
					$fPX1 = $tLem.X + 4 * $cLEM_SCALE
					$fPX2 = $tLem.X + 6 * $cLEM_SCALE
				Else
					$fPX1 = $tLem.X - 6 * $cLEM_SCALE
					$fPX2 = $tLem.X - 4 * $cLEM_SCALE
				EndIf
				$fPY1 = $tLem.Y - 5 * $cLEM_SCALE
				$fPY2 = $tLem.Y - 8 * $cLEM_SCALE
				$iIdx = $tLem.WrldIdx
				For $i = 1 To $aHZ[0][0]
					If $iIdx <> $aHZ[$i][4] Then ContinueLoop

					If $fPX1 >= $aHZ[$i][0] And $fPX2 <= $aHZ[$i][2] Then
						If $fPY1 >= $aHZ[$i][1] And $fPY2 <= $aHZ[$i][1] Then
							$tLem.Y = $aHZ[$i][1] + 10 * $cLEM_SCALE
							$tLem.WrldIdx = $aHZ[$i][4]
							_Lemming_ChangeAni($tLem, 3)
							Return
						EndIf
					EndIf
				Next

				$tLem.Dir *= -1
				_Lemming_ChangeAni($tLem, 2)
				Return
			EndIf



			;Terminate
			$fPX1 = $tLem.X + 2 * $cLEM_SCALE
			$fPX2 = $tLem.X - 2 * $cLEM_SCALE
			$fPY1 = $tLem.Y - 6 * $cLEM_SCALE
			$fPY2 = $tLem.Y - 8 * $cLEM_SCALE
			$iIdx = $tLem.WrldIdx
			For $i = 1 To $aHZ[0][0]
				If $aHZ[$i][4] > $iIdx Then ExitLoop

				If $fPX1 >= $aHZ[$i][0] And $fPX2 <= $aHZ[$i][2] Then
					If $fPY1 >= $aHZ[$i][1] And $fPY2 <= $aHZ[$i][1] Then
						$tLem.Y = $aHZ[$i][1] + 12 * $cLEM_SCALE
						$tLem.WrldIdx = $aHZ[$i][4]
						$tLem.Dir *= -1
						_Lemming_ChangeAni($tLem, 2)
						Return
					EndIf
				EndIf
			Next






		Case 2 ;Falling

			$fPY1 = $tLem.Y
			If $fPY1 > @DesktopHeight Then
				$tLem.Y = @DesktopHeight
				_Lemming_ChangeAni($tLem, 0)
				Return
			EndIf



			$fPX1 = $tLem.X + 2 * $cLEM_SCALE
			$fPX2 = $tLem.X - 2 * $cLEM_SCALE
			$fPY1 = $tLem.Y
			$fPY2 = $tLem.Y - 3 * $cLEM_SCALE
			For $i = 1 To $aHZ[0][0]
				If $fPX1 >= $aHZ[$i][0] And $fPX2 <= $aHZ[$i][2] Then
					If $fPY1 >= $aHZ[$i][1] And $fPY2 <= $aHZ[$i][1] Then
						$tLem.Y = $aHZ[$i][1]
						$tLem.WrldIdx = $aHZ[$i][4]
						_Lemming_ChangeAni($tLem, 0)
						Return
					EndIf
				EndIf
			Next


		Case 3 ;Climb2
			If $tLem.AniIdx >= 16 Then
				_Lemming_ChangeAni($tLem, 0)
				$tLem.X += 2 * $cLEM_SCALE * $tLem.Dir

				$tLem.PosX = $tLem.X - ($tLEM_SPRITES_WALK.W * 0.5 + 1) * $cLEM_SCALE
				$tLem.PosY = $tLem.Y - ($tLEM_SPRITES_WALK.H + 1) * $cLEM_SCALE
			EndIf




		Case Else ;Walker

			If $tLem.Dir > 0 Then
				$fPX1 = $tLem.X - 2 * $cLEM_SCALE
				If $fPX1 > @DesktopWidth Then
					$tLem.Dir *= -1
					_Lemming_ChangeAni($tLem, 0)
					Return
				EndIf
			Else
				$fPX1 = $tLem.X + 2 * $cLEM_SCALE
				If $fPX1 < 0 Then
					$tLem.Dir *= -1
					_Lemming_ChangeAni($tLem, 0)
					Return
				EndIf
			EndIf




			;Climbing
			If $tLem.Dir > 0 Then
				$fPX1 = $tLem.X + 4 * $cLEM_SCALE
				$fPX2 = $tLem.X + 2 * $cLEM_SCALE
			Else
				$fPX1 = $tLem.X - 2 * $cLEM_SCALE
				$fPX2 = $tLem.X - 4 * $cLEM_SCALE
			EndIf
			$fPY1 = $tLem.Y - 3 * $cLEM_SCALE
			$fPY2 = $tLem.Y - 6 * $cLEM_SCALE
			$iIdx = $tLem.WrldIdx

			For $i = 1 To $aVT[0][0]
				If $iIdx > 1 And $aVT[$i][4] > $iIdx Then ExitLoop

				If $fPX1 >= $aVT[$i][0] And $fPX2 <= $aVT[$i][0] Then
					If $fPY1 >= $aVT[$i][1] And $fPY2 <= $aVT[$i][3] Then
						If $tLem.Dir > 0 Then
							$tLem.X = $aVT[$i][0] - 3 * $cLEM_SCALE
						Else
							$tLem.X = $aVT[$i][0] + 3 * $cLEM_SCALE
						EndIf
						$tLem.WrldIdx = $aVT[$i][4]
						_Lemming_ChangeAni($tLem, 1)
						Return
					EndIf
				EndIf
			Next


			;Continue walking
			$fPX1 = $tLem.X + 3 * $cLEM_SCALE
			$fPX2 = $tLem.X - 3 * $cLEM_SCALE
			$fPY1 = $tLem.Y + 2 * $cLEM_SCALE
			$fPY2 = $tLem.Y - 2 * $cLEM_SCALE

			Local $bWalk = False
			For $i = 1 To $aHZ[0][0]
				If $fPX1 >= $aHZ[$i][0] And $fPX2 <= $aHZ[$i][2] Then
					If $fPY1 >= $aHZ[$i][1] And $fPY2 <= $aHZ[$i][1] Then
						$tLem.Y = $aHZ[$i][1]
						$tLem.WrldIdx = $aHZ[$i][4]
						$bWalk = True
						ExitLoop
					EndIf
				EndIf
			Next

			If Not $bWalk Then
				If $tLem.Y < @DesktopHeight Then
					_Lemming_ChangeAni($tLem, 2)
					$tLem.Y += 4 * $cLEM_SCALE
				EndIf
			EndIf

	EndSwitch

EndFunc   ;==>_Lemming_CalcCol









Func _Lemming_CalcAni(ByRef $tLem)
	If Not IsDllStruct($tLem) Then Return

	If TimerDiff($tLem.Timer) < $cLEM_ANITIME Then Return
	$tLem.Timer = TimerInit()

	Switch $tLem.AniType
		Case 1 ;Climbing
			$tLem.Y -= $cLEM_SCALE * 0.5 * $tLem.Speed

			$tLem.AniIdx += 1
			If $tLem.AniIdx > 8 Then $tLem.AniIdx = 1

			$tLem.PosX = $tLem.X - ($tLEM_SPRITES_CLIMB.W * 0.5 + 1) * $cLEM_SCALE
			$tLem.PosY = $tLem.Y - ($tLEM_SPRITES_CLIMB.H + 1) * $cLEM_SCALE

		Case 2 ;Falling
			Switch $tLem.AniIdx
				Case 0 To 6
					$tLem.Y += $cLEM_SCALE * 3 * $tLem.Speed
				Case 7 To 10
					$tLem.Y += $cLEM_SCALE * 0.2 * $tLem.Speed
				Case 11 To 12
					$tLem.Y += $cLEM_SCALE * $tLem.Speed
				Case Else
					$tLem.Y += $cLEM_SCALE * 2 * $tLem.Speed
			EndSwitch

			$tLem.AniIdx += 1

			$tLem.PosX = $tLem.X - ($tLEM_SPRITES_FALL.W * 0.5 + 1) * $cLEM_SCALE
			$tLem.PosY = $tLem.Y - ($tLEM_SPRITES_FALL.H + 1) * $cLEM_SCALE

		Case 3 ;Climb2
			$tLem.Y -= $cLEM_SCALE * 0.5
			$tLem.AniIdx += 1

			$tLem.PosX = $tLem.X - ($tLEM_SPRITES_CLIMB.W * 0.5 + 1) * $cLEM_SCALE
			$tLem.PosY = $tLem.Y - ($tLEM_SPRITES_CLIMB.H + 1) * $cLEM_SCALE

		Case Else ;Walker
			$tLem.X += $cLEM_SCALE * $tLem.Dir * $tLem.Speed

			$tLem.AniIdx += 1
			If $tLem.AniIdx > $tLEM_SPRITES_WALK.Cnt Then $tLem.AniIdx = 1

			$tLem.PosX = $tLem.X - ($tLEM_SPRITES_WALK.W * 0.5 + 1) * $cLEM_SCALE
			$tLem.PosY = $tLem.Y - ($tLEM_SPRITES_WALK.H + 1) * $cLEM_SCALE

	EndSwitch


EndFunc   ;==>_Lemming_CalcAni




Func _Lemming_ChangeAni(ByRef $tLem, $iNew = 0)
	If Not IsDllStruct($tLem) Then Return

	$tLem.AniIdx = 0
	$tLem.AniType = $iNew

	_GDIPlus_GraphicsResetTransform($tLem.GFX)

	_GDIPlus_GraphicsScaleTransform($tLem.GFX, $cLEM_SCALE, $cLEM_SCALE)

	If $tLem.Dir < 0 Then
		_GDIPlus_GraphicsScaleTransform($tLem.GFX, -1, 1, False)

		Switch $tLem.AniType
			Case 1, 3 ;Climbing
				_GDIPlus_GraphicsTranslateTransform($tLem.GFX, $tLEM_SPRITES_CLIMB.W * $cLEM_SCALE, 0, True)
			Case 2 ;Falling
				_GDIPlus_GraphicsTranslateTransform($tLem.GFX, $tLEM_SPRITES_FALL.W * $cLEM_SCALE, 0, True)
			Case Else ;Walker
				_GDIPlus_GraphicsTranslateTransform($tLem.GFX, $tLEM_SPRITES_WALK.W * $cLEM_SCALE, 1, True)
		EndSwitch
		_GDIPlus_GraphicsTranslateTransform($tLem.GFX, -1, 1, False)
	Else
		_GDIPlus_GraphicsTranslateTransform($tLem.GFX, 1, 1, False)
	EndIf



EndFunc   ;==>_Lemming_ChangeAni








Func _Lemming_Draw(ByRef $tLem)
	If Not IsDllStruct($tLem) Then Return

	_GDIPlus_GraphicsClear($tLem.GFX, 0)

	Switch $tLem.AniType
		Case 1, 3 ;Climbing
			_GDIPlus_GraphicsDrawImageRect($tLem.GFX, $tLEM_SPRITES_CLIMB.Bmp(($tLem.AniIdx)), 0, 0, $tLEM_SPRITES_CLIMB.W, $tLEM_SPRITES_CLIMB.H)
			_GDIPlus_GraphicsDrawPath($tLem.GFX, $tLEM_SPRITES_CLIMB.Path(($tLem.AniIdx)), $tLem.Pen)

		Case 2 ;Falling
			Local $iIdx, $iLoop
			If $tLem.AniIdx < $tLEM_SPRITES_FALL.Loop Then
				$iIdx = $tLem.AniIdx
			Else
				$iLoop = $tLEM_SPRITES_FALL.Cnt - $tLEM_SPRITES_FALL.Loop
				$iIdx = $tLEM_SPRITES_FALL.Cnt - Abs(Mod($tLem.AniIdx - $tLEM_SPRITES_FALL.Loop, $iLoop * 2) - $iLoop)
			EndIf
			_GDIPlus_GraphicsDrawImageRect($tLem.GFX, $tLEM_SPRITES_FALL.Bmp(($iIdx)), 0, 0, $tLEM_SPRITES_FALL.W, $tLEM_SPRITES_FALL.H)
			_GDIPlus_GraphicsDrawPath($tLem.GFX, $tLEM_SPRITES_FALL.Path(($iIdx)), $tLem.Pen)

		Case Else ;Walker
			_GDIPlus_GraphicsDrawImageRect($tLem.GFX, $tLEM_SPRITES_WALK.Bmp(($tLem.AniIdx)), 0, 0, $tLEM_SPRITES_WALK.W, $tLEM_SPRITES_WALK.H)
			_GDIPlus_GraphicsDrawPath($tLem.GFX, $tLEM_SPRITES_WALK.Path(($tLem.AniIdx)), $tLem.Pen)

	EndSwitch

	_WinAPI_UpdateLayeredWindow($tLem.Gui, $tLem.DC, DllStructGetPtr($tLem, "PosX"), DllStructGetPtr($tLem, "W"), $tLem.CDC, DllStructGetPtr($tLem, "Src"), 0, DllStructGetPtr($tLem, "Blend"), 2)

EndFunc   ;==>_Lemming_Draw


Func _Lemming_Create($iX, $iY, $fSpeed = 1, $iDir = 1)
	Local $iSize = Ceiling(16 * $cLEM_SCALE)
	Local $tLem = DllStructCreate("byte AniType; byte AniIdx; int PosX; int PosY; float X; float Y; int W; int H; int Dir; float Speed; int WrldIdx; hwnd Gui; hwnd DC; handle GFX; handle BMP; handle Pen; hwnd CDC; hwnd OBJ; int Src[2]; byte Blend[4];")

	$tLem.Blend(3) = 0xFF
	$tLem.Blend(4) = 1
	$tLem.X = $iX
	$tLem.Y = $iY
	$tLem.PosX = $iX
	$tLem.PosY = $iY

	If $iDir > 0 Then
		$tLem.Dir = 1
	Else
		$tLem.Dir = -1
	EndIf
	$tLem.Speed = $fSpeed

	$tLem.AniType = 2

	$tLem.Gui = GUICreate("Lem", $iSize, $iSize, $iX, $iY, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TRANSPARENT, $WS_EX_TOOLWINDOW))
	$tLem.W = $iSize
	$tLem.H = $iSize

	$tLem.DC = _WinAPI_GetDC($tLem.Gui)

	Local $hBmp = _WinAPI_CreateBitmap($iSize, $iSize)
	Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
	_WinAPI_DeleteObject($hBmp)

	$tLem.BMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
	_GDIPlus_BitmapDispose($hBitmap)

	$tLem.CDC = _WinAPI_CreateCompatibleDC($tLem.DC)
	$tLem.OBJ = _WinAPI_SelectObject($tLem.CDC, $tLem.BMP)

	$tLem.GFX = _GDIPlus_GraphicsCreateFromHDC($tLem.CDC)
	_GDIPlus_GraphicsScaleTransform($tLem.GFX, $cLEM_SCALE, $cLEM_SCALE)
	_GDIPlus_GraphicsTranslateTransform($tLem.GFX, 1, 1, False)

	_GDIPlus_GraphicsSetInterpolationMode($tLem.GFX, 5)
	_GDIPlus_GraphicsSetPixelOffsetMode($tLem.GFX, 2)

	$tLem.Pen = _GDIPlus_PenCreate(0xFF000000)

	GUISetState(@SW_SHOWNOACTIVATE, $tLem.Gui)

	Return $tLem
EndFunc   ;==>_Lemming_Create



Func _Lemming_Dispose(ByRef $tLem)
	If Not IsDllStruct($tLem) Then Return

	_GDIPlus_PenDispose($tLem.Pen)
	_GDIPlus_GraphicsDispose($tLem.GFX)
	_WinAPI_SelectObject($tLem.CDC, $tLem.OBJ)
	_WinAPI_DeleteObject($tLem.BMP)
	_WinAPI_DeleteDC($tLem.CDC)
	_WinAPI_ReleaseDC($tLem.Gui, $tLem.DC)
	GUIDelete($tLem.Gui)
	$tLem = 0
EndFunc   ;==>_Lemming_Dispose




















Func _Lemming_SpritesCreateOutLine($hBitmap, $hPath, $iX, $iY)
	If _GDIPlus_BitmapGetPixel($hBitmap, $iX - 1, $iY) = 0 Then
		_GDIPlus_PathAddLine($hPath, $iX, $iY + 1, $iX, $iY)
		_GDIPlus_PathCloseFigure($hPath)
	EndIf
	If _GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY - 1) = 0 Then
		_GDIPlus_PathAddLine($hPath, $iX, $iY, $iX + 1, $iY)
		_GDIPlus_PathCloseFigure($hPath)
	EndIf
	If _GDIPlus_BitmapGetPixel($hBitmap, $iX + 1, $iY) = 0 Then
		_GDIPlus_PathAddLine($hPath, $iX + 1, $iY, $iX + 1, $iY + 1)
		_GDIPlus_PathCloseFigure($hPath)
	EndIf
	If _GDIPlus_BitmapGetPixel($hBitmap, $iX, $iY + 1) = 0 Then
		_GDIPlus_PathAddLine($hPath, $iX + 1, $iY + 1, $iX, $iY + 1)
		_GDIPlus_PathCloseFigure($hPath)
	EndIf
EndFunc   ;==>_Lemming_SpritesCreateOutLine


Func _Lemming_SpritesCreate($bSprites)
	Local $tBin = DllStructCreate("byte Data[" & BinaryLen($bSprites) & "];")
	$tBin.Data = $bSprites
	Local $tStruct = DllStructCreate("byte Cnt; byte W; byte H; byte Stride; byte PX;", DllStructGetPtr($tBin))
	Local $pPixel = DllStructGetPtr($tStruct, "PX")

	Local $tSprites = DllStructCreate("int Cnt; int Loop; int W; int H; float MovX[" & $tStruct.Cnt & "]; float MovY[" & $tStruct.Cnt & "]; handle Bmp[" & $tStruct.Cnt & "]; handle Path[" & $tStruct.Cnt & "];")
	$tSprites.Cnt = $tStruct.Cnt; - 8
	$tSprites.Loop = 9
	$tSprites.W = $tStruct.W
	$tSprites.H = $tStruct.H

	Local $hImgAttr = _GDIPlus_ImageAttributesCreate()
	_GDIPlus_ImageAttributesSetColorKeys($hImgAttr, 0, True, 0xFF000000, 0xFF000000)

	Local $hContext, $hBitmap
	For $i = 1 To $tStruct.Cnt
		$tSprites.MovY(($i)) = 2

		$tSprites.Bmp(($i)) = _GDIPlus_BitmapCreateFromScan0($tStruct.W, $tStruct.H)
		$hContext = _GDIPlus_ImageGetGraphicsContext($tSprites.Bmp(($i)))

		$hBitmap = _GDIPlus_BitmapCreateFromScan0($tStruct.W, $tStruct.H, $GDIP_PXF04INDEXED, $tStruct.Stride, $pPixel + ($i - 1) * ($tStruct.Stride * $tStruct.H))
		_GDIPlus_GraphicsDrawImageRectRect($hContext, $hBitmap, 0, 0, $tStruct.W, $tStruct.H, 0, 0, $tStruct.W, $tStruct.H, $hImgAttr)


		$tSprites.Path(($i)) = _GDIPlus_PathCreate()
		For $y = 0 To $tStruct.H - 1
			For $x = 0 To $tStruct.W - 1
				If _GDIPlus_BitmapGetPixel($tSprites.Bmp(($i)), $x, $y) <> 0 Then _Lemming_SpritesCreateOutLine($tSprites.Bmp(($i)), $tSprites.Path(($i)), $x, $y)
			Next
		Next

		_GDIPlus_BitmapDispose($hBitmap)
		_GDIPlus_GraphicsDispose($hContext)

	Next

	_GDIPlus_ImageAttributesDispose($hImgAttr)

	Return $tSprites
EndFunc   ;==>_Lemming_SpritesCreate


Func _Lemming_SpritesDispose(ByRef $tSprites)
	For $i = 1 To $tSprites.Cnt
		_GDIPlus_BitmapDispose($tSprites.Bmp(($i)))
		_GDIPlus_PathDispose($tSprites.Path(($i)))
	Next
	$tSprites = 0
EndFunc   ;==>_Lemming_SpritesDispose



























Func _Lemming_WorldDraw(ByRef $tWorld, $iAlpha = 0x88)
	If Not IsDllStruct($tWorld) Then Return
	If Not $cLEM_DRAWWORLD Then Return

	Local $tPos = DllStructCreate("int X; int Y;")
	Local $tSize = DllStructCreate("int X; int Y;")
	$tSize.X = @DesktopWidth
	$tSize.Y = @DesktopHeight
	Local $tSrc = DllStructCreate("int X; int Y;")
	Local $tBlend = DllStructCreate("byte Val[4]")
	$tBlend.Val(3) = $iAlpha
	$tBlend.Val(4) = 1

	Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF006600)
	Local $hPen = _GDIPlus_PenCreate(0xFF000066, 3)
	_GDIPlus_GraphicsClear($tWorld.GFX, 0)
	_GDIPlus_GraphicsFillRegion($tWorld.GFX, $tWorld.Region, $hBrush)
	_GDIPlus_GraphicsDrawPath($tWorld.GFX, $tWorld.Path, $hPen)

	_GDIPlus_BrushDispose($hBrush)
	_GDIPlus_PenDispose($hPen)

	_WinAPI_UpdateLayeredWindow($tWorld.Gui, $tWorld.DC, DllStructGetPtr($tPos), DllStructGetPtr($tSize), $tWorld.CDC, DllStructGetPtr($tSrc), 0, DllStructGetPtr($tBlend), 2)
EndFunc   ;==>_Lemming_WorldDraw







Func _Lemming_WorldWinEventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadID, $iEventTime)
	#forceref $hEventHook, $iObjectID, $iChildID, $iThreadID, $iEventTime
	If Not IsDllStruct($tLEM_WORLD) Then
		ConsoleWrite("! Exit" & @CRLF)
		Exit;Return
	EndIf


	If Not $hWnd Then Return
	If BitAND(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), 0x40000000) Then Return ;Child

	Switch $iEvent
		Case 0x0000800B;$EVENT_OBJECT_LOCATIONCHANGE
			If $iObjectID = 0 Then
				If StringInStr($sLEM_WINLIST, ";" & $hWnd) Then
					$tLEM_WORLD.Calc = 1
				EndIf
			EndIf

		Case 0x00008004;$EVENT_OBJECT_REORDER
			If $hWnd = _WinAPI_GetDesktopWindow() Then
				$tLEM_WORLD.Update = 1
				$tLEM_WORLD.Calc = 1
			EndIf

		Case 0x00008001;$EVENT_OBJECT_DESTROY
			If $iObjectID = 0 Then
				If StringInStr($sLEM_WINLIST, ";" & $hWnd) Then
					$sLEM_WINLIST = StringRegExpReplace($sLEM_WINLIST, ";" & $hWnd & "[^;]*", "")
					$tLEM_WORLD.Calc = 1
				EndIf
			EndIf

		Case 0x00008002;$EVENT_OBJECT_SHOW
			If $iObjectID = 0 Then
				$tLEM_WORLD.Update = 1
				$tLEM_WORLD.Calc = 1
			EndIf

		Case 0x00008003;$EVENT_OBJECT_HIDE
			If $iObjectID = 0 Then
				If StringInStr($sLEM_WINLIST, ";" & $hWnd) Then
					$sLEM_WINLIST = StringRegExpReplace($sLEM_WINLIST, ";" & $hWnd & "[^;]*", "")
					$tLEM_WORLD.Calc = 1
				EndIf
			EndIf

	EndSwitch
EndFunc   ;==>_Lemming_WorldWinEventProc







Func _Lemming_WorldCalc(ByRef $tWorld)
	If Not IsDllStruct($tWorld) Then Return
	If Not $tWorld.Calc Then Return
	$tWorld.Calc = 0

	Local $aWin = StringSplit(StringTrimLeft($sLEM_WINLIST, 1), ";")
	If Not IsArray($aWin) Then Return


	Local $tInfo = DllStructCreate("uint Size; int Win[4]; int Client[4]; uint Style; uint ExStyle; uint WindowStatus; uint cxWindowBorders; uint cyWindowBorders; ushort atomWindowType; ushort CreatorVersion;")
	$tInfo.Size = DllStructGetSize($tInfo)

	Local $hRegion_Win = _GDIPlus_RegionCreate()
	Local $hRegion_Client = _GDIPlus_RegionCreate()
	Local $hRegion_Cut = _GDIPlus_RegionCreate()
	DllCall($ghGDIPDll, "int", "GdipSetEmpty", "handle", $hRegion_Cut)
	_GDIPlus_PathReset($tWorld.Path)

	Local $hPath = _GDIPlus_PathCreate()
	Local $hMatrix = _GDIPlus_MatrixCreate()

	Local $iScans, $tScans, $iOff
	$aLEM_HZ[0][0] = 1
	$aLEM_HZ[1][0] = 0
	$aLEM_HZ[1][1] = @DesktopHeight
	$aLEM_HZ[1][2] = @DesktopWidth
	$aLEM_HZ[1][3] = @DesktopHeight
	$aLEM_HZ[1][4] = 0

	$aLEM_VT[0][0] = 2
	$aLEM_VT[1][0] = 0
	$aLEM_VT[1][1] = 0
	$aLEM_VT[1][2] = 0
	$aLEM_VT[1][3] = @DesktopHeight
	$aLEM_VT[1][4] = 0

	$aLEM_VT[2][0] = @DesktopWidth
	$aLEM_VT[2][1] = 0
	$aLEM_VT[2][2] = @DesktopWidth
	$aLEM_VT[2][3] = @DesktopHeight
	$aLEM_VT[2][4] = 0

	For $i = 1 To $aWin[0] - 1
		DllCall("user32.dll", "bool", "GetWindowInfo", "hwnd", $aWin[$i], "struct*", $tInfo)

		_GDIPlus_RegionCombineRect($hRegion_Win, $tInfo.Win(1), $tInfo.Win(2), $tInfo.Win(3) - $tInfo.Win(1), $tInfo.Win(4) - $tInfo.Win(2), 0)
		_GDIPlus_RegionCombineRect($hRegion_Client, $tInfo.Client(1), $tInfo.Client(2), $tInfo.Client(3) - $tInfo.Client(1), $tInfo.Client(4) - $tInfo.Client(2), 0)

		_GDIPlus_RegionCombineRegion($hRegion_Win, $hRegion_Cut, 4)
		_GDIPlus_RegionCombineRegion($hRegion_Client, $hRegion_Cut, 4)



		$iScans = DllCall($ghGDIPDll, "int", "GdipGetRegionScansCount", "handle", $hRegion_Win, "uint*", 0, "handle", $hMatrix)[2]
		$tScans = DllStructCreate("float Pnt[" & $iScans * 4 & "]")
		DllCall($ghGDIPDll, "int", "GdipGetRegionScans", "handle", $hRegion_Win, "struct*", $tScans, "int*", $iScans, "handle", $hMatrix)
		_GDIPlus_PathReset($hPath)
		For $j = 0 To $iScans - 1
			$iOff = $j * 4 + 1
			_GDIPlus_PathAddRectangle($hPath, $tScans.Pnt(($iOff)), $tScans.Pnt(($iOff + 1)), $tScans.Pnt(($iOff + 2)) + 0.1, $tScans.Pnt(($iOff + 3)) + 0.1)
		Next
		_GDIPlus_PathWindingModeOutline($hPath)

		_Lemming_WorldPath2Lines($aLEM_HZ, $aLEM_VT, $hPath, $i)
		_GDIPlus_PathAddPath($tWorld.Path, $hPath)




		$iScans = DllCall($ghGDIPDll, "int", "GdipGetRegionScansCount", "handle", $hRegion_Client, "uint*", 0, "handle", $hMatrix)[2]
		$tScans = DllStructCreate("float Pnt[" & $iScans * 4 & "]")
		DllCall($ghGDIPDll, "int", "GdipGetRegionScans", "handle", $hRegion_Client, "struct*", $tScans, "int*", $iScans, "handle", $hMatrix)
		_GDIPlus_PathReset($hPath)
		For $j = 0 To $iScans - 1
			$iOff = $j * 4 + 1
			_GDIPlus_PathAddRectangle($hPath, $tScans.Pnt(($iOff)), $tScans.Pnt(($iOff + 1)), $tScans.Pnt(($iOff + 2)) + 0.1, $tScans.Pnt(($iOff + 3)) + 0.1)
		Next
		_GDIPlus_PathWindingModeOutline($hPath)

		_Lemming_WorldPath2Lines($aLEM_HZ, $aLEM_VT, $hPath, $i)
		_GDIPlus_PathAddPath($tWorld.Path, $hPath)

		_GDIPlus_RegionCombineRect($hRegion_Cut, $tInfo.Win(1), $tInfo.Win(2), $tInfo.Win(3) - $tInfo.Win(1), $tInfo.Win(4) - $tInfo.Win(2), 2)
	Next

	_GDIPlus_RegionDispose($tWorld.Region)
	$tWorld.Region = _GDIPlus_RegionCreateFromPath($tWorld.Path)

	_GDIPlus_RegionDispose($hRegion_Win)
	_GDIPlus_RegionDispose($hRegion_Client)
	_GDIPlus_RegionDispose($hRegion_Cut)
	_GDIPlus_PathDispose($hPath)
	_GDIPlus_MatrixDispose($hMatrix)


	If $cLEM_DRAWWORLD Then _Lemming_WorldDraw($tWorld)
EndFunc   ;==>_Lemming_WorldCalc






Func _Lemming_WorldPath2Lines(ByRef $aHZ, ByRef $aVT, ByRef $hPath, $iIdx)

	Local $iCnt = _GDIPlus_PathGetPointCount($hPath)
	If $iCnt < 2 Then Return

	Local $tData = DllStructCreate("int Cnt; float Pnt[" & $iCnt * 2 & "]; byte Type[" & $iCnt & "];")
	$tData.Cnt = $iCnt
	Local $tStruct = DllStructCreate("int Cnt; ptr Pnts; ptr Types;")
	$tStruct.Cnt = $iCnt
	$tStruct.Pnts = DllStructGetPtr($tData, "Pnt")
	$tStruct.Types = DllStructGetPtr($tData, "Type")
	DllCall($ghGDIPDll, "int", "GdipGetPathData", "handle", $hPath, "struct*", $tStruct)

	Local $iHZ = $aHZ[0][0]
	Local $iVT = $aVT[0][0]
	Local $fXS, $fYS, $fX1, $fY1, $fX2, $fY2, $bHZ
	For $i = 0 To $iCnt - 1
		Switch $tData.Type(($i + 1))
			Case 0
				$fXS = $tData.Pnt(($i * 2 + 1))
				$fYS = $tData.Pnt(($i * 2 + 2))
				$fX2 = $fXS
				$fY2 = $fYS
				ContinueLoop

			Case Else
				$fX1 = $fX2
				$fY1 = $fY2
				$fX2 = $tData.Pnt(($i * 2 + 1))
				$fY2 = $tData.Pnt(($i * 2 + 2))

		EndSwitch

		$bHZ = $fY1 = $fY2 ? True : False

		Switch $bHZ
			Case True
				$iHZ += 1
				If $iHZ >= UBound($aHZ) Then ReDim $aHZ[$iHZ * 2][5]

				$aHZ[$iHZ][1] = $fY1
				$aHZ[$iHZ][3] = $fY1
				$aHZ[$iHZ][4] = $iIdx

				If $fX1 > $fX2 Then
					$aHZ[$iHZ][0] = $fX2
					$aHZ[$iHZ][2] = $fX1
				Else
					$aHZ[$iHZ][0] = $fX1
					$aHZ[$iHZ][2] = $fX2
				EndIf

			Case Else
				$iVT += 1
				If $iVT >= UBound($aVT) Then ReDim $aVT[$iVT * 2][5]

				$aVT[$iVT][0] = $fX1
				$aVT[$iVT][2] = $fX1
				$aVT[$iVT][4] = $iIdx

				If $fY1 > $fY2 Then
					$aVT[$iVT][1] = $fY2
					$aVT[$iVT][3] = $fY1
				Else
					$aVT[$iVT][1] = $fY1
					$aVT[$iVT][3] = $fY2
				EndIf

		EndSwitch


		If $tData.Type(($i + 1)) = 129 Then
			$fX1 = $fX2
			$fY1 = $fY2
			$fX2 = $fXS
			$fY2 = $fYS

			$bHZ = $fY1 = $fY2 ? True : False

			Switch $bHZ
				Case True
					$iHZ += 1
					If $iHZ >= UBound($aHZ) Then ReDim $aHZ[$iHZ * 2][5]

					$aHZ[$iHZ][1] = $fY1
					$aHZ[$iHZ][3] = $fY1
					$aHZ[$iHZ][4] = $iIdx

					If $fX1 > $fX2 Then
						$aHZ[$iHZ][0] = $fX2
						$aHZ[$iHZ][2] = $fX1
					Else
						$aHZ[$iHZ][0] = $fX1
						$aHZ[$iHZ][2] = $fX2
					EndIf

				Case Else
					$iVT += 1
					If $iVT >= UBound($aVT) Then ReDim $aVT[$iVT * 2][5]

					$aVT[$iVT][0] = $fX1
					$aVT[$iVT][2] = $fX1
					$aVT[$iVT][4] = $iIdx

					If $fY1 > $fY2 Then
						$aVT[$iVT][1] = $fY2
						$aVT[$iVT][3] = $fY1
					Else
						$aVT[$iVT][1] = $fY1
						$aVT[$iVT][3] = $fY2
					EndIf
			EndSwitch

		EndIf

	Next

	$aHZ[0][0] = $iHZ
	$aVT[0][0] = $iVT

EndFunc   ;==>_Lemming_WorldPath2Lines





Func _Lemming_WorldEnumProc($hWnd, $lParam)
	If _WinAPI_IsWindowVisible($hWnd) Then
		Local $iStyle = _WinAPI_GetWindowLong($hWnd, 0xFFFFFFEC);$GWL_EXSTYLE
		If Not BitAND($iStyle, 0x00080000) And Not BitAND($iStyle, 0x00000020) Then ;$WS_EX_LAYERED / $WS_EX_TRANSPARENT
			$sLEM_WINLIST &= ";" & String($hWnd)
		EndIf
	EndIf
	Return True
EndFunc   ;==>_Lemming_WorldEnumProc



Func _Lemming_WorldUpdateWinList(ByRef $tWorld)
	If Not IsDllStruct($tWorld) Then Return
	If Not $tWorld.Update Then Return

	$sLEM_WINLIST = ""
	Local $Ret = DllCall("user32.dll", "bool", "EnumWindows", "ptr", DllCallbackGetPtr($tWorld.EnumProc), "lparam", 0)

	$tWorld.Update = 0
EndFunc   ;==>_Lemming_WorldUpdateWinList





Func _Lemming_WorldCreate()
	Local $tWorld = DllStructCreate("handle Region; handle Path; hwnd GUI; hwnd DC; hwnd BMP; hwnd OBJ; hwnd CDC; handle GFX; byte Update; byte Calc; ptr EventProc; ptr EventHook; ptr EnumProc;")

	$tWorld.Gui = GUICreate("WorldTest", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST, $WS_EX_TRANSPARENT, $WS_EX_TOOLWINDOW))
	$tWorld.DC = _WinAPI_GetDC($tWorld.Gui)
	Local $hBmp = _WinAPI_CreateBitmap(@DesktopWidth, @DesktopHeight)
	Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
	_WinAPI_DeleteObject($hBmp)

	$tWorld.Bmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
	_GDIPlus_BitmapDispose($hBitmap)

	$tWorld.CDC = _WinAPI_CreateCompatibleDC($tWorld.DC)
	$tWorld.OBJ = _WinAPI_SelectObject($tWorld.CDC, $tWorld.BMP)

	$tWorld.GFX = _GDIPlus_GraphicsCreateFromHDC($tWorld.CDC)
	_GDIPlus_GraphicsClear($tWorld.GFX, 0)

	If $cLEM_DRAWWORLD Then
		GUISetState(@SW_SHOWNOACTIVATE, $tWorld.Gui)
	Else
		GUISetState(@SW_HIDE, $tWorld.Gui)
	EndIf



	$tWorld.Region = _GDIPlus_RegionCreate()
	$tWorld.Path = _GDIPlus_PathCreate()

	$tWorld.EnumProc = DllCallbackRegister("_Lemming_WorldEnumProc", "bool", "hwnd;lparam")

	$tWorld.EventProc = DllCallbackRegister("_Lemming_WorldWinEventProc", "none", "hwnd;uint;hwnd;int;int;uint;uint")
	$tWorld.EventHook = _WinAPI_SetWinEventHook(0x00008001, 0x0000800B, DllCallbackGetPtr($tWorld.EventProc), 0, 0, BitOR($WINEVENT_OUTOFCONTEXT, $WINEVENT_SKIPOWNPROCESS))

	Return $tWorld
EndFunc   ;==>_Lemming_WorldCreate


Func _Lemming_WorldDispose(ByRef $tWorld)
	If Not IsDllStruct($tWorld) Then Return

	_WinAPI_UnhookWinEvent($tWorld.EventHook)
	DllCallbackFree($tWorld.EventProc)
	DllCallbackFree($tWorld.EnumProc)

	_GDIPlus_RegionDispose($tWorld.Region)
	_GDIPlus_PathDispose($tWorld.Path)

	_GDIPlus_GraphicsDispose($tWorld.GFX)
	_WinAPI_SelectObject($tWorld.CDC, $tWorld.OBJ)
	_WinAPI_DeleteObject($tWorld.BMP)
	_WinAPI_DeleteDC($tWorld.CDC)
	_WinAPI_ReleaseDC($tWorld.Gui, $tWorld.DC)

	GUIDelete($tWorld.Gui)
	$tWorld = 0
EndFunc   ;==>_Lemming_WorldDispose






Func _Exit()
	_Lemming_WorldDispose($tLEM_WORLD)
	For $i = 0 To $cLEM_MAX - 1
		_Lemming_Dispose($aLEM[$i])
	Next
	_Lemming_SpritesDispose($tLEM_SPRITES_WALK)
	_Lemming_SpritesDispose($tLEM_SPRITES_CLIMB)
	_Lemming_SpritesDispose($tLEM_SPRITES_FALL)

	_GDIPlus_Shutdown()

	Exit
EndFunc   ;==>_Exit
