Code: Select all
'Matrix Code Rain coded by UEZ v1.41 build 2018-10-18
'Windows only!
#Include "fbgfx.bi"
#Include "string.bi"
#Include "windows.bi"
#Ifdef __Fb_64bit__
#Inclib "gdiplus"
#Include Once "win/gdiplus-c.bi"
#Else
#Include Once "win/gdiplus.bi"
Using gdiplus
#Endif
Declare Function RandomRange(fStart as Single, fEnd as Single) as Single
Declare Function RestoreMemImage() As Any Ptr
Declare Function Base91Decode(sString As String, Byref iBase91Len As Ulong) As Ubyte Ptr
Declare Function _GDIPlus_BitmapCreateFromMemory2(aBinImage As Ubyte Ptr, iLen As Ulong, bBitmap_GDI As Bool = False) As Any Ptr
Declare Function Regulate(Byval MyFps As Long, Byref fps As UShort) As Long
Using FB
#Define unicode
Dim As Integer iRet = MessageBox(Null, "Run in fullscreen mode?", "Question", MB_YESNO Or MB_ICONQUESTION Or MB_TOPMOST)
Dim As Integer dw, dh, iScreenParam = 0
ScreenInfo dw, dh
Dim As Boolean bFullscreen = False
Dim As UShort iW, iH
If iRet = IDYES Then
iW = dw \ 2
iH = dh \ 2
bFullscreen = False
iScreenParam = GFX_FULLSCREEN Or GFX_NO_FRAME
Else
dw = 800
iW = 800
dh = 500
iH = 500
Endif
Dim Shared gdipToken As ULONG_PTR
Dim Shared GDIp As GdiplusStartupInput
GDIp.GdiplusVersion = 1
If GdiplusStartup(@gdipToken, @GDIp, NULL) <> 0 Then End
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS)
Dim As String sTitle = "The MATRIX v1.41 by UEZ"
Dim As Single fFontSize = 7.5, fPosX
Dim As UShort iFPS = 0, iW_Char = Cushort(fFontSize * 1.6666), iH_Char = Cushort(fFontSize * 1.6666), iAmountChars = 256, iMaxSpeed = 6, iMinSpeed = 2, i
Screencontrol FB.SET_DRIVER_NAME, "GDI"
Screenres dw, dh, 32, 1, GFX_HIGH_PRIORITY Or GFX_NO_SWITCH Or iScreenParam
Windowtitle sTitle
Dim As HWND hHWND
Screencontrol(FB.GET_WINDOW_HANDLE, Cast(Integer, hHWND))
Dim as GpRectF tLayout1, tLayout2
tLayout1.x = 0
tLayout1.y = 0
tLayout1.width = iW_Char
tLayout1.height = iH_Char
tLayout2.x = 0
tLayout2.y = 0
tLayout2.width = iW_Char
tLayout2.height = iH_Char
Dim As BITMAPINFO tBITMAP
With tBITMAP.bmiheader
.biSize = Sizeof(BITMAPINFOHEADER)
.biWidth = iW
.biHeight = -iH
.biPlanes = 1
.biBitCount = 32
.biCompression = BI_RGB
End With
Dim As ULong Ptr aBitmap, aBitmap2, aBitmap3
Dim As Any Ptr hDC = GetDC(hHWND), _
hHBitmap = CreateDIBSection(hDC, @tBITMAP, DIB_RGB_COLORS, @aBitmap, NULL, NULL), _
hDC_backbuffer = CreateCompatibleDC(hDC), _
hHBitmap2 = CreateDIBSection(hDC, @tBITMAP, DIB_RGB_COLORS, @aBitmap2, NULL, NULL), _
hDC_backbuffer2 = CreateCompatibleDC(hDC), _
hCanvas, hCanvas2, hBrush_Clr, hBrush_Char, hBrush_CharGlow, hBrush_CharGlow2, hBrush_Bg, hFamily, hFont, hFont_Glow, hStringFormat, hGfx
Var hDC_obj = SelectObject(hDC_backbuffer, hHBitmap), hDC_obj2 = SelectObject(hDC_backbuffer2, hHBitmap2)
GdipCreateFromHDC(hDC_backbuffer, @hCanvas)
GdipCreateFromHDC(hDC_backbuffer2, @hCanvas2)
GdipSetSmoothingMode(hCanvas, SmoothingModeAntiAlias)
GdipSetPixelOffsetMode(hCanvas, PixelOffsetModeHalf)
GdipSetTextRenderingHint(hCanvas, TextRenderingHintAntiAlias)
GdipSetSmoothingMode(hCanvas2, SmoothingModeAntiAlias)
GdipSetPixelOffsetMode(hCanvas2, PixelOffsetModeHalf)
GdipSetTextRenderingHint(hCanvas2, TextRenderingHintAntiAlias)
GdipCreateStringFormat(0, 0, @hStringFormat)
GdipCreateFontFamilyFromName("Times New Roman", Null, @hFamily)
GdipCreateFont(hFamily, fFontSize, 1, 3, @hFont)
GdipCreateFont(hFamily, iW_Char, 1, 3, @hFont_Glow)
GdipSetStringFormatAlign(hStringFormat, StringAlignmentCenter)
GdipSetStringFormatLineAlign(hStringFormat, StringAlignmentCenter)
GdipCreateSolidFill(&h0D000000, @hBrush_Clr)
GdipCreateSolidFill(&hE8E8FFE8, @hBrush_Char)
GdipCreateLineBrushFromRectWithAngle(@tLayout2, &h1000FF00, &hE0A0FFA0, 0, False, 1, @hBrush_CharGlow)
GdipSetLineSigmaBlend(hBrush_CharGlow, 0.5, 1)
GdipSetLineGammaCorrection(hBrush_CharGlow, True)
GdipCreateHatchBrush(9, &hF0003800, &hFF000000, @hBrush_Bg)
GdipCreateSolidFill(&hF0FFD0D0, @hBrush_CharGlow2)
Dim As String sFPS
Dim hFont_FPS As HFONT = CreateFont(12, 0, 0, 0, 0, 0, 0, 0,_
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,_
DEFAULT_PITCH, "Times New Roman")
Var hObjOld_FPS = SelectObject(hDC_backbuffer2, hFont_FPS)
SetTextColor(hDC_backbuffer2, &hF8F8F8)
SetBkMode(hDC_backbuffer2, TRANSPARENT)
Dim tRect As RECT
tRect.Left = 2
tRect.Top = 2
tRect.Right = 30
tRect.Bottom = 15
Dim As Any Ptr hIA, hCanvas3, hHBitmap3Mem, hDC_backbuffer3, hBitmap3Mem = RestoreMemImage()
Dim tMatrix as ColorMatrix
tMatrix.m(0, 0) = 1
tMatrix.m(1, 1) = 1
tMatrix.m(2, 2) = 1
tMatrix.m(3, 3) = 0.0125
tMatrix.m(4, 4) = 1
GdipCreateImageAttributes(@hIA)
GdipSetImageAttributesColorMatrix(hIA, 0, 1, @tMatrix, 0, 0)
hHBitmap3Mem = CreateDIBSection(hDC, @tBITMAP, DIB_RGB_COLORS, @aBitmap3, NULL, NULL)
hDC_backbuffer3 = CreateCompatibleDC(hDC)
Var hDC_obj3 = SelectObject(hDC_backbuffer3, hHBitmap3Mem)
Dim as Single iW2, iH2, iPosY
GdipGetImageDimension(hBitmap3Mem, @iW2, @iH2)
iPosY = iH2 - iH
iPosY = Iif(iPosY >= 0, 0, iPosY)
GdipCreateFromHDC(hDC_backbuffer3, @hCanvas3)
GdipDrawImageRectRect(hCanvas3, hBitmap3Mem, 0, 0, iW, iH, 0, iPosY, iW, iH, 2, hIA, 0, 0)
GdipDeleteGraphics(hCanvas3)
GdipDisposeImage(hBitmap3Mem)
GdipDisposeImageAttributes(hIA)
Type tTable
x As Single
y As Single
vy As Single
c As integer
End Type
Dim As tTable aTable(0 To iAmountChars)
For i = 0 To iAmountChars - 1
fPosX = Rnd() * (iW - iW_Char)
aTable(i).x = fPosX
aTable(i).y = -fFontSize - RandomRange(10, 200)
aTable(i).vy = RandomRange(iMinSpeed, iMaxSpeed)
aTable(i).c = aTable(i).y - iH_Char - 1
Next
GdipGraphicsClear(hCanvas, &hFF000000)
Dim As Ushort iLen = 55, iChar = 0
Dim As Wstring * 2 aChars(iLen)
For i = 0 To iLen
aChars(i) = WChr(i + 65382)
Next
Dim As WString * 2 sChar = aChars(0)
Type tPrePaintedChars
hBitmap As Any Ptr
End Type
Dim As tPrePaintedChars aChars_pre(iLen, 3)
For i = 0 To iLen
GdipCreateBitmapFromScan0(iW_Char, iH_Char, 0, PixelFormat32bppARGB, 0, @aChars_pre(i, 0).hBitmap)
GdipGetImageGraphicsContext(aChars_pre(i, 0).hBitmap, @hGfx)
GdipSetPixelOffsetMode(hGfx, PixelOffsetModeHalf)
GdipSetTextRenderingHint(hGfx, TextRenderingHintAntiAlias)
GdipSetSmoothingMode(hGfx, SmoothingModeAntiAlias)
GdipDrawString(hGfx, aChars(i), -1, hFont_Glow, @tLayout1, hStringFormat, hBrush_CharGlow)
GdipDeleteGraphics(hGfx)
GdipCreateBitmapFromScan0(iW_Char, iH_Char, 0, PixelFormat32bppARGB, 0, @aChars_pre(i, 1).hBitmap)
GdipGetImageGraphicsContext(aChars_pre(i, 1).hBitmap, @hGfx)
GdipSetPixelOffsetMode(hGfx, PixelOffsetModeHalf)
GdipSetTextRenderingHint(hGfx, TextRenderingHintAntiAlias)
GdipSetSmoothingMode(hGfx, SmoothingModeAntiAlias)
GdipDrawString(hGfx, aChars(i), -1, hFont, @tLayout1, hStringFormat, hBrush_Char)
GdipDeleteGraphics(hGfx)
GdipCreateBitmapFromScan0(iW_Char, iH_Char, 0, PixelFormat32bppARGB, 0, @aChars_pre(i, 2).hBitmap)
GdipGetImageGraphicsContext(aChars_pre(i, 2).hBitmap, @hGfx)
GdipSetPixelOffsetMode(hGfx, PixelOffsetModeHalf)
GdipSetTextRenderingHint(hGfx, TextRenderingHintAntiAlias)
GdipSetSmoothingMode(hGfx, SmoothingModeAntiAlias)
GdipDrawString(hGfx, aChars(i), -1, hFont, @tLayout1, hStringFormat, hBrush_CharGlow2)
GdipDeleteGraphics(hGfx)
Next
Dim As Long c = 250, bDisplay = -1
If iRet = IDYES Then Setmouse(-1, -1, 0)
Dim As Double fTimer = Timer
Do
GdipFillRectangle(hCanvas2, hBrush_Bg, 0, 0, iW, iH)
GdipFillRectangle(hCanvas, hBrush_Clr, 0, 0, iW, iH)
For i = 0 To iAmountChars - 1
If aTable(i).y - aTable(i).c > iH_Char Then
If aTable(i).x > 0 And aTable(i).y > 0 And aTable(i).x < (iW - fFontSize) And aTable(i).y < (iH - fFontSize) And c > 750 Then
If aBitmap3[CUlng(aTable(i).x) + CUlng(aTable(i).y) * iW] > 0 then
GdipDrawImageRect(hCanvas, aChars_pre(iChar, 2).hBitmap, aTable(i).x, aTable(i).y, iW_Char, iH_Char)
Else
GdipDrawImageRect(hCanvas, aChars_pre(iChar, 0).hBitmap, aTable(i).x, aTable(i).y, iW_Char, iH_Char)
End If
Else
GdipDrawImageRect(hCanvas, aChars_pre(iChar, 0).hBitmap, aTable(i).x, aTable(i).y, iW_Char, iH_Char)
End If
aTable(i).c = aTable(i).y
Endif
iChar = Cushort(Rnd() * iLen)
GdipDrawImageRect(hCanvas2, aChars_pre(iChar, 0).hBitmap, aTable(i).x, aTable(i).y, iW_Char, iH_Char)
GdipDrawImageRect(hCanvas2, aChars_pre(iChar, 1).hBitmap, aTable(i).x, aTable(i).y, iW_Char, iH_Char)
aTable(i).y += aTable(i).vy
If aTable(i).y > iH Then
aTable(i).x = Rnd() * (iW - iW_Char)
aTable(i).y = -fFontSize - 1
aTable(i).vy = RandomRange(iMinSpeed, iMaxSpeed)
aTable(i).c = aTable(i).y - iH_Char - 1
EndIf
Next
c += 1
If c Mod 1000 = 0 Then bDisplay *= -1
If bDisplay = 1 Then BitBlt(hDC_backbuffer, 0, 0, iW, iH, hDC_backbuffer3, 0, 0, SRCPAINT)
BitBlt(hDC_backbuffer2, 0, 0, iW, iH, hDC_backbuffer, 0, 0, SRCPAINT)
DrawText(hDC_backbuffer2, StrPtr(sFPS), -1, @tRect, DT_SINGLELINE)
StretchBlt(hDC, 0, 0, dw, dh, hDC_backbuffer2, 0, 0, iW, iH, SRCCOPY)
If(Timer - fTimer > 0.99) Then
sFPS = Str(Format(iFPS, "0#")) & " fps"
fTimer = Timer
Endif
Sleep Regulate(30, iFPS), 1
Loop Until Len(Inkey())
'GDI
SelectObject(hDC_backbuffer, hDC_obj)
DeleteDC(hDC_backbuffer)
DeleteObject(hHBitmap)
SelectObject(hDC_backbuffer2, hDC_obj2)
DeleteDC(hDC_backbuffer2)
DeleteObject(hHBitmap2)
SelectObject(hDC_backbuffer3, hDC_obj3)
DeleteObject(hDC_backbuffer3)
DeleteObject(hHBitmap3Mem)
SelectObject(hDC_backbuffer2, hObjOld_FPS)
DeleteObject(hFont_FPS)
ReleaseDC(hHWND, hDC)
'GDIPlus
For i = 0 To iLen
GdipDisposeImage(aChars_pre(i, 0).hBitmap)
GdipDisposeImage(aChars_pre(i, 1).hBitmap)
Next
GdipDeleteBrush(hBrush_Clr)
GdipDeleteBrush(hBrush_Char)
GdipDeleteBrush(hBrush_CharGlow)
GdipDeleteBrush(hBrush_CharGlow2)
GdipDeleteBrush(hBrush_Bg)
GdipDeleteFont(hFont)
GdipDeleteFont(hFont_Glow)
GdipDeleteFontFamily(hFamily)
GdipDeleteStringFormat(hStringFormat)
GdipDeleteGraphics(hCanvas)
GdipDeleteGraphics(hCanvas2)
GdiplusShutdown(gdipToken)
Setmouse(-1, -1, 1)
Function RandomRange(fStart as Single, fEnd as Single) as Single
Return Rnd() * (fEnd - fStart) + fStart
End Function
Function Regulate(Byval MyFps As Long, Byref fps As uShort) As Long 'code by dodicat
Static As Double timervalue, _lastsleeptime, t3, frames
Var t = Timer
frames+=1
If (t-t3) >= 1 Then t3 = t : fps = frames : frames = 0
Var sleeptime = _lastsleeptime + ((1 / myfps) - T + timervalue) * 1000
If sleeptime < 1 Then sleeptime = 1
_lastsleeptime=sleeptime
timervalue=T
Return sleeptime
End Function
Function RestoreMemImage() As Any Ptr
'decompress base91 encoded image
Dim As Ulong iLines, bCompressed, iFileSize, iCompressedSize
Dim As String sBaseType, sBase91, aB91(1)
Restore __Neo:
Read iLines
Read bCompressed
Read iFileSize
Read iCompressedSize
Read sBaseType
For i As Ushort = 0 To iLines - 1
Read aB91(0)
sBase91 &= aB91(0)
Next
Dim As Ulong iLenB91
Static As Ubyte Ptr aBinary
aBinary = Base91Decode(sBase91, iLenB91)
Return _GDIPlus_BitmapCreateFromMemory2(@aBinary[0], iLenB91)
End Function
Function Base91Decode(sString As String, Byref iBase91Len As Ulong) As Ubyte Ptr
Dim As String sB91, sDecoded
sB91 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~´" '´ instead of "
Dim As Long i, n = 0, c, b = 0, v = -1
Dim aChr(0 To Len(sString) - 1) As String
For i = 0 To Ubound(aChr)
aChr(i) = Mid(sString, i + 1, 1)
Next
For i = 0 To Ubound(aChr)
c = Instr(sB91, aChr(i)) - 1
If v < 0 Then
v = c
Else
v += c * 91
b = b Or (v Shl n)
n += 13 + (((v And 8191) <= 88) * -1)
Do Until (n > 7)=0
sDecoded &= Chr(b And 255)
b = b Shr 8
n -= 8
Loop
v = -1
Endif
Next
If (v + 1) Then
sDecoded &= Chr((b Or (v Shl n)) And 255)
End If
iBase91Len = Len(sDecoded)
Static As Ubyte aReturn(0 To Len(sDecoded))
For i = 0 To Len(sDecoded) - 1 'convert result String To ascii code values
aReturn(i) = Asc(sDecoded, i + 1)
Next
Return @aReturn(0) 'Return Pointer To the array
End Function
Function _GDIPlus_BitmapCreateFromMemory2(aBinImage As Ubyte Ptr, iLen As Ulong, bBitmap_GDI As Bool = False) As Any Ptr
Dim As HGLOBAL hGlobal
Dim As LPSTREAM hStream
Dim As Any Ptr hBitmap_Stream
Dim As Any Ptr hMemory = GlobalAlloc(GMEM_MOVEABLE, iLen)
Dim As Any Ptr lpMemory = GlobalLock(hMemory)
RtlCopyMemory(lpMemory, @aBinImage[0], iLen)
GlobalUnlock(hMemory)
CreateStreamOnHGlobal(hMemory, 0, @hStream)
GdipCreateBitmapFromStream(hStream, @hBitmap_Stream)
IUnknown_Release(hStream)
If bBitmap_GDI = TRUE Then
Dim hBitmap_GDI As Any Ptr
GdipCreateHBITMAPFromBitmap(hBitmap_Stream, @hBitmap_GDI, &hFF000000)
GdipDisposeImage(hBitmap_Stream)
Return hBitmap_GDI
Endif
Return hBitmap_Stream
End Function
'Generated by FB File2Bas Code Generator v0.75 build 2018-02-22 beta by UEZ
__Neo:
Data 7,0,4660,5726,"Base91"
Data "vuk:eJs4+BAAN/<MCG4DC´CtAAQAHCGAAA$$dD%UAAdZDHa7vBBtVA9D&´.A5GWvSAAAFt´cc2CA}@XTDA~F$bucX7YItpqCCAAAC´f^p][cBAAAAAAAp1A>VoyeH[yIlj,7^qs$dZ5W_9+D4?.j|r$WA@zBE.p)<t7[GCXR!Ih1T8+qF88]9Pq[XVP)}JK_sZ[dAt`KeHQ4}3}bRlhg7|u+a)mkLj[sQ6INaNzw#Q|y.*^?t.)?oN^*$^|~t^*!*N6<p;}S_1RxjWr$L1CzdC4l:klsd+{;<~ss]Cs~1zhAc_infy#HU`Fk`hyLq|Flxf.LJoO3^&Vvi}fIq+2<txK`}Pl6Hq9~})X9#q{Cje{b9|ympJaVsuD~<s:#Wj@#gzU>Uj%@QaiUZqrSJn[$eOUZdDy*JoE)A~,#m#YqL!=ML<!]:DVj]a^NUe+y&pR`T&4omRm&KLyp!.,M[Whf)vph´=1p9e0v+yf,LCRG//{8gph,V3vgvP4,/3}gUUn#wIz_r{VXR!Xf>,´:L$3VCLea:M|&}&KJ!*Jr:}rn70[#WEiDbM*]JgN&^`sYD1Gr:{h95DX+J>o0OP<w1.{PM/[Doz,|U@5ZZ4?Vo~Mr,Mt]AwbA{MYq]~z&Hs3gv(;GT<Z|}c(Lj68n5)=o|_F#jXf=VCS9A<x<x9<@d^´^uwWzTuu3bQPvt:=pK;gGI+JYt=Jsh!=5>{{M}ZS8~)mT@XTCN)#i^k|:7C&In,Uj4TA?:8fh@T#=KVn[5d`C2liw´zMPvY)Kd#Sv´e&LGz.)vq´!X`glLG?´q=FSv5rXnT!?rS=7LG2;xNdBG%)5a>>]G40MQzJ/K}tMa;R5[a_?z|5a%MAkM&kd}P>M#.k9lq^HK`KPPS#/?´ayRxI8:)m.gw}9"
Data "e!7PCc3}8W)cBxq:K>NZdM_fBa4N81TVTPq[mWxg?d2Tbz~$)5`H{pRd6CjeBx9pkHbzsf(Ly>G:WqOi|updtocyW&`~icnzEWk(UMqH`C+l=SuK8dlP`3Rj|JXp//JX1rFsk%^):ID{D*wN}^EezKCJEl8P7R~/(|bQW_g#f;q}P3TVfx5DQzA(t_b5|HqduIZ33YY2,:c^v{11E_dUQOT(vCsd+hbFwc´wK]=kZcPX&j?ug<BW;_)uO6q#$YLUmq´H^0=Xg5xCl!uQims;ID=q?Sj}5MQC:P>T9e0k+,Br(ry_`@svwkU)#%m3;&vp;_(lbMO6Z)(coIT;Y./DX+H?M^)LcQGaru;_´E}_N}[fajWqqSUe?HXMN&GJt$}8j;H/sK8Aowz0vc%LQ)Tylh@n|8+#+2<#{FG)QZ,u´GF!bR>eY^i!CX*2nno>9dWMMVs)[w%VCyK}7xd+YXp,U@.~GxM.E]c@<t´?v$b|8jW)~_,s40juh%hX(rp+vRkg:5~a]&uIt{vs9E+40.l~08N91q[y´b!:n+M[eE&_/c/rtIfQ=Fe$;H7Aw}U0Vs%~*)XRFoE3?G>b=otilz<RWBqqk;!<I{_qt;DFgaWF&6^34?>S8jKoBr/*.5MK_%XP/k*yhDjyZJ#MKR&BZ^nyPUi^!,Tjda`z48{pZ5Zq%@r}{k9o7RmitDwEHH{TMzP,pp|>FemZf||%;6g)B%1J`^RyHU#.TkcWjRe9^$@$.%#lB^Ok,ugEd2dNwwfUH:5L8VPy!=}FlXb@wZB&xD?j~C326jL`5RXs=S<4C/XQ9P>ya24JJXz<E]viB_&Dfz&&G[~u4!k6Q´){wYhXk%hXKk)8[oNv|Q[Z@PkaZ>%Xbzr1g#!!B>hi|xSVp;VsPPs7[GWm"
Data "2>xi8yn%9&s%:j/>^Jfi$VFNUYB2BOaSX?(#sia2;:Q#(2qC~c(Lv`{SLCY*D.`f>C~6n2D*H+_XGx#Q(Qd[(]SdI.6kM>6A@Oph´m=bQ5e%p3ow12R!7$ZDtkBami~(,?8C6nEdzq].JKO4YuJXY9R5TAapVXu)KW>bZ/my.5t~&}!?,GDS1,>deaR//DW5R}kCV*eNQSF;t^TPj(O/*:I[F;9ZiHD>U(IHp;l{jDRJ<1NxgS%4^Yu}t1|6l?!glqs7h8BqlO`bc#*8E`Rbq,~)s:2^SR~Ey4/VyGh{i2=,&GsR|rL//Dy1W/V=TKiAG+>;`vDs671brnab;P^~dG3{O]bRH>JtD~;f1Vm]>E[]PTwk|uc)9N4&XM/,l(omjqZni.q@?98Q[yKrA.m:XyhO!_Mx&5|qqg1V?K$VKh_~0{j`:,M(&VA>16fbAv!a7=P$U!l`aiu;Z*=e{vP.!KT;W_etA!1g8klbA,paF´]<´rv}@_w<_k<ua/d!y;`P;bnF{n4TK+vCEgRQ~b{Rf{7bQ/XXqB7fIv~=z<+I}Qf+&uo]=V91}`,|g:a*´k_]}yOEepY=q%2iDth*otWE´1^bE#WI%a>aO_4l$p;+$]d(dD}Xc#OE>%OYB_z&ljR2#XIvX#Te&,OH(GYh+LF>Rk5^WZ5kT,{aB)O`J$(w/i%LCRB*/&9~v<;2B.;2L6L´i6>f/Lk/T]?1,EG?}I´Qo_Ebso)´NvN@ZZIv,fnjkN´ynt77njB?*n&v9H/Sqj>#eE[$zYkkg+2Sj}QrWRY%~&Pq^a´178VOoNTxpwMRE}+w{[Cb=Fc$<,>abhXjjV&$rS4^PgN6N[ns@.xmNZCKdIGUF26dZInFb5C_$}kN@^jPHSaM6QphBUa+@bmplxigph:2"
Data "&&sns;SuS;tKJ4Y#T+VydxSfQr0|VHCnDtu2Xqk(7Q84~1%t=a{+P~r,nwK#Y:,yD?}|#~dozq!_wnTk3buP}pMf*2.g9iB*x9g]MzS^H/bhYIb@6]Uj,,^^QK;[w_i`kol!rVM(*8[elzLQL%6QD^Tx´u*Q$6IIe5P.s:v/?e%w,Mb}KU.yrztI_qs)5/MV4$WEba;<Y|EG9Iw{i{/NHsgj#v´tJSl~++q#s:lVE8]Fa)SumD`,mE{%RC0hK49Inxu@O5[3a`_%´)Zu3$p^D9;_NP](´|]tLi$`{W{_}BizAyk1i!TFlsohSo5VIGypR`2=9Ul>SHpZYqDDHx6f,LmKH)`YYv//;1ip3~oV_u)ha%>?I$/ZMS[h6y&$(,}Gf)LYF0Cb3;,w8GlXAv2a8LzEd}Z,D:)KTN&2&6@mOMh~V%y|Rg`*H´%@Vgz|.OPh8h)i^^ZGcsL(YRdsrpUy{´G_{^EMOWe(E5:@y|0,:M$ED3#>LRyk1#:VO@NX1P,`y5.IFC,^$Ue(q´13bxz[{5_|Ma@j$J<%VLq8YARv>x!}G7k%/HZ|]]2!!rbW`X4aKcEKkVvHBwJ`le`m!5q82g!+`lzB*kM!;@sh2T:K?dWig´nW9D_wY4>!3{4T}*thVC^HL?RW^Bm´|;EPA&E^H/Ryov´I`Rt14MP(*I}Q]D.B^Z+9g%D6MA*F^Ko6,`]@JIIA6k0P]>Y9:!^9Tw#5SmW<h:5;x:@d{vfS2k)}a_7X@&zND´F.hNp<+sg0/IPRJV8i5$RRs|S5DHb#O{#b^E=>tW]eG5FtEz5*|v!(V>%FDEhL,fai[8rpVd.P?,WOQS]^9xbnGzliAgzI?DDz%[z<L@tWfC_){uI?7SO@:OrAwunZI$QT(q#$!jKR~hy8+!NR"
Data "a;W(OjgI5D@}U&F=6>%0J)|;=F6LQTOsv02}´vGOKi@h6Fu3G(P_(}nJ+!s7p6PunQO&3t%j<P?HVMK_|Q)A*D`HXv&/P=I|($(B´WicnBHaA/,k&J*HF)GOq9t|9tO}?DWAwfS74dbskJ|l@fqL7q7la<t>rd{FDHaErXxtX(M/JP0cscgClNUQL;j41D*(c)33k&CkcKm!>!*Be}6$!jLi:SNC{ia7S[=_SEt]5DC!0(}C@:q(Wd|roHJ*;fDXO[(>P9?9eCGXg2m`cn1eEBjvrP9M+!A/<~O})0wjBt`RJYc+b_M}k/%zZ`CiQvm[9f&hpt[(`:^$l!´W?jmJTNzp$VT,aA_9:CZRv1o9:!#lViGR0IL^Ih|Q5R(H^;&3kvn&Y*SxFA`D1p(Fp(vL?9Jg#j?H1z1$n&s/{N),C´G)P(7+eiw(cidZ=Mp&X,=f0IkwP!sF+|8$,VLA{&[;`0/VEhIdREBk&´`Q`R_[>dgCEANvB.^`MoN)u8@A^Wc@)Nlf_DS<iY>fq)p?4./ZkI)7UJ.qx)*8,4[A.appt7wpq1GOhRExKv)_CXCt~Ar#GB2~b+m@nB2t+Sb{^elfe5v(gCFja>+LtDKC`g=/u4b&H.mhhtJANNF`BH9]k4`B_w%IAJ@qr0J)]QdJl)7^5>c=p(~H$Dx#!h5H>~4~B87*8CHz2O/|_4NrnP|a0&tr~Hi6euYPtw8XlBe!lfkK*]AZCkYPaELOvLn!}lMw3}Z(6$O&&k<gFAbR8OW,8G.AQu0D]*a|rA`s`~8dZlAIg]xMDsMtw(ka+:b~yWyI3YEPL<R}rA{~>syDgEj,*hj^f_!KZHrPsq66?LFR@Act`1h[8h<CV,7FtIaWDEph9>I1/s,c&:|t%b`Udju~yIj+AFmB"
Data "2h;!:)8>8Qc?Gb#y|BNH8!^..ThDA!Vx9/V/{nc4`BQ0z85KGofLNcVe4J@=,^;QnX8i0&)F#`0E3U#yTx%KA6]!](Og$.Hc9MuW8NMs4+mtph+`=?zahtBAyiyi7s;|b^h+i@P4<C*hM?q`f(faj%,4Wx|Rp&*yOJ~pvvV)mi`G*}0,ht,%`rbT1p|GNr]Il(EkGW}KLE):uW>:XECAu1NsR^´rq/h:lI=HUU,F1p]?FX>YvFbrtL)lfz[)7sR(o[{7yPa>>TVVmfd2B_C3@COG+^5d8*qs6fr#1jM$O~(.||lI}W48Uh68Dm3Nm[FX+wr=zMR!f:2ylC[wi~py6EfJP2+11m#@[}SEqB64a3_L?/CSLE|B(y2=?CO5#qppw<yDIrNN<e&tE)%/]]vT,iZ,^@dW)FXtlkp&UR~96ps*Du|,[9Y`%,;K*ZKcPomPbgu`T~´pgzX5r*49Rj;SG,G4}BYLX{W|C>lF)8vxE4HoLEHB?(v.Rjm*9]y`tV)FA$iq2IzjP^?<Sk$CxdGf:;Huz7gjp{A>lF5/|:4f1BASESg%KZs8x`Z#PD+GO^w}JkmLAk´y3yJ>~%qS8vOL@CAih[P4k+´_F=WW3I:uY;#}5,;KBNFn|}1rgl>QuO6TUR@q,2u$Hf%{vg@CFTi<4f^c_9FQmFer;fs<uboBJg5{T]U^*if.J{DXr18?1ouL*hj8hKjh^+~^.xk&3`&V*hHrgpTycwI>8&*FHj:(Pu!Kr|CS{^RV^ix}JkPAli93Z~.ebBy>yyVCpQej3{qKux,zB@htL{uKc,><7>TUH,d,3N2~4v=!CXt_=)htz22$NwwScrYyBx[%JyoBqR*`,XJRypezHomP7$ie#>{I:uml(VLZlJ,8BKl+@w0$2R{kX*+^"
Data "dzbtdB1;VC3W]r33(.U!:hc=3LJ2F=dC[I(jY&W6@!xazU~H3p^maz^9#V|FEzf:S+fG)*MK[CETD.buVJzV.Fb}e>zMLP_JSGzlA{´rvqLHx8qpU0AH;q8Rp|V%,yXRx$Fq9*v1!b7k0wJ@$~SB{~>~8/~^b;r$A/X!.q$K3X|<9CaFY>[C+vBokE(@l}B@VRSqKp5h>_3|W+r$dS]QKW;,?,By´|dYsV.F:UX%.FI@hy´|~).{ZhG^,4a!({w:sciVwFeML(TwZ<ZsnLI~3^1xE)Fr2L1X4V+F22<J&#(h8Me43Og#LC2AAAXLhYKMe8#(>C"
Download The MATRIX with sound (much cooler ^^)
Edit1: found a way to add unicode characters. :-)
Edit2: small code update
Edit3: increased FPS by calling timeBeginPeriod / timeEndPeriod WinAPI function -> thanks to dodicat / deltarho[1859]
Edit4: some internal tuning to increase FPS a little more
Edit5: small code update
Edit6: last update