#include-once

Local $onMatrix = False
Local $Words
Local $LabelOutput
Local $Amount
Local $Words
Local $Time
Local $random1
Local $random2
Local $random3
Local $random4

Func _MatrixCreate($nGUI,$aLeft,$aTop,$aAmount,$aHeight,$aColor = 0x00FF00, $aBKColor = 0x0,$aFont = "TERMINAL",$aWords = "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|1|2|3|4|5|6|7|8|9|0", $aTime = 30,$arandom1 = 0,$arandom2 = 50, $arandom3 = 12, $arandom4 = 20)

	$aWords = StringSplit($aWords,"|")

	If Not IsHWnd($nGUI) Then Return SetError(0,0,0)
	If Not IsInt($aLeft) Then Return SetError(1,1,1)
	If Not IsInt($aTop) Then Return SetError(2,2,2)
	If Not IsInt($aAmount) Or $aAmount < 1 Then Return SetError(3,3,3)
	If Not IsInt($aHeight) Or $aHeight < 1 Then Return SetError(4,4,4)
	If Not IsInt($aColor) Then Return SetError(5,5,5)
	If Not IsString($aFont) Then Return SetError(6,6,6)
	If Not IsArray($aWords) Or $aWords[0] = 0 Then Return SetError(7,7,7)
	If Not (IsFloat($aTime) Or IsInt($aTime)) Then Return SetError(8,8,8)
	If Not (IsInt($arandom1) And IsInt($arandom2) And IsInt($arandom3) And IsInt($arandom4)) Then Return SetError(9,9,9)

	Global $Label[$aAmount]
	Global $Position[$aAmount]
	Global $Position2[$aAmount]

	For $i = 0 To $aAmount - 1
		$Position[$i] = 0
		$Position2[$i] = Random($arandom1,$arandom2)
	Next

	GUISwitch($nGUI)

	For $i = 0 To $aAmount - 1
		$Label[$i] = GUICtrlCreateLabel("", ($i * 40) + $aLeft, $aTop, 40, $aHeight)
		GUICtrlSetBkColor($Label[$i],$aBKColor)
		GUICtrlSetColor($Label[$i],$aColor)
		GUICtrlSetFont($Label[$i],12,Default,Default,$aFont)
	Next
	$onMatrix = True
	$Words = $aWords
	$Amount = $aAmount
	$Time = $aTime
	$random1 = $arandom1
	$random2 = $arandom2
	$random3 = $arandom3
	$random4 = $arandom4
EndFunc

Func _MatrixStart($aTime = 30)
	If $onMatrix Then
		AdlibRegister("__aCode",$Time)
	Else
		Return SetError(0,0,0)
	EndIf
EndFunc

Func _MatrixStop()
	If $onMatrix Then AdlibUnRegister("__aCode")
EndFunc

Func _MatrixDelete()
	For $i = 0 To $Amount - 1
		GUICtrlDelete($Label[$i])
	Next
	$onMatrix = False
EndFunc

Func __aCode()
	For $i = 0 To $Amount - 1
		$LabelOutput = ""
		If $Position2[$i] > 0 Then
			For $n = 0 To $Position2[$i]
				$LabelOutput &= @CRLF
			Next
		EndIf
		$Position[$i] += 1
		If $Position[$i] > Random($random3,$random4) Then
			$Position[$i] = 1
			$Position2[$i] = Random($random1,$random2)
		EndIf
		For $n = 0 To $Position[$i]
			If Random(0,1) Then
				$LabelOutput &= $Words[Random(1,$Words[0])] & @CRLF
			Else
				$LabelOutput &= StringUpper($Words[Random(1,$Words[0])]) & @CRLF
			EndIf
		Next
		GUICtrlSetData($Label[$i],$LabelOutput)
	Next
EndFunc